commit:     8fb5ae6155bd43013b71d416870009d40c9128bc
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 19 20:33:10 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Jan 19 20:33:10 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=8fb5ae61

Linux poatch 4.19.169

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README               |   4 +
 1168_linux-4.19.169.patch | 900 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 904 insertions(+)

diff --git a/0000_README b/0000_README
index 48fd7f2..0373220 100644
--- a/0000_README
+++ b/0000_README
@@ -711,6 +711,10 @@ Patch:  1167_linux-4.19.168.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.19.168
 
+Patch:  1168_linux-4.19.169.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.19.169
+
 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/1168_linux-4.19.169.patch b/1168_linux-4.19.169.patch
new file mode 100644
index 0000000..880daff
--- /dev/null
+++ b/1168_linux-4.19.169.patch
@@ -0,0 +1,900 @@
+diff --git a/Makefile b/Makefile
+index 3e44a813604eb..a994b12d2011a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 19
+-SUBLEVEL = 168
++SUBLEVEL = 169
+ EXTRAVERSION =
+ NAME = "People's Front"
+ 
+@@ -438,7 +438,7 @@ KBUILD_AFLAGS   := -D__ASSEMBLY__
+ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
+                  -fno-strict-aliasing -fno-common -fshort-wchar \
+                  -Werror-implicit-function-declaration \
+-                 -Wno-format-security \
++                 -Werror=return-type -Wno-format-security \
+                  -std=gnu89
+ KBUILD_CPPFLAGS := -D__KERNEL__
+ KBUILD_AFLAGS_KERNEL :=
+diff --git a/arch/arc/Makefile b/arch/arc/Makefile
+index 16e6cc22e25cc..99c55f015ce86 100644
+--- a/arch/arc/Makefile
++++ b/arch/arc/Makefile
+@@ -91,14 +91,9 @@ libs-y              += arch/arc/lib/ $(LIBGCC)
+ 
+ boot          := arch/arc/boot
+ 
+-#default target for make without any arguments.
+-KBUILD_IMAGE  := $(boot)/bootpImage
+-
+-all:  bootpImage
+-bootpImage: vmlinux
+-
+-boot_targets += uImage uImage.bin uImage.gz
++boot_targets := uImage uImage.bin uImage.gz uImage.lzma
+ 
++PHONY += $(boot_targets)
+ $(boot_targets): vmlinux
+       $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
+ 
+diff --git a/arch/arc/include/asm/page.h b/arch/arc/include/asm/page.h
+index 09ddddf71cc50..a70fef79c4055 100644
+--- a/arch/arc/include/asm/page.h
++++ b/arch/arc/include/asm/page.h
+@@ -13,6 +13,7 @@
+ #ifndef __ASSEMBLY__
+ 
+ #define clear_page(paddr)             memset((paddr), 0, PAGE_SIZE)
++#define copy_user_page(to, from, vaddr, pg)   copy_page(to, from)
+ #define copy_page(to, from)           memcpy((to), (from), PAGE_SIZE)
+ 
+ struct vm_area_struct;
+diff --git a/arch/arm/boot/dts/picoxcell-pc3x2.dtsi 
b/arch/arm/boot/dts/picoxcell-pc3x2.dtsi
+index a1266cf8776ce..8362c6a3bcd30 100644
+--- a/arch/arm/boot/dts/picoxcell-pc3x2.dtsi
++++ b/arch/arm/boot/dts/picoxcell-pc3x2.dtsi
+@@ -54,18 +54,21 @@
+               emac: gem@30000 {
+                       compatible = "cadence,gem";
+                       reg = <0x30000 0x10000>;
++                      interrupt-parent = <&vic0>;
+                       interrupts = <31>;
+               };
+ 
+               dmac1: dmac@40000 {
+                       compatible = "snps,dw-dmac";
+                       reg = <0x40000 0x10000>;
++                      interrupt-parent = <&vic0>;
+                       interrupts = <25>;
+               };
+ 
+               dmac2: dmac@50000 {
+                       compatible = "snps,dw-dmac";
+                       reg = <0x50000 0x10000>;
++                      interrupt-parent = <&vic0>;
+                       interrupts = <26>;
+               };
+ 
+@@ -243,6 +246,7 @@
+               axi2pico@c0000000 {
+                       compatible = "picochip,axi2pico-pc3x2";
+                       reg = <0xc0000000 0x10000>;
++                      interrupt-parent = <&vic0>;
+                       interrupts = <13 14 15 16 17 18 19 20 21>;
+               };
+       };
+diff --git a/arch/mips/boot/compressed/decompress.c 
b/arch/mips/boot/compressed/decompress.c
+index 81df9047e1109..40218be0b7ce8 100644
+--- a/arch/mips/boot/compressed/decompress.c
++++ b/arch/mips/boot/compressed/decompress.c
+@@ -17,6 +17,7 @@
+ #include <linux/libfdt.h>
+ 
+ #include <asm/addrspace.h>
++#include <asm/unaligned.h>
+ 
+ /*
+  * These two variables specify the free mem region
+@@ -117,7 +118,7 @@ void decompress_kernel(unsigned long boot_heap_start)
+               dtb_size = fdt_totalsize((void *)&__appended_dtb);
+ 
+               /* last four bytes is always image size in little endian */
+-              image_size = le32_to_cpup((void *)&__image_end - 4);
++              image_size = get_unaligned_le32((void *)&__image_end - 4);
+ 
+               /* copy dtb to where the booted kernel will expect it */
+               memcpy((void *)VMLINUX_LOAD_ADDRESS_ULL + image_size,
+diff --git a/arch/mips/kernel/relocate.c b/arch/mips/kernel/relocate.c
+index cbf4cc0b0b6cf..934caf2040780 100644
+--- a/arch/mips/kernel/relocate.c
++++ b/arch/mips/kernel/relocate.c
+@@ -187,8 +187,14 @@ static int __init relocate_exception_table(long offset)
+ static inline __init unsigned long rotate_xor(unsigned long hash,
+                                             const void *area, size_t size)
+ {
+-      size_t i;
+-      unsigned long *ptr = (unsigned long *)area;
++      const typeof(hash) *ptr = PTR_ALIGN(area, sizeof(hash));
++      size_t diff, i;
++
++      diff = (void *)ptr - area;
++      if (unlikely(size < diff + sizeof(hash)))
++              return hash;
++
++      size = ALIGN_DOWN(size - diff, sizeof(hash));
+ 
+       for (i = 0; i < size / sizeof(hash); i++) {
+               /* Rotate by odd number of bits and XOR. */
+diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c
+index 2f34d52753526..e666f7eaf32de 100644
+--- a/arch/x86/hyperv/mmu.c
++++ b/arch/x86/hyperv/mmu.c
+@@ -66,11 +66,17 @@ static void hyperv_flush_tlb_others(const struct cpumask 
*cpus,
+       if (!hv_hypercall_pg)
+               goto do_native;
+ 
+-      if (cpumask_empty(cpus))
+-              return;
+-
+       local_irq_save(flags);
+ 
++      /*
++       * Only check the mask _after_ interrupt has been disabled to avoid the
++       * mask changing under our feet.
++       */
++      if (cpumask_empty(cpus)) {
++              local_irq_restore(flags);
++              return;
++      }
++
+       flush_pcpu = (struct hv_tlb_flush **)
+                    this_cpu_ptr(hyperv_pcpu_input_arg);
+ 
+diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
+index 5198ed1b36690..b7ad8ac6bb41e 100644
+--- a/block/bfq-iosched.c
++++ b/block/bfq-iosched.c
+@@ -5280,13 +5280,13 @@ static unsigned int bfq_update_depths(struct bfq_data 
*bfqd,
+        * limit 'something'.
+        */
+       /* no more than 50% of tags for async I/O */
+-      bfqd->word_depths[0][0] = max((1U << bt->sb.shift) >> 1, 1U);
++      bfqd->word_depths[0][0] = max(bt->sb.depth >> 1, 1U);
+       /*
+        * no more than 75% of tags for sync writes (25% extra tags
+        * w.r.t. async I/O, to prevent async I/O from starving sync
+        * writes)
+        */
+-      bfqd->word_depths[0][1] = max(((1U << bt->sb.shift) * 3) >> 2, 1U);
++      bfqd->word_depths[0][1] = max((bt->sb.depth * 3) >> 2, 1U);
+ 
+       /*
+        * In-word depths in case some bfq_queue is being weight-
+@@ -5296,9 +5296,9 @@ static unsigned int bfq_update_depths(struct bfq_data 
*bfqd,
+        * shortage.
+        */
+       /* no more than ~18% of tags for async I/O */
+-      bfqd->word_depths[1][0] = max(((1U << bt->sb.shift) * 3) >> 4, 1U);
++      bfqd->word_depths[1][0] = max((bt->sb.depth * 3) >> 4, 1U);
+       /* no more than ~37% of tags for sync writes (~20% extra tags) */
+-      bfqd->word_depths[1][1] = max(((1U << bt->sb.shift) * 6) >> 4, 1U);
++      bfqd->word_depths[1][1] = max((bt->sb.depth * 6) >> 4, 1U);
+ 
+       for (i = 0; i < 2; i++)
+               for (j = 0; j < 2; j++)
+diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
+index f59d0b9e26833..6def196cc23cf 100644
+--- a/drivers/acpi/internal.h
++++ b/drivers/acpi/internal.h
+@@ -98,7 +98,7 @@ void acpi_scan_table_handler(u32 event, void *table, void 
*context);
+ extern struct list_head acpi_bus_id_list;
+ 
+ struct acpi_device_bus_id {
+-      char bus_id[15];
++      const char *bus_id;
+       unsigned int instance_no;
+       struct list_head node;
+ };
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index 1cfa3ac1d91f7..de9dc041d703e 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -486,6 +486,7 @@ static void acpi_device_del(struct acpi_device *device)
+                               acpi_device_bus_id->instance_no--;
+                       else {
+                               list_del(&acpi_device_bus_id->node);
++                              kfree_const(acpi_device_bus_id->bus_id);
+                               kfree(acpi_device_bus_id);
+                       }
+                       break;
+@@ -674,7 +675,14 @@ int acpi_device_add(struct acpi_device *device,
+       }
+       if (!found) {
+               acpi_device_bus_id = new_bus_id;
+-              strcpy(acpi_device_bus_id->bus_id, acpi_device_hid(device));
++              acpi_device_bus_id->bus_id =
++                      kstrdup_const(acpi_device_hid(device), GFP_KERNEL);
++              if (!acpi_device_bus_id->bus_id) {
++                      pr_err(PREFIX "Memory allocation error for bus id\n");
++                      result = -ENOMEM;
++                      goto err_free_new_bus_id;
++              }
++
+               acpi_device_bus_id->instance_no = 0;
+               list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
+       }
+@@ -709,6 +717,11 @@ int acpi_device_add(struct acpi_device *device,
+       if (device->parent)
+               list_del(&device->node);
+       list_del(&device->wakeup_list);
++
++ err_free_new_bus_id:
++      if (!found)
++              kfree(new_bus_id);
++
+       mutex_unlock(&acpi_device_lock);
+ 
+  err_detach:
+diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
+index 3ba3ae9749bec..81de5e1659551 100644
+--- a/drivers/gpu/drm/msm/msm_drv.c
++++ b/drivers/gpu/drm/msm/msm_drv.c
+@@ -483,14 +483,14 @@ static int msm_drm_init(struct device *dev, struct 
drm_driver *drv)
+ 
+       drm_mode_config_init(ddev);
+ 
+-      /* Bind all our sub-components: */
+-      ret = component_bind_all(dev, ddev);
++      ret = msm_init_vram(ddev);
+       if (ret)
+               goto err_destroy_mdss;
+ 
+-      ret = msm_init_vram(ddev);
++      /* Bind all our sub-components: */
++      ret = component_bind_all(dev, ddev);
+       if (ret)
+-              goto err_msm_uninit;
++              goto err_destroy_mdss;
+ 
+       if (!dev->dma_parms) {
+               dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms),
+diff --git a/drivers/infiniband/hw/mlx5/main.c 
b/drivers/infiniband/hw/mlx5/main.c
+index f41f3ff689c55..1695605eeb528 100644
+--- a/drivers/infiniband/hw/mlx5/main.c
++++ b/drivers/infiniband/hw/mlx5/main.c
+@@ -6094,7 +6094,7 @@ int mlx5_ib_stage_bfrag_init(struct mlx5_ib_dev *dev)
+ 
+       err = mlx5_alloc_bfreg(dev->mdev, &dev->fp_bfreg, false, true);
+       if (err)
+-              mlx5_free_bfreg(dev->mdev, &dev->fp_bfreg);
++              mlx5_free_bfreg(dev->mdev, &dev->bfreg);
+ 
+       return err;
+ }
+diff --git a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c 
b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c
+index e611f133aa97b..e6c11b5a1669b 100644
+--- a/drivers/infiniband/hw/usnic/usnic_ib_verbs.c
++++ b/drivers/infiniband/hw/usnic/usnic_ib_verbs.c
+@@ -212,6 +212,7 @@ find_free_vf_and_create_qp_grp(struct usnic_ib_dev 
*us_ibdev,
+ 
+               }
+               usnic_uiom_free_dev_list(dev_list);
++              dev_list = NULL;
+       }
+ 
+       /* Try to find resources on an unused vf */
+@@ -236,6 +237,8 @@ find_free_vf_and_create_qp_grp(struct usnic_ib_dev 
*us_ibdev,
+ qp_grp_check:
+       if (IS_ERR_OR_NULL(qp_grp)) {
+               usnic_err("Failed to allocate qp_grp\n");
++              if (usnic_ib_share_vf)
++                      usnic_uiom_free_dev_list(dev_list);
+               return ERR_PTR(qp_grp ? PTR_ERR(qp_grp) : -ENOMEM);
+       }
+       return qp_grp;
+diff --git a/drivers/isdn/mISDN/Kconfig b/drivers/isdn/mISDN/Kconfig
+index c0730d5c734d6..fb61181a5c4f7 100644
+--- a/drivers/isdn/mISDN/Kconfig
++++ b/drivers/isdn/mISDN/Kconfig
+@@ -12,6 +12,7 @@ if MISDN != n
+ config MISDN_DSP
+       tristate "Digital Audio Processing of transparent data"
+       depends on MISDN
++      select BITREVERSE
+       help
+         Enable support for digital audio processing capability.
+ 
+diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
+index e8eeee680750d..875c78b5e2242 100644
+--- a/drivers/md/dm-integrity.c
++++ b/drivers/md/dm-integrity.c
+@@ -3078,7 +3078,7 @@ static int dm_integrity_ctr(struct dm_target *ti, 
unsigned argc, char **argv)
+       unsigned extra_args;
+       struct dm_arg_set as;
+       static const struct dm_arg _args[] = {
+-              {0, 9, "Invalid number of feature args"},
++              {0, 15, "Invalid number of feature args"},
+       };
+       unsigned journal_sectors, interleave_sectors, buffer_sectors, 
journal_watermark, sync_msec;
+       bool recalculate;
+diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
+index d3f28a9e3fd95..9e930a150aa29 100644
+--- a/drivers/md/dm-snap.c
++++ b/drivers/md/dm-snap.c
+@@ -137,6 +137,11 @@ struct dm_snapshot {
+        * for them to be committed.
+        */
+       struct bio_list bios_queued_during_merge;
++
++      /*
++       * Flush data after merge.
++       */
++      struct bio flush_bio;
+ };
+ 
+ /*
+@@ -1061,6 +1066,17 @@ shut:
+ 
+ static void error_bios(struct bio *bio);
+ 
++static int flush_data(struct dm_snapshot *s)
++{
++      struct bio *flush_bio = &s->flush_bio;
++
++      bio_reset(flush_bio);
++      bio_set_dev(flush_bio, s->origin->bdev);
++      flush_bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
++
++      return submit_bio_wait(flush_bio);
++}
++
+ static void merge_callback(int read_err, unsigned long write_err, void 
*context)
+ {
+       struct dm_snapshot *s = context;
+@@ -1074,6 +1090,11 @@ static void merge_callback(int read_err, unsigned long 
write_err, void *context)
+               goto shut;
+       }
+ 
++      if (flush_data(s) < 0) {
++              DMERR("Flush after merge failed: shutting down merge");
++              goto shut;
++      }
++
+       if (s->store->type->commit_merge(s->store,
+                                        s->num_merging_chunks) < 0) {
+               DMERR("Write error in exception store: shutting down merge");
+@@ -1198,6 +1219,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned 
int argc, char **argv)
+       s->first_merging_chunk = 0;
+       s->num_merging_chunks = 0;
+       bio_list_init(&s->bios_queued_during_merge);
++      bio_init(&s->flush_bio, NULL, 0);
+ 
+       /* Allocate hash table for COW data */
+       if (init_hash_tables(s)) {
+@@ -1391,6 +1413,8 @@ static void snapshot_dtr(struct dm_target *ti)
+ 
+       mutex_destroy(&s->lock);
+ 
++      bio_uninit(&s->flush_bio);
++
+       dm_put_device(ti, s->cow);
+ 
+       dm_put_device(ti, s->origin);
+diff --git a/drivers/md/dm.c b/drivers/md/dm.c
+index 6c755eb0263fb..13237b85cfec5 100644
+--- a/drivers/md/dm.c
++++ b/drivers/md/dm.c
+@@ -515,7 +515,7 @@ static int dm_blk_ioctl(struct block_device *bdev, fmode_t 
mode,
+                * subset of the parent bdev; require extra privileges.
+                */
+               if (!capable(CAP_SYS_RAWIO)) {
+-                      DMWARN_LIMIT(
++                      DMDEBUG_LIMIT(
+       "%s: sending ioctl %x to DM device without required privilege.",
+                               current->comm, cmd);
+                       r = -ENOIOCTLCMD;
+diff --git a/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c 
b/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c
+index c8e5d889bd81f..21de56345503f 100644
+--- a/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c
++++ b/drivers/net/ethernet/freescale/fs_enet/mii-bitbang.c
+@@ -223,3 +223,4 @@ static struct platform_driver fs_enet_bb_mdio_driver = {
+ };
+ 
+ module_platform_driver(fs_enet_bb_mdio_driver);
++MODULE_LICENSE("GPL");
+diff --git a/drivers/net/ethernet/freescale/fs_enet/mii-fec.c 
b/drivers/net/ethernet/freescale/fs_enet/mii-fec.c
+index 1582d82483eca..4e6a9c5d8af55 100644
+--- a/drivers/net/ethernet/freescale/fs_enet/mii-fec.c
++++ b/drivers/net/ethernet/freescale/fs_enet/mii-fec.c
+@@ -224,3 +224,4 @@ static struct platform_driver fs_enet_fec_mdio_driver = {
+ };
+ 
+ module_platform_driver(fs_enet_fec_mdio_driver);
++MODULE_LICENSE("GPL");
+diff --git a/drivers/net/ethernet/freescale/ucc_geth.h 
b/drivers/net/ethernet/freescale/ucc_geth.h
+index 5da19b440a6a8..bf25e49d4fe34 100644
+--- a/drivers/net/ethernet/freescale/ucc_geth.h
++++ b/drivers/net/ethernet/freescale/ucc_geth.h
+@@ -580,7 +580,14 @@ struct ucc_geth_tx_global_pram {
+       u32 vtagtable[0x8];     /* 8 4-byte VLAN tags */
+       u32 tqptr;              /* a base pointer to the Tx Queues Memory
+                                  Region */
+-      u8 res2[0x80 - 0x74];
++      u8 res2[0x78 - 0x74];
++      u64 snums_en;
++      u32 l2l3baseptr;        /* top byte consists of a few other bit fields 
*/
++
++      u16 mtu[8];
++      u8 res3[0xa8 - 0x94];
++      u32 wrrtablebase;       /* top byte is reserved */
++      u8 res4[0xc0 - 0xac];
+ } __packed;
+ 
+ /* structure representing Extended Filtering Global Parameters in PRAM */
+diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
+index 1de97b69ce4e2..529c8fac15314 100644
+--- a/drivers/net/usb/cdc_ether.c
++++ b/drivers/net/usb/cdc_ether.c
+@@ -800,6 +800,13 @@ static const struct usb_device_id products[] = {
+       .driver_info = 0,
+ },
+ 
++/* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */
++{
++      USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x721e, USB_CLASS_COMM,
++                      USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
++      .driver_info = 0,
++},
++
+ /* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */
+ {
+       USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM,
+diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
+index 1b1ec41978300..7dc6055855354 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -5352,6 +5352,7 @@ static const struct usb_device_id rtl8152_table[] = {
+       {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x7205)},
+       {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x720c)},
+       {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x7214)},
++      {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0x721e)},
+       {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO,  0xa387)},
+       {REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041)},
+       {REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA,  0x09ff)},
+diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
+index 9936e4b991aa3..7bda5586e4332 100644
+--- a/fs/btrfs/qgroup.c
++++ b/fs/btrfs/qgroup.c
+@@ -2774,6 +2774,12 @@ out:
+       return ret;
+ }
+ 
++static bool rescan_should_stop(struct btrfs_fs_info *fs_info)
++{
++      return btrfs_fs_closing(fs_info) ||
++              test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
++}
++
+ static void btrfs_qgroup_rescan_worker(struct btrfs_work *work)
+ {
+       struct btrfs_fs_info *fs_info = container_of(work, struct btrfs_fs_info,
+@@ -2782,6 +2788,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work 
*work)
+       struct btrfs_trans_handle *trans = NULL;
+       int err = -ENOMEM;
+       int ret = 0;
++      bool stopped = false;
+ 
+       path = btrfs_alloc_path();
+       if (!path)
+@@ -2794,7 +2801,7 @@ static void btrfs_qgroup_rescan_worker(struct btrfs_work 
*work)
+       path->skip_locking = 1;
+ 
+       err = 0;
+-      while (!err && !btrfs_fs_closing(fs_info)) {
++      while (!err && !(stopped = rescan_should_stop(fs_info))) {
+               trans = btrfs_start_transaction(fs_info->fs_root, 0);
+               if (IS_ERR(trans)) {
+                       err = PTR_ERR(trans);
+@@ -2837,7 +2844,7 @@ out:
+       }
+ 
+       mutex_lock(&fs_info->qgroup_rescan_lock);
+-      if (!btrfs_fs_closing(fs_info))
++      if (!stopped)
+               fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN;
+       if (trans) {
+               ret = update_qgroup_status_item(trans);
+@@ -2856,7 +2863,7 @@ out:
+ 
+       btrfs_end_transaction(trans);
+ 
+-      if (btrfs_fs_closing(fs_info)) {
++      if (stopped) {
+               btrfs_info(fs_info, "qgroup scan paused");
+       } else if (err >= 0) {
+               btrfs_info(fs_info, "qgroup scan completed%s",
+diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
+index 40f5b4dcb9276..521f6c2091ad1 100644
+--- a/fs/btrfs/super.c
++++ b/fs/btrfs/super.c
+@@ -1845,6 +1845,14 @@ static int btrfs_remount(struct super_block *sb, int 
*flags, char *data)
+               btrfs_scrub_cancel(fs_info);
+               btrfs_pause_balance(fs_info);
+ 
++              /*
++               * Pause the qgroup rescan worker if it is running. We don't 
want
++               * it to be still running after we are in RO mode, as after 
that,
++               * by the time we unmount, it might have left a transaction 
open,
++               * so we would leak the transaction and/or crash.
++               */
++              btrfs_qgroup_wait_for_completion(fs_info, false);
++
+               ret = btrfs_commit_super(fs_info);
+               if (ret)
+                       goto restore;
+diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
+index 783c54bb2ce75..21c9ebfe83478 100644
+--- a/fs/ext4/ioctl.c
++++ b/fs/ext4/ioctl.c
+@@ -1092,7 +1092,10 @@ resizefs_out:
+                       err = ext4_journal_get_write_access(handle, sbi->s_sbh);
+                       if (err)
+                               goto pwsalt_err_journal;
++                      lock_buffer(sbi->s_sbh);
+                       generate_random_uuid(sbi->s_es->s_encrypt_pw_salt);
++                      ext4_superblock_csum_set(sb);
++                      unlock_buffer(sbi->s_sbh);
+                       err = ext4_handle_dirty_metadata(handle, NULL,
+                                                        sbi->s_sbh);
+               pwsalt_err_journal:
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index 3c238006870d3..8f7e0ad5b5ef1 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -3437,8 +3437,6 @@ static int ext4_setent(handle_t *handle, struct 
ext4_renament *ent,
+                       return retval;
+               }
+       }
+-      brelse(ent->bh);
+-      ent->bh = NULL;
+ 
+       return 0;
+ }
+@@ -3638,6 +3636,7 @@ static int ext4_rename(struct inode *old_dir, struct 
dentry *old_dentry,
+               }
+       }
+ 
++      old_file_type = old.de->file_type;
+       if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir))
+               ext4_handle_sync(handle);
+ 
+@@ -3665,7 +3664,6 @@ static int ext4_rename(struct inode *old_dir, struct 
dentry *old_dentry,
+       force_reread = (new.dir->i_ino == old.dir->i_ino &&
+                       ext4_test_inode_flag(new.dir, EXT4_INODE_INLINE_DATA));
+ 
+-      old_file_type = old.de->file_type;
+       if (whiteout) {
+               /*
+                * Do this before adding a new entry, so the old entry is sure
+@@ -3737,15 +3735,19 @@ static int ext4_rename(struct inode *old_dir, struct 
dentry *old_dentry,
+       retval = 0;
+ 
+ end_rename:
+-      brelse(old.dir_bh);
+-      brelse(old.bh);
+-      brelse(new.bh);
+       if (whiteout) {
+-              if (retval)
++              if (retval) {
++                      ext4_setent(handle, &old,
++                              old.inode->i_ino, old_file_type);
+                       drop_nlink(whiteout);
++              }
+               unlock_new_inode(whiteout);
+               iput(whiteout);
++
+       }
++      brelse(old.dir_bh);
++      brelse(old.bh);
++      brelse(new.bh);
+       if (handle)
+               ext4_journal_stop(handle);
+       return retval;
+diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
+index 8357ff69962f2..cc07189a501fa 100644
+--- a/fs/nfs/internal.h
++++ b/fs/nfs/internal.h
+@@ -575,12 +575,14 @@ extern int nfs4_test_session_trunk(struct rpc_clnt *,
+ 
+ static inline struct inode *nfs_igrab_and_active(struct inode *inode)
+ {
+-      inode = igrab(inode);
+-      if (inode != NULL && !nfs_sb_active(inode->i_sb)) {
+-              iput(inode);
+-              inode = NULL;
++      struct super_block *sb = inode->i_sb;
++
++      if (sb && nfs_sb_active(sb)) {
++              if (igrab(inode))
++                      return inode;
++              nfs_sb_deactive(sb);
+       }
+-      return inode;
++      return NULL;
+ }
+ 
+ static inline void nfs_iput_and_deactive(struct inode *inode)
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 1a395647ae265..d89a815f7c31f 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -6721,9 +6721,9 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int 
cmd, struct file_lock *f
+                                       data->arg.new_lock_owner, ret);
+       } else
+               data->cancelled = true;
++      trace_nfs4_set_lock(fl, state, &data->res.stateid, cmd, ret);
+       rpc_put_task(task);
+       dprintk("%s: done, ret = %d!\n", __func__, ret);
+-      trace_nfs4_set_lock(fl, state, &data->res.stateid, cmd, ret);
+       return ret;
+ }
+ 
+diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
+index a253384a4710b..46ca5592b8b0d 100644
+--- a/fs/nfs/pnfs.c
++++ b/fs/nfs/pnfs.c
+@@ -1460,12 +1460,18 @@ void pnfs_roc_release(struct nfs4_layoutreturn_args 
*args,
+               int ret)
+ {
+       struct pnfs_layout_hdr *lo = args->layout;
++      struct inode *inode = args->inode;
+       const nfs4_stateid *arg_stateid = NULL;
+       const nfs4_stateid *res_stateid = NULL;
+       struct nfs4_xdr_opaque_data *ld_private = args->ld_private;
+ 
+       switch (ret) {
+       case -NFS4ERR_NOMATCHING_LAYOUT:
++              spin_lock(&inode->i_lock);
++              if (pnfs_layout_is_valid(lo) &&
++                  nfs4_stateid_match_other(&args->stateid, &lo->plh_stateid))
++                      pnfs_set_plh_return_info(lo, args->range.iomode, 0);
++              spin_unlock(&inode->i_lock);
+               break;
+       case 0:
+               if (res->lrs_present)
+@@ -2141,6 +2147,7 @@ static void _lgopen_prepare_attached(struct 
nfs4_opendata *data,
+                                            &rng, GFP_KERNEL);
+       if (!lgp) {
+               pnfs_clear_first_layoutget(lo);
++              nfs_layoutget_end(lo);
+               pnfs_put_layout_hdr(lo);
+               return;
+       }
+diff --git a/include/linux/acpi.h b/include/linux/acpi.h
+index cd412817654fa..019468f072b7d 100644
+--- a/include/linux/acpi.h
++++ b/include/linux/acpi.h
+@@ -812,6 +812,13 @@ static inline int acpi_device_modalias(struct device *dev,
+       return -ENODEV;
+ }
+ 
++static inline struct platform_device *
++acpi_create_platform_device(struct acpi_device *adev,
++                          struct property_entry *properties)
++{
++      return NULL;
++}
++
+ static inline bool acpi_dma_supported(struct acpi_device *adev)
+ {
+       return false;
+diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
+index 5e3de28c76773..e656d1e232da4 100644
+--- a/kernel/trace/Kconfig
++++ b/kernel/trace/Kconfig
+@@ -476,7 +476,7 @@ config KPROBE_EVENTS
+ config KPROBE_EVENTS_ON_NOTRACE
+       bool "Do NOT protect notrace function from kprobe events"
+       depends on KPROBE_EVENTS
+-      depends on KPROBES_ON_FTRACE
++      depends on DYNAMIC_FTRACE
+       default n
+       help
+         This is only for the developers who want to debug ftrace itself
+diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
+index c45b017bacd47..5c17f70c7f2d2 100644
+--- a/kernel/trace/trace_kprobe.c
++++ b/kernel/trace/trace_kprobe.c
+@@ -517,7 +517,7 @@ disable_trace_kprobe(struct trace_kprobe *tk, struct 
trace_event_file *file)
+       return ret;
+ }
+ 
+-#if defined(CONFIG_KPROBES_ON_FTRACE) && \
++#if defined(CONFIG_DYNAMIC_FTRACE) && \
+       !defined(CONFIG_KPROBE_EVENTS_ON_NOTRACE)
+ static bool __within_notrace_func(unsigned long addr)
+ {
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 27e49c5ec2194..0b60ab3966968 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -3852,7 +3852,7 @@ retry:
+                * So we need to block hugepage fault by PG_hwpoison bit check.
+                */
+               if (unlikely(PageHWPoison(page))) {
+-                      ret = VM_FAULT_HWPOISON |
++                      ret = VM_FAULT_HWPOISON_LARGE |
+                               VM_FAULT_SET_HINDEX(hstate_index(h));
+                       goto backout_unlocked;
+               }
+diff --git a/mm/slub.c b/mm/slub.c
+index dfc9b4267603e..02295fa61583c 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -1830,7 +1830,7 @@ static void *get_partial_node(struct kmem_cache *s, 
struct kmem_cache_node *n,
+ 
+               t = acquire_slab(s, n, page, object == NULL, &objects);
+               if (!t)
+-                      break;
++                      continue; /* cmpxchg raced */
+ 
+               available += objects;
+               if (!object) {
+diff --git a/net/netfilter/nf_conntrack_standalone.c 
b/net/netfilter/nf_conntrack_standalone.c
+index 4c94f3ba2ae42..dcd8e79229515 100644
+--- a/net/netfilter/nf_conntrack_standalone.c
++++ b/net/netfilter/nf_conntrack_standalone.c
+@@ -500,6 +500,9 @@ nf_conntrack_hash_sysctl(struct ctl_table *table, int 
write,
+ {
+       int ret;
+ 
++      /* module_param hashsize could have changed value */
++      nf_conntrack_htable_size_user = nf_conntrack_htable_size;
++
+       ret = proc_dointvec(table, write, buffer, lenp, ppos);
+       if (ret < 0 || !write)
+               return ret;
+diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c
+index 2268b10a9dcf8..c31df6a76504d 100644
+--- a/net/netfilter/nf_nat_core.c
++++ b/net/netfilter/nf_nat_core.c
+@@ -1068,6 +1068,7 @@ static int __init nf_nat_init(void)
+       ret = register_pernet_subsys(&nat_net_ops);
+       if (ret < 0) {
+               nf_ct_extend_unregister(&nat_extend);
++              kvfree(nf_nat_bysource);
+               return ret;
+       }
+ 
+diff --git a/net/sunrpc/addr.c b/net/sunrpc/addr.c
+index 8391c27855501..7404f02702a1c 100644
+--- a/net/sunrpc/addr.c
++++ b/net/sunrpc/addr.c
+@@ -184,7 +184,7 @@ static int rpc_parse_scope_id(struct net *net, const char 
*buf,
+                       scope_id = dev->ifindex;
+                       dev_put(dev);
+               } else {
+-                      if (kstrtou32(p, 10, &scope_id) == 0) {
++                      if (kstrtou32(p, 10, &scope_id) != 0) {
+                               kfree(p);
+                               return 0;
+                       }
+diff --git a/security/integrity/ima/ima_crypto.c 
b/security/integrity/ima/ima_crypto.c
+index 5596ea8f339a3..f0b2449897344 100644
+--- a/security/integrity/ima/ima_crypto.c
++++ b/security/integrity/ima/ima_crypto.c
+@@ -641,7 +641,7 @@ int ima_calc_buffer_hash(const void *buf, loff_t len,
+       return calc_buffer_shash(buf, len, hash);
+ }
+ 
+-static void __init ima_pcrread(int idx, u8 *pcr)
++static void ima_pcrread(int idx, u8 *pcr)
+ {
+       if (!ima_tpm_chip)
+               return;
+diff --git a/security/lsm_audit.c b/security/lsm_audit.c
+index 33028c098ef3c..d6fea68d22ad6 100644
+--- a/security/lsm_audit.c
++++ b/security/lsm_audit.c
+@@ -277,7 +277,9 @@ static void dump_common_audit_data(struct audit_buffer *ab,
+               struct inode *inode;
+ 
+               audit_log_format(ab, " name=");
++              spin_lock(&a->u.dentry->d_lock);
+               audit_log_untrustedstring(ab, a->u.dentry->d_name.name);
++              spin_unlock(&a->u.dentry->d_lock);
+ 
+               inode = d_backing_inode(a->u.dentry);
+               if (inode) {
+@@ -295,8 +297,9 @@ static void dump_common_audit_data(struct audit_buffer *ab,
+               dentry = d_find_alias(inode);
+               if (dentry) {
+                       audit_log_format(ab, " name=");
+-                      audit_log_untrustedstring(ab,
+-                                       dentry->d_name.name);
++                      spin_lock(&dentry->d_lock);
++                      audit_log_untrustedstring(ab, dentry->d_name.name);
++                      spin_unlock(&dentry->d_lock);
+                       dput(dentry);
+               }
+               audit_log_format(ab, " dev=");
+diff --git a/sound/firewire/fireface/ff-transaction.c 
b/sound/firewire/fireface/ff-transaction.c
+index 332b29f8ed754..47280ae506829 100644
+--- a/sound/firewire/fireface/ff-transaction.c
++++ b/sound/firewire/fireface/ff-transaction.c
+@@ -99,7 +99,7 @@ static void transmit_midi_msg(struct snd_ff *ff, unsigned 
int port)
+ 
+       /* Set interval to next transaction. */
+       ff->next_ktime[port] = ktime_add_ns(ktime_get(),
+-                                          len * 8 * NSEC_PER_SEC / 31250);
++                                          len * 8 * (NSEC_PER_SEC / 31250));
+       ff->rx_bytes[port] = len;
+ 
+       /*
+diff --git a/sound/firewire/tascam/tascam-transaction.c 
b/sound/firewire/tascam/tascam-transaction.c
+index 2ad692dd4b137..92f7e74d58478 100644
+--- a/sound/firewire/tascam/tascam-transaction.c
++++ b/sound/firewire/tascam/tascam-transaction.c
+@@ -210,7 +210,7 @@ static void midi_port_work(struct work_struct *work)
+ 
+       /* Set interval to next transaction. */
+       port->next_ktime = ktime_add_ns(ktime_get(),
+-                              port->consume_bytes * 8 * NSEC_PER_SEC / 31250);
++                      port->consume_bytes * 8 * (NSEC_PER_SEC / 31250));
+ 
+       /* Start this transaction. */
+       port->idling = false;
+diff --git a/sound/soc/intel/skylake/cnl-sst.c 
b/sound/soc/intel/skylake/cnl-sst.c
+index 245df1067ba89..7b429c0fb4e55 100644
+--- a/sound/soc/intel/skylake/cnl-sst.c
++++ b/sound/soc/intel/skylake/cnl-sst.c
+@@ -212,6 +212,7 @@ static int cnl_set_dsp_D0(struct sst_dsp *ctx, unsigned 
int core_id)
+                               "dsp boot timeout, status=%#x error=%#x\n",
+                               sst_dsp_shim_read(ctx, CNL_ADSP_FW_STATUS),
+                               sst_dsp_shim_read(ctx, CNL_ADSP_ERROR_CODE));
++                      ret = -ETIMEDOUT;
+                       goto err;
+               }
+       } else {
+diff --git a/sound/soc/meson/axg-tdm-interface.c 
b/sound/soc/meson/axg-tdm-interface.c
+index 5c055d8de8c7d..01cc551a8e3fa 100644
+--- a/sound/soc/meson/axg-tdm-interface.c
++++ b/sound/soc/meson/axg-tdm-interface.c
+@@ -459,8 +459,20 @@ static int axg_tdm_iface_set_bias_level(struct 
snd_soc_component *component,
+       return ret;
+ }
+ 
++static const struct snd_soc_dapm_widget axg_tdm_iface_dapm_widgets[] = {
++      SND_SOC_DAPM_SIGGEN("Playback Signal"),
++};
++
++static const struct snd_soc_dapm_route axg_tdm_iface_dapm_routes[] = {
++      { "Loopback", NULL, "Playback Signal" },
++};
++
+ static const struct snd_soc_component_driver axg_tdm_iface_component_drv = {
+-      .set_bias_level = axg_tdm_iface_set_bias_level,
++      .dapm_widgets           = axg_tdm_iface_dapm_widgets,
++      .num_dapm_widgets       = ARRAY_SIZE(axg_tdm_iface_dapm_widgets),
++      .dapm_routes            = axg_tdm_iface_dapm_routes,
++      .num_dapm_routes        = ARRAY_SIZE(axg_tdm_iface_dapm_routes),
++      .set_bias_level         = axg_tdm_iface_set_bias_level,
+ };
+ 
+ static const struct of_device_id axg_tdm_iface_of_match[] = {
+diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
+index 96800b7c82f67..4e99d9986f112 100644
+--- a/sound/soc/soc-dapm.c
++++ b/sound/soc/soc-dapm.c
+@@ -2454,6 +2454,7 @@ void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget 
*w)
+       enum snd_soc_dapm_direction dir;
+ 
+       list_del(&w->list);
++      list_del(&w->dirty);
+       /*
+        * remove source and sink paths associated to this widget.
+        * While removing the path, remove reference to it from both

Reply via email to