diff options
author | 2021-02-23 23:27:11 +0900 | |
---|---|---|
committer | 2021-02-23 23:28:13 +0900 | |
commit | 2ed27787412a1a1c669988e5b36261fac46988c4 (patch) | |
tree | 049dcd18ca9d086d32f6450e5306fc65d139b586 | |
parent | Linux patch 5.4.99 (diff) | |
download | linux-patches-2ed27787412a1a1c669988e5b36261fac46988c4.tar.gz linux-patches-2ed27787412a1a1c669988e5b36261fac46988c4.tar.bz2 linux-patches-2ed27787412a1a1c669988e5b36261fac46988c4.zip |
Linux patch 5.4.1005.4-102
Signed-off-by: Alice Ferrazzi <alicef@gentoo.org>
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1099_linux-5.4.100.patch | 403 |
2 files changed, 407 insertions, 0 deletions
diff --git a/0000_README b/0000_README index 3e20dc55..d459040a 100644 --- a/0000_README +++ b/0000_README @@ -439,6 +439,10 @@ Patch: 1098_linux-5.4.99.patch From: http://www.kernel.org Desc: Linux 5.4.99 +Patch: 1099_linux-5.4.100.patch +From: http://www.kernel.org +Desc: Linux 5.4.100 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1099_linux-5.4.100.patch b/1099_linux-5.4.100.patch new file mode 100644 index 00000000..66ef0055 --- /dev/null +++ b/1099_linux-5.4.100.patch @@ -0,0 +1,403 @@ +diff --git a/Makefile b/Makefile +index a0491ba1d7593..d0d4beb4f8373 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 99 ++SUBLEVEL = 100 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/arch/arm/xen/p2m.c b/arch/arm/xen/p2m.c +index e52950a43f2ed..fd6e3aafe2724 100644 +--- a/arch/arm/xen/p2m.c ++++ b/arch/arm/xen/p2m.c +@@ -95,8 +95,10 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, + for (i = 0; i < count; i++) { + if (map_ops[i].status) + continue; +- set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT, +- map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT); ++ if (unlikely(!set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT, ++ map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT))) { ++ return -ENOMEM; ++ } + } + + return 0; +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index 296b0d7570d06..1da558f28aa57 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -7104,7 +7104,6 @@ static int svm_register_enc_region(struct kvm *kvm, + region->uaddr = range->addr; + region->size = range->size; + +- mutex_lock(&kvm->lock); + list_add_tail(®ion->list, &sev->regions_list); + mutex_unlock(&kvm->lock); + +diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c +index 0acba2c712ab8..7fe5be8e6d3db 100644 +--- a/arch/x86/xen/p2m.c ++++ b/arch/x86/xen/p2m.c +@@ -716,7 +716,8 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, + unsigned long mfn, pfn; + + /* Do not add to override if the map failed. */ +- if (map_ops[i].status) ++ if (map_ops[i].status != GNTST_okay || ++ (kmap_ops && kmap_ops[i].status != GNTST_okay)) + continue; + + if (map_ops[i].flags & GNTMAP_contains_pte) { +@@ -754,17 +755,15 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, + unsigned long mfn = __pfn_to_mfn(page_to_pfn(pages[i])); + unsigned long pfn = page_to_pfn(pages[i]); + +- if (mfn == INVALID_P2M_ENTRY || !(mfn & FOREIGN_FRAME_BIT)) { ++ if (mfn != INVALID_P2M_ENTRY && (mfn & FOREIGN_FRAME_BIT)) ++ set_phys_to_machine(pfn, INVALID_P2M_ENTRY); ++ else + ret = -EINVAL; +- goto out; +- } +- +- set_phys_to_machine(pfn, INVALID_P2M_ENTRY); + } + if (kunmap_ops) + ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, +- kunmap_ops, count); +-out: ++ kunmap_ops, count) ?: ret; ++ + return ret; + } + EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping); +diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c +index b18f0162cb9c4..208f3eea3641f 100644 +--- a/drivers/block/xen-blkback/blkback.c ++++ b/drivers/block/xen-blkback/blkback.c +@@ -850,8 +850,11 @@ again: + pages[i]->page = persistent_gnt->page; + pages[i]->persistent_gnt = persistent_gnt; + } else { +- if (get_free_page(ring, &pages[i]->page)) +- goto out_of_memory; ++ if (get_free_page(ring, &pages[i]->page)) { ++ put_free_pages(ring, pages_to_gnt, segs_to_map); ++ ret = -ENOMEM; ++ goto out; ++ } + addr = vaddr(pages[i]->page); + pages_to_gnt[segs_to_map] = pages[i]->page; + pages[i]->persistent_gnt = NULL; +@@ -867,10 +870,8 @@ again: + break; + } + +- if (segs_to_map) { ++ if (segs_to_map) + ret = gnttab_map_refs(map, NULL, pages_to_gnt, segs_to_map); +- BUG_ON(ret); +- } + + /* + * Now swizzle the MFN in our domain with the MFN from the other domain +@@ -885,7 +886,7 @@ again: + pr_debug("invalid buffer -- could not remap it\n"); + put_free_pages(ring, &pages[seg_idx]->page, 1); + pages[seg_idx]->handle = BLKBACK_INVALID_HANDLE; +- ret |= 1; ++ ret |= !ret; + goto next; + } + pages[seg_idx]->handle = map[new_map_idx].handle; +@@ -937,17 +938,18 @@ next: + } + segs_to_map = 0; + last_map = map_until; +- if (map_until != num) ++ if (!ret && map_until != num) + goto again; + +- return ret; +- +-out_of_memory: +- pr_alert("%s: out of memory\n", __func__); +- put_free_pages(ring, pages_to_gnt, segs_to_map); +- for (i = last_map; i < num; i++) ++out: ++ for (i = last_map; i < num; i++) { ++ /* Don't zap current batch's valid persistent grants. */ ++ if(i >= last_map + segs_to_map) ++ pages[i]->persistent_gnt = NULL; + pages[i]->handle = BLKBACK_INVALID_HANDLE; +- return -ENOMEM; ++ } ++ ++ return ret; + } + + static int xen_blkbk_map_seg(struct pending_req *pending_req) +diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c +index 9b76cf133d524..3df7ca2357da8 100644 +--- a/drivers/media/usb/pwc/pwc-if.c ++++ b/drivers/media/usb/pwc/pwc-if.c +@@ -147,16 +147,17 @@ static const struct video_device pwc_template = { + /***************************************************************************/ + /* Private functions */ + +-static void *pwc_alloc_urb_buffer(struct device *dev, ++static void *pwc_alloc_urb_buffer(struct usb_device *dev, + size_t size, dma_addr_t *dma_handle) + { ++ struct device *dmadev = dev->bus->sysdev; + void *buffer = kmalloc(size, GFP_KERNEL); + + if (!buffer) + return NULL; + +- *dma_handle = dma_map_single(dev, buffer, size, DMA_FROM_DEVICE); +- if (dma_mapping_error(dev, *dma_handle)) { ++ *dma_handle = dma_map_single(dmadev, buffer, size, DMA_FROM_DEVICE); ++ if (dma_mapping_error(dmadev, *dma_handle)) { + kfree(buffer); + return NULL; + } +@@ -164,12 +165,14 @@ static void *pwc_alloc_urb_buffer(struct device *dev, + return buffer; + } + +-static void pwc_free_urb_buffer(struct device *dev, ++static void pwc_free_urb_buffer(struct usb_device *dev, + size_t size, + void *buffer, + dma_addr_t dma_handle) + { +- dma_unmap_single(dev, dma_handle, size, DMA_FROM_DEVICE); ++ struct device *dmadev = dev->bus->sysdev; ++ ++ dma_unmap_single(dmadev, dma_handle, size, DMA_FROM_DEVICE); + kfree(buffer); + } + +@@ -274,6 +277,7 @@ static void pwc_frame_complete(struct pwc_device *pdev) + static void pwc_isoc_handler(struct urb *urb) + { + struct pwc_device *pdev = (struct pwc_device *)urb->context; ++ struct device *dmadev = urb->dev->bus->sysdev; + int i, fst, flen; + unsigned char *iso_buf = NULL; + +@@ -320,7 +324,7 @@ static void pwc_isoc_handler(struct urb *urb) + /* Reset ISOC error counter. We did get here, after all. */ + pdev->visoc_errors = 0; + +- dma_sync_single_for_cpu(&urb->dev->dev, ++ dma_sync_single_for_cpu(dmadev, + urb->transfer_dma, + urb->transfer_buffer_length, + DMA_FROM_DEVICE); +@@ -371,7 +375,7 @@ static void pwc_isoc_handler(struct urb *urb) + pdev->vlast_packet_size = flen; + } + +- dma_sync_single_for_device(&urb->dev->dev, ++ dma_sync_single_for_device(dmadev, + urb->transfer_dma, + urb->transfer_buffer_length, + DMA_FROM_DEVICE); +@@ -453,7 +457,7 @@ retry: + urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint); + urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; + urb->transfer_buffer_length = ISO_BUFFER_SIZE; +- urb->transfer_buffer = pwc_alloc_urb_buffer(&udev->dev, ++ urb->transfer_buffer = pwc_alloc_urb_buffer(udev, + urb->transfer_buffer_length, + &urb->transfer_dma); + if (urb->transfer_buffer == NULL) { +@@ -516,7 +520,7 @@ static void pwc_iso_free(struct pwc_device *pdev) + if (urb) { + PWC_DEBUG_MEMORY("Freeing URB\n"); + if (urb->transfer_buffer) +- pwc_free_urb_buffer(&urb->dev->dev, ++ pwc_free_urb_buffer(urb->dev, + urb->transfer_buffer_length, + urb->transfer_buffer, + urb->transfer_dma); +diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c +index fa1ac0abc924b..4bfafcd6317f4 100644 +--- a/drivers/net/xen-netback/netback.c ++++ b/drivers/net/xen-netback/netback.c +@@ -1335,13 +1335,11 @@ int xenvif_tx_action(struct xenvif_queue *queue, int budget) + return 0; + + gnttab_batch_copy(queue->tx_copy_ops, nr_cops); +- if (nr_mops != 0) { ++ if (nr_mops != 0) + ret = gnttab_map_refs(queue->tx_map_ops, + NULL, + queue->pages_to_map, + nr_mops); +- BUG_ON(ret); +- } + + work_done = xenvif_tx_submit(queue); + +diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c +index 246864bbb3e4e..e953ea34b3e43 100644 +--- a/drivers/xen/gntdev.c ++++ b/drivers/xen/gntdev.c +@@ -319,44 +319,47 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map) + * to the kernel linear addresses of the struct pages. + * These ptes are completely different from the user ptes dealt + * with find_grant_ptes. ++ * Note that GNTMAP_device_map isn't needed here: The ++ * dev_bus_addr output field gets consumed only from ->map_ops, ++ * and by not requesting it when mapping we also avoid needing ++ * to mirror dev_bus_addr into ->unmap_ops (and holding an extra ++ * reference to the page in the hypervisor). + */ ++ unsigned int flags = (map->flags & ~GNTMAP_device_map) | ++ GNTMAP_host_map; ++ + for (i = 0; i < map->count; i++) { + unsigned long address = (unsigned long) + pfn_to_kaddr(page_to_pfn(map->pages[i])); + BUG_ON(PageHighMem(map->pages[i])); + +- gnttab_set_map_op(&map->kmap_ops[i], address, +- map->flags | GNTMAP_host_map, ++ gnttab_set_map_op(&map->kmap_ops[i], address, flags, + map->grants[i].ref, + map->grants[i].domid); + gnttab_set_unmap_op(&map->kunmap_ops[i], address, +- map->flags | GNTMAP_host_map, -1); ++ flags, -1); + } + } + + pr_debug("map %d+%d\n", map->index, map->count); + err = gnttab_map_refs(map->map_ops, use_ptemod ? map->kmap_ops : NULL, + map->pages, map->count); +- if (err) +- return err; + + for (i = 0; i < map->count; i++) { +- if (map->map_ops[i].status) { ++ if (map->map_ops[i].status == GNTST_okay) ++ map->unmap_ops[i].handle = map->map_ops[i].handle; ++ else if (!err) + err = -EINVAL; +- continue; +- } + +- map->unmap_ops[i].handle = map->map_ops[i].handle; +- if (use_ptemod) +- map->kunmap_ops[i].handle = map->kmap_ops[i].handle; +-#ifdef CONFIG_XEN_GRANT_DMA_ALLOC +- else if (map->dma_vaddr) { +- unsigned long bfn; ++ if (map->flags & GNTMAP_device_map) ++ map->unmap_ops[i].dev_bus_addr = map->map_ops[i].dev_bus_addr; + +- bfn = pfn_to_bfn(page_to_pfn(map->pages[i])); +- map->unmap_ops[i].dev_bus_addr = __pfn_to_phys(bfn); ++ if (use_ptemod) { ++ if (map->kmap_ops[i].status == GNTST_okay) ++ map->kunmap_ops[i].handle = map->kmap_ops[i].handle; ++ else if (!err) ++ err = -EINVAL; + } +-#endif + } + return err; + } +diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c +index 33d6499d84724..32aba2e8c075f 100644 +--- a/drivers/xen/xen-scsiback.c ++++ b/drivers/xen/xen-scsiback.c +@@ -422,12 +422,12 @@ static int scsiback_gnttab_data_map_batch(struct gnttab_map_grant_ref *map, + return 0; + + err = gnttab_map_refs(map, NULL, pg, cnt); +- BUG_ON(err); + for (i = 0; i < cnt; i++) { + if (unlikely(map[i].status != GNTST_okay)) { + pr_err("invalid buffer -- could not remap it\n"); + map[i].handle = SCSIBACK_INVALID_HANDLE; +- err = -ENOMEM; ++ if (!err) ++ err = -ENOMEM; + } else { + get_page(pg[i]); + } +diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h +index cda5534d3d0e3..7960359dbc700 100644 +--- a/fs/btrfs/ctree.h ++++ b/fs/btrfs/ctree.h +@@ -136,9 +136,6 @@ enum { + BTRFS_FS_STATE_DEV_REPLACING, + /* The btrfs_fs_info created for self-tests */ + BTRFS_FS_STATE_DUMMY_FS_INFO, +- +- /* Indicate that we can't trust the free space tree for caching yet */ +- BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED, + }; + + #define BTRFS_BACKREF_REV_MAX 256 +@@ -527,6 +524,9 @@ enum { + * so we don't need to offload checksums to workqueues. + */ + BTRFS_FS_CSUM_IMPL_FAST, ++ ++ /* Indicate that we can't trust the free space tree for caching yet */ ++ BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED, + }; + + struct btrfs_fs_info { +diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h +index 9bc5bc07d4d3f..a9978350b45b0 100644 +--- a/include/xen/grant_table.h ++++ b/include/xen/grant_table.h +@@ -157,6 +157,7 @@ gnttab_set_map_op(struct gnttab_map_grant_ref *map, phys_addr_t addr, + map->flags = flags; + map->ref = ref; + map->dom = domid; ++ map->status = 1; /* arbitrary positive value */ + } + + static inline void +diff --git a/net/bridge/br.c b/net/bridge/br.c +index 8a8f9e5f264f2..cccbb9bf3ca4e 100644 +--- a/net/bridge/br.c ++++ b/net/bridge/br.c +@@ -43,7 +43,10 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v + + if (event == NETDEV_REGISTER) { + /* register of bridge completed, add sysfs entries */ +- br_sysfs_addbr(dev); ++ err = br_sysfs_addbr(dev); ++ if (err) ++ return notifier_from_errno(err); ++ + return NOTIFY_DONE; + } + } +diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c +index d6d2736ec9273..ef602976bb2c8 100644 +--- a/net/qrtr/qrtr.c ++++ b/net/qrtr/qrtr.c +@@ -187,7 +187,7 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, + hdr->src_port_id = cpu_to_le32(from->sq_port); + if (to->sq_port == QRTR_PORT_CTRL) { + hdr->dst_node_id = cpu_to_le32(node->nid); +- hdr->dst_port_id = cpu_to_le32(QRTR_NODE_BCAST); ++ hdr->dst_port_id = cpu_to_le32(QRTR_PORT_CTRL); + } else { + hdr->dst_node_id = cpu_to_le32(to->sq_node); + hdr->dst_port_id = cpu_to_le32(to->sq_port); |