commit:     42ba2cb59110ceb6dcb217f19b75411535168252
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Wed Mar  3 17:14:43 2021 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Wed Mar  3 17:15:04 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=42ba2cb5

Linux patch 4.9.259

Signed-off-by: Alice Ferrazzi <alicef <AT> gentoo.org>

 0000_README              |    4 +
 1258_linux-4.9.259.patch | 3177 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3181 insertions(+)

diff --git a/0000_README b/0000_README
index 3c566c7..c025b66 100644
--- a/0000_README
+++ b/0000_README
@@ -1075,6 +1075,10 @@ Patch:  1257_linux-4.9.258.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.258
 
+Patch:  1258_linux-4.9.259.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.259
+
 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/1258_linux-4.9.259.patch b/1258_linux-4.9.259.patch
new file mode 100644
index 0000000..4bb7996
--- /dev/null
+++ b/1258_linux-4.9.259.patch
@@ -0,0 +1,3177 @@
+diff --git a/Makefile b/Makefile
+index e5955f122ffd3..cdc71bda92c4b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 258
++SUBLEVEL = 259
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
+index a67ed746b0e37..5fa0beba46ee5 100644
+--- a/arch/arm/boot/compressed/head.S
++++ b/arch/arm/boot/compressed/head.S
+@@ -1080,9 +1080,9 @@ __armv4_mmu_cache_off:
+ __armv7_mmu_cache_off:
+               mrc     p15, 0, r0, c1, c0
+ #ifdef CONFIG_MMU
+-              bic     r0, r0, #0x000d
++              bic     r0, r0, #0x0005
+ #else
+-              bic     r0, r0, #0x000c
++              bic     r0, r0, #0x0004
+ #endif
+               mcr     p15, 0, r0, c1, c0      @ turn MMU and cache off
+               mov     r12, lr
+diff --git a/arch/arm/boot/dts/exynos5250-spring.dts 
b/arch/arm/boot/dts/exynos5250-spring.dts
+index 4d7bdb735ed3b..e4433ecd9fe41 100644
+--- a/arch/arm/boot/dts/exynos5250-spring.dts
++++ b/arch/arm/boot/dts/exynos5250-spring.dts
+@@ -112,7 +112,7 @@
+               compatible = "samsung,s5m8767-pmic";
+               reg = <0x66>;
+               interrupt-parent = <&gpx3>;
+-              interrupts = <2 IRQ_TYPE_NONE>;
++              interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&s5m8767_irq &s5m8767_dvs &s5m8767_ds>;
+               wakeup-source;
+diff --git a/arch/arm/boot/dts/exynos5420-arndale-octa.dts 
b/arch/arm/boot/dts/exynos5420-arndale-octa.dts
+index e664c33c3c640..4a71bbe1ce542 100644
+--- a/arch/arm/boot/dts/exynos5420-arndale-octa.dts
++++ b/arch/arm/boot/dts/exynos5420-arndale-octa.dts
+@@ -88,7 +88,7 @@
+               reg = <0x66>;
+ 
+               interrupt-parent = <&gpx3>;
+-              interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
++              interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&s2mps11_irq>;
+ 
+diff --git a/arch/arm/boot/dts/omap443x.dtsi b/arch/arm/boot/dts/omap443x.dtsi
+index fc6a8610c24c5..adcf9d141db6a 100644
+--- a/arch/arm/boot/dts/omap443x.dtsi
++++ b/arch/arm/boot/dts/omap443x.dtsi
+@@ -35,10 +35,12 @@
+       };
+ 
+       ocp {
++              /* 4430 has only gpio_86 tshut and no talert interrupt */
+               bandgap: bandgap@4a002260 {
+                       reg = <0x4a002260 0x4
+                              0x4a00232C 0x4>;
+                       compatible = "ti,omap4430-bandgap";
++                      gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;
+ 
+                       #thermal-sensor-cells = <0>;
+               };
+diff --git a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts 
b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts
+index 2f7d144d556da..e43e804c42c3e 100644
+--- a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts
++++ b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts
+@@ -64,7 +64,7 @@
+       s2mps15_pmic@66 {
+               compatible = "samsung,s2mps15-pmic";
+               reg = <0x66>;
+-              interrupts = <2 IRQ_TYPE_NONE>;
++              interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               interrupt-parent = <&gpa0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmic_irq>;
+diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi 
b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+index 87ef72bffd86c..7501bfc2b0f1d 100644
+--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
++++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+@@ -727,6 +727,7 @@
+                        <&tegra_car 128>, /* hda2hdmi */
+                        <&tegra_car 111>; /* hda2codec_2x */
+               reset-names = "hda", "hda2hdmi", "hda2codec_2x";
++              power-domains = <&pd_sor>;
+               status = "disabled";
+       };
+ 
+diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi 
b/arch/arm64/boot/dts/qcom/msm8916.dtsi
+index fb5001a6879c7..c2557cf43b3dc 100644
+--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi
+@@ -62,7 +62,7 @@
+                       no-map;
+               };
+ 
+-              reserved@8668000 {
++              reserved@86680000 {
+                       reg = <0x0 0x86680000 0x0 0x80000>;
+                       no-map;
+               };
+@@ -72,7 +72,7 @@
+                       no-map;
+               };
+ 
+-              rfsa@867e00000 {
++              rfsa@867e0000 {
+                       reg = <0x0 0x867e0000 0x0 0x20000>;
+                       no-map;
+               };
+diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
+index aba534959377b..3875423836622 100644
+--- a/arch/arm64/kernel/head.S
++++ b/arch/arm64/kernel/head.S
+@@ -846,6 +846,7 @@ __primary_switch:
+ 
+       tlbi    vmalle1                         // Remove any stale TLB entries
+       dsb     nsh
++      isb
+ 
+       msr     sctlr_el1, x19                  // re-enable the MMU
+       isb
+diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
+index 612b2b3012803..23c5509f3b51b 100644
+--- a/arch/mips/kernel/vmlinux.lds.S
++++ b/arch/mips/kernel/vmlinux.lds.S
+@@ -92,6 +92,7 @@ SECTIONS
+ 
+               INIT_TASK_DATA(THREAD_SIZE)
+               NOSAVE_DATA
++              PAGE_ALIGNED_DATA(PAGE_SIZE)
+               CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
+               READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
+               DATA_DATA
+diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
+index 7c6f75c2aa4df..e64f678ca12c8 100644
+--- a/arch/mips/lantiq/irq.c
++++ b/arch/mips/lantiq/irq.c
+@@ -245,7 +245,7 @@ static void ltq_hw_irqdispatch(int module)
+       do_IRQ((int)irq + MIPS_CPU_IRQ_CASCADE + (INT_NUM_IM_OFFSET * module));
+ 
+       /* if this is a EBU irq, we need to ack it or get a deadlock */
+-      if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT)
++      if (irq == LTQ_ICU_EBU_IRQ && !module && LTQ_EBU_PCC_ISTAT != 0)
+               ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_ISTAT) | 0x10,
+                       LTQ_EBU_PCC_ISTAT);
+ }
+diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
+index cb877f86f5fc9..b9dea4ce290c1 100644
+--- a/arch/mips/mm/c-r4k.c
++++ b/arch/mips/mm/c-r4k.c
+@@ -1630,7 +1630,7 @@ static int probe_scache(void)
+       return 1;
+ }
+ 
+-static void __init loongson2_sc_init(void)
++static void loongson2_sc_init(void)
+ {
+       struct cpuinfo_mips *c = &current_cpu_data;
+ 
+diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
+index f529d3d9d88d7..6a06411f9bf14 100644
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -622,7 +622,7 @@ config PPC_64K_PAGES
+ 
+ config PPC_256K_PAGES
+       bool "256k page size"
+-      depends on 44x && !STDBINUTILS
++      depends on 44x && !STDBINUTILS && !PPC_47x
+       help
+         Make the page size 256k.
+ 
+diff --git a/arch/powerpc/platforms/pseries/dlpar.c 
b/arch/powerpc/platforms/pseries/dlpar.c
+index 5abb8e2239a54..647dbd8514c4f 100644
+--- a/arch/powerpc/platforms/pseries/dlpar.c
++++ b/arch/powerpc/platforms/pseries/dlpar.c
+@@ -139,7 +139,6 @@ void dlpar_free_cc_nodes(struct device_node *dn)
+ #define NEXT_PROPERTY   3
+ #define PREV_PARENT     4
+ #define MORE_MEMORY     5
+-#define CALL_AGAIN    -2
+ #define ERR_CFG_USE     -9003
+ 
+ struct device_node *dlpar_configure_connector(__be32 drc_index,
+@@ -181,6 +180,9 @@ struct device_node *dlpar_configure_connector(__be32 
drc_index,
+ 
+               spin_unlock(&rtas_data_buf_lock);
+ 
++              if (rtas_busy_delay(rc))
++                      continue;
++
+               switch (rc) {
+               case COMPLETE:
+                       break;
+@@ -233,9 +235,6 @@ struct device_node *dlpar_configure_connector(__be32 
drc_index,
+                       parent_path = last_dn->parent->full_name;
+                       break;
+ 
+-              case CALL_AGAIN:
+-                      break;
+-
+               case MORE_MEMORY:
+               case ERR_CFG_USE:
+               default:
+diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
+index cef42d4be2922..f6d9c44b32dfc 100644
+--- a/arch/sparc/Kconfig
++++ b/arch/sparc/Kconfig
+@@ -562,7 +562,7 @@ config COMPAT
+       bool
+       depends on SPARC64
+       default y
+-      select COMPAT_BINFMT_ELF
++      select COMPAT_BINFMT_ELF if BINFMT_ELF
+       select HAVE_UID16
+       select ARCH_WANT_OLD_COMPAT_IPC
+       select COMPAT_OLD_SIGACTION
+diff --git a/arch/sparc/lib/memset.S b/arch/sparc/lib/memset.S
+index bb539b42b088a..992db8a0f7c90 100644
+--- a/arch/sparc/lib/memset.S
++++ b/arch/sparc/lib/memset.S
+@@ -140,6 +140,7 @@ __bzero:
+       ZERO_LAST_BLOCKS(%o0, 0x48, %g2)
+       ZERO_LAST_BLOCKS(%o0, 0x08, %g2)
+ 13:
++      EXT(12b, 13b, 21f)
+       be      8f
+        andcc  %o1, 4, %g0
+ 
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index b427dc73ba274..597ce32fa33f2 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -539,29 +539,20 @@ static void emergency_vmx_disable_all(void)
+       local_irq_disable();
+ 
+       /*
+-       * We need to disable VMX on all CPUs before rebooting, otherwise
+-       * we risk hanging up the machine, because the CPU ignore INIT
+-       * signals when VMX is enabled.
++       * Disable VMX on all CPUs before rebooting, otherwise we risk hanging
++       * the machine, because the CPU blocks INIT when it's in VMX root.
+        *
+-       * We can't take any locks and we may be on an inconsistent
+-       * state, so we use NMIs as IPIs to tell the other CPUs to disable
+-       * VMX and halt.
++       * We can't take any locks and we may be on an inconsistent state, so
++       * use NMIs as IPIs to tell the other CPUs to exit VMX root and halt.
+        *
+-       * For safety, we will avoid running the nmi_shootdown_cpus()
+-       * stuff unnecessarily, but we don't have a way to check
+-       * if other CPUs have VMX enabled. So we will call it only if the
+-       * CPU we are running on has VMX enabled.
+-       *
+-       * We will miss cases where VMX is not enabled on all CPUs. This
+-       * shouldn't do much harm because KVM always enable VMX on all
+-       * CPUs anyway. But we can miss it on the small window where KVM
+-       * is still enabling VMX.
++       * Do the NMI shootdown even if VMX if off on _this_ CPU, as that
++       * doesn't prevent a different CPU from being in VMX root operation.
+        */
+-      if (cpu_has_vmx() && cpu_vmx_enabled()) {
+-              /* Disable VMX on this CPU. */
+-              cpu_vmxoff();
++      if (cpu_has_vmx()) {
++              /* Safely force _this_ CPU out of VMX root operation. */
++              __cpu_emergency_vmxoff();
+ 
+-              /* Halt and disable VMX on the other CPUs */
++              /* Halt and exit VMX root operation on the other CPUs. */
+               nmi_shootdown_cpus(vmxoff_nmi);
+ 
+       }
+diff --git a/block/blk-settings.c b/block/blk-settings.c
+index 0d644f37e3c64..ebff811d5d1dc 100644
+--- a/block/blk-settings.c
++++ b/block/blk-settings.c
+@@ -494,6 +494,14 @@ void blk_queue_stack_limits(struct request_queue *t, 
struct request_queue *b)
+ }
+ EXPORT_SYMBOL(blk_queue_stack_limits);
+ 
++static unsigned int blk_round_down_sectors(unsigned int sectors, unsigned int 
lbs)
++{
++      sectors = round_down(sectors, lbs >> SECTOR_SHIFT);
++      if (sectors < PAGE_SIZE >> SECTOR_SHIFT)
++              sectors = PAGE_SIZE >> SECTOR_SHIFT;
++      return sectors;
++}
++
+ /**
+  * blk_stack_limits - adjust queue_limits for stacked devices
+  * @t:        the stacking driver limits (top device)
+@@ -606,6 +614,10 @@ int blk_stack_limits(struct queue_limits *t, struct 
queue_limits *b,
+               ret = -1;
+       }
+ 
++      t->max_sectors = blk_round_down_sectors(t->max_sectors, 
t->logical_block_size);
++      t->max_hw_sectors = blk_round_down_sectors(t->max_hw_sectors, 
t->logical_block_size);
++      t->max_dev_sectors = blk_round_down_sectors(t->max_dev_sectors, 
t->logical_block_size);
++
+       /* Discard alignment and granularity */
+       if (b->discard_granularity) {
+               alignment = queue_limit_discard_alignment(b, start);
+diff --git a/crypto/ecdh_helper.c b/crypto/ecdh_helper.c
+index 3cd8a2414e60e..de43ffb538405 100644
+--- a/crypto/ecdh_helper.c
++++ b/crypto/ecdh_helper.c
+@@ -71,6 +71,9 @@ int crypto_ecdh_decode_key(const char *buf, unsigned int len,
+       if (secret.type != CRYPTO_KPP_SECRET_TYPE_ECDH)
+               return -EINVAL;
+ 
++      if (unlikely(len < secret.len))
++              return -EINVAL;
++
+       ptr = ecdh_unpack_data(&params->curve_id, ptr, 
sizeof(params->curve_id));
+       ptr = ecdh_unpack_data(&params->key_size, ptr, 
sizeof(params->key_size));
+       if (secret.len != crypto_ecdh_key_len(params))
+diff --git a/drivers/acpi/acpi_configfs.c b/drivers/acpi/acpi_configfs.c
+index 146a77fb762d5..11bd2d3da886a 100644
+--- a/drivers/acpi/acpi_configfs.c
++++ b/drivers/acpi/acpi_configfs.c
+@@ -251,7 +251,12 @@ static int __init acpi_configfs_init(void)
+ 
+       acpi_table_group = configfs_register_default_group(root, "table",
+                                                          &acpi_tables_type);
+-      return PTR_ERR_OR_ZERO(acpi_table_group);
++      if (IS_ERR(acpi_table_group)) {
++              configfs_unregister_subsystem(&acpi_configfs);
++              return PTR_ERR(acpi_table_group);
++      }
++
++      return 0;
+ }
+ module_init(acpi_configfs_init);
+ 
+diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
+index 93888ccb4e267..5bc8d588d1460 100644
+--- a/drivers/amba/bus.c
++++ b/drivers/amba/bus.c
+@@ -280,10 +280,11 @@ static int amba_remove(struct device *dev)
+ {
+       struct amba_device *pcdev = to_amba_device(dev);
+       struct amba_driver *drv = to_amba_driver(dev->driver);
+-      int ret;
++      int ret = 0;
+ 
+       pm_runtime_get_sync(dev);
+-      ret = drv->remove(pcdev);
++      if (drv->remove)
++              ret = drv->remove(pcdev);
+       pm_runtime_put_noidle(dev);
+ 
+       /* Undo the runtime PM settings in amba_probe() */
+@@ -300,7 +301,9 @@ static int amba_remove(struct device *dev)
+ static void amba_shutdown(struct device *dev)
+ {
+       struct amba_driver *drv = to_amba_driver(dev->driver);
+-      drv->shutdown(to_amba_device(dev));
++
++      if (drv->shutdown)
++              drv->shutdown(to_amba_device(dev));
+ }
+ 
+ /**
+@@ -313,12 +316,13 @@ static void amba_shutdown(struct device *dev)
+  */
+ int amba_driver_register(struct amba_driver *drv)
+ {
+-      drv->drv.bus = &amba_bustype;
++      if (!drv->probe)
++              return -EINVAL;
+ 
+-#define SETFN(fn)     if (drv->fn) drv->drv.fn = amba_##fn
+-      SETFN(probe);
+-      SETFN(remove);
+-      SETFN(shutdown);
++      drv->drv.bus = &amba_bustype;
++      drv->drv.probe = amba_probe;
++      drv->drv.remove = amba_remove;
++      drv->drv.shutdown = amba_shutdown;
+ 
+       return driver_register(&drv->drv);
+ }
+diff --git a/drivers/ata/ahci_brcm.c b/drivers/ata/ahci_brcm.c
+index f50a76ad63e4a..8354f2de37c31 100644
+--- a/drivers/ata/ahci_brcm.c
++++ b/drivers/ata/ahci_brcm.c
+@@ -285,6 +285,10 @@ static int brcm_ahci_resume(struct device *dev)
+       if (ret)
+               return ret;
+ 
++      ret = ahci_platform_enable_regulators(hpriv);
++      if (ret)
++              goto out_disable_clks;
++
+       brcm_sata_init(priv);
+       brcm_sata_phys_enable(priv);
+       brcm_sata_alpm_init(hpriv);
+@@ -314,6 +318,8 @@ out_disable_platform_phys:
+       ahci_platform_disable_phys(hpriv);
+ out_disable_phys:
+       brcm_sata_phys_disable(priv);
++      ahci_platform_disable_regulators(hpriv);
++out_disable_clks:
+       ahci_platform_disable_clks(hpriv);
+       return ret;
+ }
+@@ -377,6 +383,10 @@ static int brcm_ahci_probe(struct platform_device *pdev)
+       if (ret)
+               goto out_reset;
+ 
++      ret = ahci_platform_enable_regulators(hpriv);
++      if (ret)
++              goto out_disable_clks;
++
+       /* Must be first so as to configure endianness including that
+        * of the standard AHCI register space.
+        */
+@@ -386,7 +396,7 @@ static int brcm_ahci_probe(struct platform_device *pdev)
+       priv->port_mask = brcm_ahci_get_portmask(hpriv, priv);
+       if (!priv->port_mask) {
+               ret = -ENODEV;
+-              goto out_disable_clks;
++              goto out_disable_regulators;
+       }
+ 
+       /* Must be done before ahci_platform_enable_phys() */
+@@ -417,6 +427,8 @@ out_disable_platform_phys:
+       ahci_platform_disable_phys(hpriv);
+ out_disable_phys:
+       brcm_sata_phys_disable(priv);
++out_disable_regulators:
++      ahci_platform_disable_regulators(hpriv);
+ out_disable_clks:
+       ahci_platform_disable_clks(hpriv);
+ out_reset:
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index 4496e7a492352..64a3dae5381ef 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -4067,21 +4067,22 @@ static int floppy_open(struct block_device *bdev, 
fmode_t mode)
+       if (UFDCS->rawcmd == 1)
+               UFDCS->rawcmd = 2;
+ 
+-      if (!(mode & FMODE_NDELAY)) {
+-              if (mode & (FMODE_READ|FMODE_WRITE)) {
+-                      UDRS->last_checked = 0;
+-                      clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
+-                      check_disk_change(bdev);
+-                      if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
+-                              goto out;
+-                      if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
+-                              goto out;
+-              }
+-              res = -EROFS;
+-              if ((mode & FMODE_WRITE) &&
+-                  !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
++      if (mode & (FMODE_READ|FMODE_WRITE)) {
++              UDRS->last_checked = 0;
++              clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
++              check_disk_change(bdev);
++              if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
++                      goto out;
++              if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
+                       goto out;
+       }
++
++      res = -EROFS;
++
++      if ((mode & FMODE_WRITE) &&
++                      !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
++              goto out;
++
+       mutex_unlock(&open_lock);
+       mutex_unlock(&floppy_mutex);
+       return 0;
+diff --git a/drivers/char/random.c b/drivers/char/random.c
+index 4cbc73173701d..2184d87623272 100644
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -1913,7 +1913,7 @@ static long random_ioctl(struct file *f, unsigned int 
cmd, unsigned long arg)
+                       return -EPERM;
+               if (crng_init < 2)
+                       return -ENODATA;
+-              crng_reseed(&primary_crng, NULL);
++              crng_reseed(&primary_crng, &input_pool);
+               crng_global_init_time = jiffies - 1;
+               return 0;
+       default:
+diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c
+index 4adc1e89212c9..f9157e7f45f2d 100644
+--- a/drivers/clk/meson/clk-pll.c
++++ b/drivers/clk/meson/clk-pll.c
+@@ -145,7 +145,7 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, 
unsigned long rate,
+       if (parent_rate == 0 || rate == 0)
+               return -EINVAL;
+ 
+-      old_rate = rate;
++      old_rate = clk_hw_get_rate(hw);
+ 
+       rate_set = meson_clk_get_pll_settings(pll, rate);
+       if (!rate_set)
+diff --git a/drivers/clocksource/mxs_timer.c b/drivers/clocksource/mxs_timer.c
+index 0ba0a913b41d1..b26c3b84c5b6c 100644
+--- a/drivers/clocksource/mxs_timer.c
++++ b/drivers/clocksource/mxs_timer.c
+@@ -152,10 +152,7 @@ static void mxs_irq_clear(char *state)
+ 
+       /* Clear pending interrupt */
+       timrot_irq_acknowledge();
+-
+-#ifdef DEBUG
+-      pr_info("%s: changing mode to %s\n", __func__, state)
+-#endif /* DEBUG */
++      pr_debug("%s: changing mode to %s\n", __func__, state);
+ }
+ 
+ static int mxs_shutdown(struct clock_event_device *evt)
+diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
+index 51c75bf2b9b68..c9a1d59dcb490 100644
+--- a/drivers/dma/fsldma.c
++++ b/drivers/dma/fsldma.c
+@@ -1331,6 +1331,7 @@ static int fsldma_of_probe(struct platform_device *op)
+ {
+       struct fsldma_device *fdev;
+       struct device_node *child;
++      unsigned int i;
+       int err;
+ 
+       fdev = kzalloc(sizeof(*fdev), GFP_KERNEL);
+@@ -1411,6 +1412,10 @@ static int fsldma_of_probe(struct platform_device *op)
+       return 0;
+ 
+ out_free_fdev:
++      for (i = 0; i < FSL_DMA_MAX_CHANS_PER_DEVICE; i++) {
++              if (fdev->chan[i])
++                      fsl_dma_chan_remove(fdev->chan[i]);
++      }
+       irq_dispose_mapping(fdev->irq);
+       iounmap(fdev->regs);
+ out_free:
+@@ -1433,6 +1438,7 @@ static int fsldma_of_remove(struct platform_device *op)
+               if (fdev->chan[i])
+                       fsl_dma_chan_remove(fdev->chan[i]);
+       }
++      irq_dispose_mapping(fdev->irq);
+ 
+       iounmap(fdev->regs);
+       kfree(fdev);
+diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c
+index d168410e2338e..2e6081e5ad0b1 100644
+--- a/drivers/gpio/gpio-pcf857x.c
++++ b/drivers/gpio/gpio-pcf857x.c
+@@ -370,7 +370,7 @@ static int pcf857x_probe(struct i2c_client *client,
+        * reset state.  Otherwise it flags pins to be driven low.
+        */
+       gpio->out = ~n_latch;
+-      gpio->status = gpio->out;
++      gpio->status = gpio->read(gpio->client);
+ 
+       status = devm_gpiochip_add_data(&client->dev, &gpio->chip, gpio);
+       if (status < 0)
+diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c 
b/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c
+index e281070611480..fc9a34ed58bd1 100644
+--- a/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c
++++ b/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c
+@@ -279,11 +279,8 @@ int oaktrail_hdmi_i2c_init(struct pci_dev *dev)
+       hdmi_dev = pci_get_drvdata(dev);
+ 
+       i2c_dev = kzalloc(sizeof(struct hdmi_i2c_dev), GFP_KERNEL);
+-      if (i2c_dev == NULL) {
+-              DRM_ERROR("Can't allocate interface\n");
+-              ret = -ENOMEM;
+-              goto exit;
+-      }
++      if (!i2c_dev)
++              return -ENOMEM;
+ 
+       i2c_dev->adap = &oaktrail_hdmi_i2c_adapter;
+       i2c_dev->status = I2C_STAT_INIT;
+@@ -300,16 +297,23 @@ int oaktrail_hdmi_i2c_init(struct pci_dev *dev)
+                         oaktrail_hdmi_i2c_adapter.name, hdmi_dev);
+       if (ret) {
+               DRM_ERROR("Failed to request IRQ for I2C controller\n");
+-              goto err;
++              goto free_dev;
+       }
+ 
+       /* Adapter registration */
+       ret = i2c_add_numbered_adapter(&oaktrail_hdmi_i2c_adapter);
+-      return ret;
++      if (ret) {
++              DRM_ERROR("Failed to add I2C adapter\n");
++              goto free_irq;
++      }
+ 
+-err:
++      return 0;
++
++free_irq:
++      free_irq(dev->irq, hdmi_dev);
++free_dev:
+       kfree(i2c_dev);
+-exit:
++
+       return ret;
+ }
+ 
+diff --git a/drivers/gpu/drm/gma500/psb_drv.c 
b/drivers/gpu/drm/gma500/psb_drv.c
+index 8f3ca526bd1bd..29cb552829fe1 100644
+--- a/drivers/gpu/drm/gma500/psb_drv.c
++++ b/drivers/gpu/drm/gma500/psb_drv.c
+@@ -323,6 +323,8 @@ static int psb_driver_load(struct drm_device *dev, 
unsigned long flags)
+       if (ret)
+               goto out_err;
+ 
++      ret = -ENOMEM;
++
+       dev_priv->mmu = psb_mmu_driver_init(dev, 1, 0, 0);
+       if (!dev_priv->mmu)
+               goto out_err;
+diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c 
b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c
+index c757e2070cac7..636e9df3d1181 100644
+--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c
++++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c
+@@ -146,7 +146,7 @@ const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs = {
+               .enable = dsi_20nm_phy_enable,
+               .disable = dsi_20nm_phy_disable,
+       },
+-      .io_start = { 0xfd998300, 0xfd9a0300 },
++      .io_start = { 0xfd998500, 0xfd9a0500 },
+       .num_dsi_phy = 2,
+ };
+ 
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index d99c9ed5dfe39..40b36e59a8676 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -91,7 +91,7 @@ EXPORT_SYMBOL_GPL(hid_register_report);
+  * Register a new field for this report.
+  */
+ 
+-static struct hid_field *hid_register_field(struct hid_report *report, 
unsigned usages, unsigned values)
++static struct hid_field *hid_register_field(struct hid_report *report, 
unsigned usages)
+ {
+       struct hid_field *field;
+ 
+@@ -102,7 +102,7 @@ static struct hid_field *hid_register_field(struct 
hid_report *report, unsigned
+ 
+       field = kzalloc((sizeof(struct hid_field) +
+                        usages * sizeof(struct hid_usage) +
+-                       values * sizeof(unsigned)), GFP_KERNEL);
++                       usages * sizeof(unsigned)), GFP_KERNEL);
+       if (!field)
+               return NULL;
+ 
+@@ -281,7 +281,7 @@ static int hid_add_field(struct hid_parser *parser, 
unsigned report_type, unsign
+       usages = max_t(unsigned, parser->local.usage_index,
+                                parser->global.report_count);
+ 
+-      field = hid_register_field(report, usages, parser->global.report_count);
++      field = hid_register_field(report, usages);
+       if (!field)
+               return 0;
+ 
+@@ -1109,6 +1109,9 @@ EXPORT_SYMBOL_GPL(hid_open_report);
+ 
+ static s32 snto32(__u32 value, unsigned n)
+ {
++      if (!value || !n)
++              return 0;
++
+       switch (n) {
+       case 8:  return ((__s8)value);
+       case 16: return ((__s16)value);
+diff --git a/drivers/i2c/busses/i2c-brcmstb.c 
b/drivers/i2c/busses/i2c-brcmstb.c
+index 78792b4d6437c..a658f975605a7 100644
+--- a/drivers/i2c/busses/i2c-brcmstb.c
++++ b/drivers/i2c/busses/i2c-brcmstb.c
+@@ -318,7 +318,7 @@ static int brcmstb_send_i2c_cmd(struct brcmstb_i2c_dev 
*dev,
+               goto cmd_out;
+       }
+ 
+-      if ((CMD_RD || CMD_WR) &&
++      if ((cmd == CMD_RD || cmd == CMD_WR) &&
+           bsc_readl(dev, iic_enable) & BSC_IIC_EN_NOACK_MASK) {
+               rc = -EREMOTEIO;
+               dev_dbg(dev->device, "controller received NOACK intr for %s\n",
+diff --git a/drivers/infiniband/core/user_mad.c 
b/drivers/infiniband/core/user_mad.c
+index cf93a96b63249..bc6458d760330 100644
+--- a/drivers/infiniband/core/user_mad.c
++++ b/drivers/infiniband/core/user_mad.c
+@@ -343,6 +343,11 @@ static ssize_t ib_umad_read(struct file *filp, char 
__user *buf,
+ 
+       mutex_lock(&file->mutex);
+ 
++      if (file->agents_dead) {
++              mutex_unlock(&file->mutex);
++              return -EIO;
++      }
++
+       while (list_empty(&file->recv_list)) {
+               mutex_unlock(&file->mutex);
+ 
+@@ -485,7 +490,7 @@ static ssize_t ib_umad_write(struct file *filp, const char 
__user *buf,
+ 
+       agent = __get_agent(file, packet->mad.hdr.id);
+       if (!agent) {
+-              ret = -EINVAL;
++              ret = -EIO;
+               goto err_up;
+       }
+ 
+diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c 
b/drivers/infiniband/sw/rxe/rxe_recv.c
+index db6bb026ae902..ece4fe838e755 100644
+--- a/drivers/infiniband/sw/rxe/rxe_recv.c
++++ b/drivers/infiniband/sw/rxe/rxe_recv.c
+@@ -36,21 +36,26 @@
+ #include "rxe.h"
+ #include "rxe_loc.h"
+ 
++/* check that QP matches packet opcode type and is in a valid state */
+ static int check_type_state(struct rxe_dev *rxe, struct rxe_pkt_info *pkt,
+                           struct rxe_qp *qp)
+ {
++      unsigned int pkt_type;
++
+       if (unlikely(!qp->valid))
+               goto err1;
+ 
++      pkt_type = pkt->opcode & 0xe0;
++
+       switch (qp_type(qp)) {
+       case IB_QPT_RC:
+-              if (unlikely((pkt->opcode & IB_OPCODE_RC) != 0)) {
++              if (unlikely(pkt_type != IB_OPCODE_RC)) {
+                       pr_warn_ratelimited("bad qp type\n");
+                       goto err1;
+               }
+               break;
+       case IB_QPT_UC:
+-              if (unlikely(!(pkt->opcode & IB_OPCODE_UC))) {
++              if (unlikely(pkt_type != IB_OPCODE_UC)) {
+                       pr_warn_ratelimited("bad qp type\n");
+                       goto err1;
+               }
+@@ -58,7 +63,7 @@ static int check_type_state(struct rxe_dev *rxe, struct 
rxe_pkt_info *pkt,
+       case IB_QPT_UD:
+       case IB_QPT_SMI:
+       case IB_QPT_GSI:
+-              if (unlikely(!(pkt->opcode & IB_OPCODE_UD))) {
++              if (unlikely(pkt_type != IB_OPCODE_UD)) {
+                       pr_warn_ratelimited("bad qp type\n");
+                       goto err1;
+               }
+diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
+index f3135ae22df42..1ebce211d875a 100644
+--- a/drivers/input/joydev.c
++++ b/drivers/input/joydev.c
+@@ -448,7 +448,7 @@ static int joydev_handle_JSIOCSAXMAP(struct joydev *joydev,
+       if (IS_ERR(abspam))
+               return PTR_ERR(abspam);
+ 
+-      for (i = 0; i < joydev->nabs; i++) {
++      for (i = 0; i < len && i < joydev->nabs; i++) {
+               if (abspam[i] > ABS_MAX) {
+                       retval = -EINVAL;
+                       goto out;
+@@ -472,6 +472,9 @@ static int joydev_handle_JSIOCSBTNMAP(struct joydev 
*joydev,
+       int i;
+       int retval = 0;
+ 
++      if (len % sizeof(*keypam))
++              return -EINVAL;
++
+       len = min(len, sizeof(joydev->keypam));
+ 
+       /* Validate the map. */
+@@ -479,7 +482,7 @@ static int joydev_handle_JSIOCSBTNMAP(struct joydev 
*joydev,
+       if (IS_ERR(keypam))
+               return PTR_ERR(keypam);
+ 
+-      for (i = 0; i < joydev->nkey; i++) {
++      for (i = 0; i < (len / 2) && i < joydev->nkey; i++) {
+               if (keypam[i] > KEY_MAX || keypam[i] < BTN_MISC) {
+                       retval = -EINVAL;
+                       goto out;
+diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
+index 815b69d35722c..4168ed0ef187e 100644
+--- a/drivers/input/joystick/xpad.c
++++ b/drivers/input/joystick/xpad.c
+@@ -322,6 +322,7 @@ static const struct xpad_device {
+       { 0x1bad, 0xfd00, "Razer Onza TE", 0, XTYPE_XBOX360 },
+       { 0x1bad, 0xfd01, "Razer Onza", 0, XTYPE_XBOX360 },
+       { 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, 
XTYPE_XBOXONE },
++      { 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series 
X|S", 0, XTYPE_XBOXONE },
+       { 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, 
XTYPE_XBOX360 },
+       { 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
+       { 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, 
XTYPE_XBOX360 },
+diff --git a/drivers/input/serio/i8042-x86ia64io.h 
b/drivers/input/serio/i8042-x86ia64io.h
+index 2317f8d3fef6f..ff0f3c3e2f804 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -579,6 +579,10 @@ static const struct dmi_system_id 
i8042_dmi_forcemux_table[] __initconst = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"),
+               },
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible 
Notebook */
++              },
+       },
+       { }
+ };
+diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c
+index 8051a4b704ea3..e2e31cbd6b2c3 100644
+--- a/drivers/input/touchscreen/elo.c
++++ b/drivers/input/touchscreen/elo.c
+@@ -345,8 +345,10 @@ static int elo_connect(struct serio *serio, struct 
serio_driver *drv)
+       switch (elo->id) {
+ 
+       case 0: /* 10-byte protocol */
+-              if (elo_setup_10(elo))
++              if (elo_setup_10(elo)) {
++                      err = -EIO;
+                       goto fail3;
++              }
+ 
+               break;
+ 
+diff --git a/drivers/input/touchscreen/raydium_i2c_ts.c 
b/drivers/input/touchscreen/raydium_i2c_ts.c
+index 1f5b6b5b1018a..4b9b11ebf29d9 100644
+--- a/drivers/input/touchscreen/raydium_i2c_ts.c
++++ b/drivers/input/touchscreen/raydium_i2c_ts.c
+@@ -419,6 +419,7 @@ static int raydium_i2c_write_object(struct i2c_client 
*client,
+                                   enum raydium_bl_ack state)
+ {
+       int error;
++      static const u8 cmd[] = { 0xFF, 0x39 };
+ 
+       error = raydium_i2c_send(client, RM_CMD_BOOT_WRT, data, len);
+       if (error) {
+@@ -427,7 +428,7 @@ static int raydium_i2c_write_object(struct i2c_client 
*client,
+               return error;
+       }
+ 
+-      error = raydium_i2c_send(client, RM_CMD_BOOT_ACK, NULL, 0);
++      error = raydium_i2c_send(client, RM_CMD_BOOT_ACK, cmd, sizeof(cmd));
+       if (error) {
+               dev_err(&client->dev, "Ack obj command failed: %d\n", error);
+               return error;
+diff --git a/drivers/md/dm-era-target.c b/drivers/md/dm-era-target.c
+index 80e3df1f1f7de..c7151febbb094 100644
+--- a/drivers/md/dm-era-target.c
++++ b/drivers/md/dm-era-target.c
+@@ -46,6 +46,7 @@ struct writeset {
+ static void writeset_free(struct writeset *ws)
+ {
+       vfree(ws->bits);
++      ws->bits = NULL;
+ }
+ 
+ static int setup_on_disk_bitset(struct dm_disk_bitset *info,
+@@ -70,8 +71,6 @@ static size_t bitset_size(unsigned nr_bits)
+  */
+ static int writeset_alloc(struct writeset *ws, dm_block_t nr_blocks)
+ {
+-      ws->md.nr_bits = nr_blocks;
+-      ws->md.root = INVALID_WRITESET_ROOT;
+       ws->bits = vzalloc(bitset_size(nr_blocks));
+       if (!ws->bits) {
+               DMERR("%s: couldn't allocate in memory bitset", __func__);
+@@ -84,12 +83,14 @@ static int writeset_alloc(struct writeset *ws, dm_block_t 
nr_blocks)
+ /*
+  * Wipes the in-core bitset, and creates a new on disk bitset.
+  */
+-static int writeset_init(struct dm_disk_bitset *info, struct writeset *ws)
++static int writeset_init(struct dm_disk_bitset *info, struct writeset *ws,
++                       dm_block_t nr_blocks)
+ {
+       int r;
+ 
+-      memset(ws->bits, 0, bitset_size(ws->md.nr_bits));
++      memset(ws->bits, 0, bitset_size(nr_blocks));
+ 
++      ws->md.nr_bits = nr_blocks;
+       r = setup_on_disk_bitset(info, ws->md.nr_bits, &ws->md.root);
+       if (r) {
+               DMERR("%s: setup_on_disk_bitset failed", __func__);
+@@ -133,7 +134,7 @@ static int writeset_test_and_set(struct dm_disk_bitset 
*info,
+ {
+       int r;
+ 
+-      if (!test_and_set_bit(block, ws->bits)) {
++      if (!test_bit(block, ws->bits)) {
+               r = dm_bitset_set_bit(info, ws->md.root, block, &ws->md.root);
+               if (r) {
+                       /* FIXME: fail mode */
+@@ -388,7 +389,7 @@ static void ws_dec(void *context, const void *value)
+ 
+ static int ws_eq(void *context, const void *value1, const void *value2)
+ {
+-      return !memcmp(value1, value2, sizeof(struct writeset_metadata));
++      return !memcmp(value1, value2, sizeof(struct writeset_disk));
+ }
+ 
+ /*----------------------------------------------------------------*/
+@@ -564,6 +565,15 @@ static int open_metadata(struct era_metadata *md)
+       }
+ 
+       disk = dm_block_data(sblock);
++
++      /* Verify the data block size hasn't changed */
++      if (le32_to_cpu(disk->data_block_size) != md->block_size) {
++              DMERR("changing the data block size (from %u to %llu) is not 
supported",
++                    le32_to_cpu(disk->data_block_size), md->block_size);
++              r = -EINVAL;
++              goto bad;
++      }
++
+       r = dm_tm_open_with_sm(md->bm, SUPERBLOCK_LOCATION,
+                              disk->metadata_space_map_root,
+                              sizeof(disk->metadata_space_map_root),
+@@ -575,10 +585,10 @@ static int open_metadata(struct era_metadata *md)
+ 
+       setup_infos(md);
+ 
+-      md->block_size = le32_to_cpu(disk->data_block_size);
+       md->nr_blocks = le32_to_cpu(disk->nr_blocks);
+       md->current_era = le32_to_cpu(disk->current_era);
+ 
++      ws_unpack(&disk->current_writeset, &md->current_writeset->md);
+       md->writeset_tree_root = le64_to_cpu(disk->writeset_tree_root);
+       md->era_array_root = le64_to_cpu(disk->era_array_root);
+       md->metadata_snap = le64_to_cpu(disk->metadata_snap);
+@@ -747,6 +757,12 @@ static int metadata_digest_lookup_writeset(struct 
era_metadata *md,
+       ws_unpack(&disk, &d->writeset);
+       d->value = cpu_to_le32(key);
+ 
++      /*
++       * We initialise another bitset info to avoid any caching side effects
++       * with the previous one.
++       */
++      dm_disk_bitset_init(md->tm, &d->info);
++
+       d->nr_bits = min(d->writeset.nr_bits, md->nr_blocks);
+       d->current_bit = 0;
+       d->step = metadata_digest_transcribe_writeset;
+@@ -760,12 +776,6 @@ static int metadata_digest_start(struct era_metadata *md, 
struct digest *d)
+               return 0;
+ 
+       memset(d, 0, sizeof(*d));
+-
+-      /*
+-       * We initialise another bitset info to avoid any caching side
+-       * effects with the previous one.
+-       */
+-      dm_disk_bitset_init(md->tm, &d->info);
+       d->step = metadata_digest_lookup_writeset;
+ 
+       return 0;
+@@ -803,6 +813,8 @@ static struct era_metadata *metadata_open(struct 
block_device *bdev,
+ 
+ static void metadata_close(struct era_metadata *md)
+ {
++      writeset_free(&md->writesets[0]);
++      writeset_free(&md->writesets[1]);
+       destroy_persistent_data_objects(md);
+       kfree(md);
+ }
+@@ -840,6 +852,7 @@ static int metadata_resize(struct era_metadata *md, void 
*arg)
+       r = writeset_alloc(&md->writesets[1], *new_size);
+       if (r) {
+               DMERR("%s: writeset_alloc failed for writeset 1", __func__);
++              writeset_free(&md->writesets[0]);
+               return r;
+       }
+ 
+@@ -850,6 +863,8 @@ static int metadata_resize(struct era_metadata *md, void 
*arg)
+                           &value, &md->era_array_root);
+       if (r) {
+               DMERR("%s: dm_array_resize failed", __func__);
++              writeset_free(&md->writesets[0]);
++              writeset_free(&md->writesets[1]);
+               return r;
+       }
+ 
+@@ -871,7 +886,6 @@ static int metadata_era_archive(struct era_metadata *md)
+       }
+ 
+       ws_pack(&md->current_writeset->md, &value);
+-      md->current_writeset->md.root = INVALID_WRITESET_ROOT;
+ 
+       keys[0] = md->current_era;
+       __dm_bless_for_disk(&value);
+@@ -883,6 +897,7 @@ static int metadata_era_archive(struct era_metadata *md)
+               return r;
+       }
+ 
++      md->current_writeset->md.root = INVALID_WRITESET_ROOT;
+       md->archived_writesets = true;
+ 
+       return 0;
+@@ -899,7 +914,7 @@ static int metadata_new_era(struct era_metadata *md)
+       int r;
+       struct writeset *new_writeset = next_writeset(md);
+ 
+-      r = writeset_init(&md->bitset_info, new_writeset);
++      r = writeset_init(&md->bitset_info, new_writeset, md->nr_blocks);
+       if (r) {
+               DMERR("%s: writeset_init failed", __func__);
+               return r;
+@@ -952,7 +967,7 @@ static int metadata_commit(struct era_metadata *md)
+       int r;
+       struct dm_block *sblock;
+ 
+-      if (md->current_writeset->md.root != SUPERBLOCK_LOCATION) {
++      if (md->current_writeset->md.root != INVALID_WRITESET_ROOT) {
+               r = dm_bitset_flush(&md->bitset_info, 
md->current_writeset->md.root,
+                                   &md->current_writeset->md.root);
+               if (r) {
+@@ -1227,8 +1242,10 @@ static void process_deferred_bios(struct era *era)
+       int r;
+       struct bio_list deferred_bios, marked_bios;
+       struct bio *bio;
++      struct blk_plug plug;
+       bool commit_needed = false;
+       bool failed = false;
++      struct writeset *ws = era->md->current_writeset;
+ 
+       bio_list_init(&deferred_bios);
+       bio_list_init(&marked_bios);
+@@ -1238,9 +1255,11 @@ static void process_deferred_bios(struct era *era)
+       bio_list_init(&era->deferred_bios);
+       spin_unlock(&era->deferred_lock);
+ 
++      if (bio_list_empty(&deferred_bios))
++              return;
++
+       while ((bio = bio_list_pop(&deferred_bios))) {
+-              r = writeset_test_and_set(&era->md->bitset_info,
+-                                        era->md->current_writeset,
++              r = writeset_test_and_set(&era->md->bitset_info, ws,
+                                         get_block(era, bio));
+               if (r < 0) {
+                       /*
+@@ -1248,7 +1267,6 @@ static void process_deferred_bios(struct era *era)
+                        * FIXME: finish.
+                        */
+                       failed = true;
+-
+               } else if (r == 0)
+                       commit_needed = true;
+ 
+@@ -1264,9 +1282,19 @@ static void process_deferred_bios(struct era *era)
+       if (failed)
+               while ((bio = bio_list_pop(&marked_bios)))
+                       bio_io_error(bio);
+-      else
+-              while ((bio = bio_list_pop(&marked_bios)))
++      else {
++              blk_start_plug(&plug);
++              while ((bio = bio_list_pop(&marked_bios))) {
++                      /*
++                       * Only update the in-core writeset if the on-disk one
++                       * was updated too.
++                       */
++                      if (commit_needed)
++                              set_bit(get_block(era, bio), ws->bits);
+                       generic_make_request(bio);
++              }
++              blk_finish_plug(&plug);
++      }
+ }
+ 
+ static void process_rpc_calls(struct era *era)
+@@ -1487,15 +1515,6 @@ static int era_ctr(struct dm_target *ti, unsigned argc, 
char **argv)
+       }
+       era->md = md;
+ 
+-      era->nr_blocks = calc_nr_blocks(era);
+-
+-      r = metadata_resize(era->md, &era->nr_blocks);
+-      if (r) {
+-              ti->error = "couldn't resize metadata";
+-              era_destroy(era);
+-              return -ENOMEM;
+-      }
+-
+       era->wq = alloc_ordered_workqueue("dm-" DM_MSG_PREFIX, WQ_MEM_RECLAIM);
+       if (!era->wq) {
+               ti->error = "could not create workqueue for metadata object";
+@@ -1573,16 +1592,24 @@ static int era_preresume(struct dm_target *ti)
+       dm_block_t new_size = calc_nr_blocks(era);
+ 
+       if (era->nr_blocks != new_size) {
+-              r = in_worker1(era, metadata_resize, &new_size);
+-              if (r)
++              r = metadata_resize(era->md, &new_size);
++              if (r) {
++                      DMERR("%s: metadata_resize failed", __func__);
++                      return r;
++              }
++
++              r = metadata_commit(era->md);
++              if (r) {
++                      DMERR("%s: metadata_commit failed", __func__);
+                       return r;
++              }
+ 
+               era->nr_blocks = new_size;
+       }
+ 
+       start_worker(era);
+ 
+-      r = in_worker0(era, metadata_new_era);
++      r = in_worker0(era, metadata_era_rollover);
+       if (r) {
+               DMERR("%s: metadata_era_rollover failed", __func__);
+               return r;
+diff --git a/drivers/media/pci/cx25821/cx25821-core.c 
b/drivers/media/pci/cx25821/cx25821-core.c
+index 0d4cacb93664e..d58c58e61bde0 100644
+--- a/drivers/media/pci/cx25821/cx25821-core.c
++++ b/drivers/media/pci/cx25821/cx25821-core.c
+@@ -990,8 +990,10 @@ int cx25821_riscmem_alloc(struct pci_dev *pci,
+       __le32 *cpu;
+       dma_addr_t dma = 0;
+ 
+-      if (NULL != risc->cpu && risc->size < size)
++      if (risc->cpu && risc->size < size) {
+               pci_free_consistent(pci, risc->size, risc->cpu, risc->dma);
++              risc->cpu = NULL;
++      }
+       if (NULL == risc->cpu) {
+               cpu = pci_zalloc_consistent(pci, size, &dma);
+               if (NULL == cpu)
+diff --git a/drivers/media/pci/saa7134/saa7134-empress.c 
b/drivers/media/pci/saa7134/saa7134-empress.c
+index f0fe2524259f0..522e1e18850fb 100644
+--- a/drivers/media/pci/saa7134/saa7134-empress.c
++++ b/drivers/media/pci/saa7134/saa7134-empress.c
+@@ -297,8 +297,11 @@ static int empress_init(struct saa7134_dev *dev)
+       q->lock = &dev->lock;
+       q->dev = &dev->pci->dev;
+       err = vb2_queue_init(q);
+-      if (err)
++      if (err) {
++              video_device_release(dev->empress_dev);
++              dev->empress_dev = NULL;
+               return err;
++      }
+       dev->empress_dev->queue = q;
+ 
+       video_set_drvdata(dev->empress_dev, dev);
+diff --git a/drivers/media/platform/pxa_camera.c 
b/drivers/media/platform/pxa_camera.c
+index 3fab9f776afa7..425eda460e013 100644
+--- a/drivers/media/platform/pxa_camera.c
++++ b/drivers/media/platform/pxa_camera.c
+@@ -1420,6 +1420,9 @@ static int pxac_vb2_prepare(struct vb2_buffer *vb)
+       struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vb->vb2_queue);
+       struct pxa_buffer *buf = vb2_to_pxa_buffer(vb);
+       int ret = 0;
++#ifdef DEBUG
++      int i;
++#endif
+ 
+       switch (pcdev->channels) {
+       case 1:
+diff --git a/drivers/media/platform/vsp1/vsp1_drv.c 
b/drivers/media/platform/vsp1/vsp1_drv.c
+index fcb1838d670d4..8d50a9a9f73da 100644
+--- a/drivers/media/platform/vsp1/vsp1_drv.c
++++ b/drivers/media/platform/vsp1/vsp1_drv.c
+@@ -764,8 +764,10 @@ static int vsp1_probe(struct platform_device *pdev)
+       }
+ 
+ done:
+-      if (ret)
++      if (ret) {
+               pm_runtime_disable(&pdev->dev);
++              rcar_fcp_put(vsp1->fcp);
++      }
+ 
+       return ret;
+ }
+diff --git a/drivers/media/tuners/qm1d1c0042.c 
b/drivers/media/tuners/qm1d1c0042.c
+index 9af2a155cfca9..416d1eeb9c029 100644
+--- a/drivers/media/tuners/qm1d1c0042.c
++++ b/drivers/media/tuners/qm1d1c0042.c
+@@ -352,8 +352,10 @@ static int qm1d1c0042_init(struct dvb_frontend *fe)
+               if (val == reg_initval[reg_index][0x00])
+                       break;
+       }
+-      if (reg_index >= QM1D1C0042_NUM_REG_ROWS)
++      if (reg_index >= QM1D1C0042_NUM_REG_ROWS) {
++              ret = -EINVAL;
+               goto failed;
++      }
+       memcpy(state->regs, reg_initval[reg_index], QM1D1C0042_NUM_REGS);
+       usleep_range(2000, 3000);
+ 
+diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c 
b/drivers/media/usb/dvb-usb-v2/lmedm04.c
+index 5c4aa247d650f..ca4ed2af53207 100644
+--- a/drivers/media/usb/dvb-usb-v2/lmedm04.c
++++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c
+@@ -446,7 +446,7 @@ static int lme2510_int_read(struct dvb_usb_adapter *adap)
+       ep = usb_pipe_endpoint(d->udev, lme_int->lme_urb->pipe);
+ 
+       if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
+-              lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa),
++              lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa);
+ 
+       lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+ 
+diff --git a/drivers/media/usb/tm6000/tm6000-dvb.c 
b/drivers/media/usb/tm6000/tm6000-dvb.c
+index 185c8079d0f93..14f3e8388f357 100644
+--- a/drivers/media/usb/tm6000/tm6000-dvb.c
++++ b/drivers/media/usb/tm6000/tm6000-dvb.c
+@@ -156,6 +156,10 @@ static int tm6000_start_stream(struct tm6000_core *dev)
+       if (ret < 0) {
+               printk(KERN_ERR "tm6000: error %i in %s during pipe reset\n",
+                                                       ret, __func__);
++
++              kfree(dvb->bulk_urb->transfer_buffer);
++              usb_free_urb(dvb->bulk_urb);
++              dvb->bulk_urb = NULL;
+               return ret;
+       } else
+               printk(KERN_ERR "tm6000: pipe resetted\n");
+diff --git a/drivers/media/usb/uvc/uvc_v4l2.c 
b/drivers/media/usb/uvc/uvc_v4l2.c
+index 5156c971c241c..6a19cf94705b1 100644
+--- a/drivers/media/usb/uvc/uvc_v4l2.c
++++ b/drivers/media/usb/uvc/uvc_v4l2.c
+@@ -258,7 +258,9 @@ static int uvc_v4l2_try_format(struct uvc_streaming 
*stream,
+               goto done;
+ 
+       /* After the probe, update fmt with the values returned from
+-       * negotiation with the device.
++       * negotiation with the device. Some devices return invalid bFormatIndex
++       * and bFrameIndex values, in which case we can only assume they have
++       * accepted the requested format as-is.
+        */
+       for (i = 0; i < stream->nformats; ++i) {
+               if (probe->bFormatIndex == stream->format[i].index) {
+@@ -267,11 +269,10 @@ static int uvc_v4l2_try_format(struct uvc_streaming 
*stream,
+               }
+       }
+ 
+-      if (i == stream->nformats) {
+-              uvc_trace(UVC_TRACE_FORMAT, "Unknown bFormatIndex %u\n",
++      if (i == stream->nformats)
++              uvc_trace(UVC_TRACE_FORMAT,
++                        "Unknown bFormatIndex %u, using default\n",
+                         probe->bFormatIndex);
+-              return -EINVAL;
+-      }
+ 
+       for (i = 0; i < format->nframes; ++i) {
+               if (probe->bFrameIndex == format->frame[i].bFrameIndex) {
+@@ -280,11 +281,10 @@ static int uvc_v4l2_try_format(struct uvc_streaming 
*stream,
+               }
+       }
+ 
+-      if (i == format->nframes) {
+-              uvc_trace(UVC_TRACE_FORMAT, "Unknown bFrameIndex %u\n",
++      if (i == format->nframes)
++              uvc_trace(UVC_TRACE_FORMAT,
++                        "Unknown bFrameIndex %u, using default\n",
+                         probe->bFrameIndex);
+-              return -EINVAL;
+-      }
+ 
+       fmt->fmt.pix.width = frame->wWidth;
+       fmt->fmt.pix.height = frame->wHeight;
+diff --git a/drivers/mfd/wm831x-auxadc.c b/drivers/mfd/wm831x-auxadc.c
+index fd789d2eb0f52..9f7ae1e1ebcd6 100644
+--- a/drivers/mfd/wm831x-auxadc.c
++++ b/drivers/mfd/wm831x-auxadc.c
+@@ -98,11 +98,10 @@ static int wm831x_auxadc_read_irq(struct wm831x *wm831x,
+       wait_for_completion_timeout(&req->done, msecs_to_jiffies(500));
+ 
+       mutex_lock(&wm831x->auxadc_lock);
+-
+-      list_del(&req->list);
+       ret = req->val;
+ 
+ out:
++      list_del(&req->list);
+       mutex_unlock(&wm831x->auxadc_lock);
+ 
+       kfree(req);
+diff --git a/drivers/misc/eeprom/eeprom_93xx46.c 
b/drivers/misc/eeprom/eeprom_93xx46.c
+index 94cc035aa8417..d30deee1effda 100644
+--- a/drivers/misc/eeprom/eeprom_93xx46.c
++++ b/drivers/misc/eeprom/eeprom_93xx46.c
+@@ -533,3 +533,4 @@ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs");
+ MODULE_AUTHOR("Anatolij Gustschin <ag...@denx.de>");
+ MODULE_ALIAS("spi:93xx46");
++MODULE_ALIAS("spi:eeprom-93xx46");
+diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c 
b/drivers/misc/vmw_vmci/vmci_queue_pair.c
+index 6ac3c59c9ae78..9c8887d3a4b9c 100644
+--- a/drivers/misc/vmw_vmci/vmci_queue_pair.c
++++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c
+@@ -639,6 +639,9 @@ static struct vmci_queue *qp_host_alloc_queue(u64 size)
+ 
+       queue_page_size = num_pages * sizeof(*queue->kernel_if->u.h.page);
+ 
++      if (queue_size + queue_page_size > KMALLOC_MAX_SIZE)
++              return NULL;
++
+       queue = kzalloc(queue_size + queue_page_size, GFP_KERNEL);
+       if (queue) {
+               queue->q_header = NULL;
+@@ -732,7 +735,7 @@ static void qp_release_pages(struct page **pages,
+ 
+       for (i = 0; i < num_pages; i++) {
+               if (dirty)
+-                      set_page_dirty(pages[i]);
++                      set_page_dirty_lock(pages[i]);
+ 
+               put_page(pages[i]);
+               pages[i] = NULL;
+diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c 
b/drivers/mmc/host/sdhci-esdhc-imx.c
+index b4336534f6285..9e52886b59282 100644
+--- a/drivers/mmc/host/sdhci-esdhc-imx.c
++++ b/drivers/mmc/host/sdhci-esdhc-imx.c
+@@ -1301,9 +1301,10 @@ static int sdhci_esdhc_imx_remove(struct 
platform_device *pdev)
+       struct sdhci_host *host = platform_get_drvdata(pdev);
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+       struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
+-      int dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
++      int dead;
+ 
+       pm_runtime_get_sync(&pdev->dev);
++      dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
+       pm_runtime_disable(&pdev->dev);
+       pm_runtime_put_noidle(&pdev->dev);
+ 
+diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
+index 1bd5f1a18d4e2..003aecc441223 100644
+--- a/drivers/mmc/host/usdhi6rol0.c
++++ b/drivers/mmc/host/usdhi6rol0.c
+@@ -1866,10 +1866,12 @@ static int usdhi6_probe(struct platform_device *pdev)
+ 
+       ret = mmc_add_host(mmc);
+       if (ret < 0)
+-              goto e_clk_off;
++              goto e_release_dma;
+ 
+       return 0;
+ 
++e_release_dma:
++      usdhi6_dma_release(host);
+ e_clk_off:
+       clk_disable_unprepare(host->clk);
+ e_free_mmc:
+diff --git a/drivers/mtd/spi-nor/cadence-quadspi.c 
b/drivers/mtd/spi-nor/cadence-quadspi.c
+index d489fbd07c12b..92de2b408734a 100644
+--- a/drivers/mtd/spi-nor/cadence-quadspi.c
++++ b/drivers/mtd/spi-nor/cadence-quadspi.c
+@@ -461,7 +461,7 @@ static int cqspi_indirect_read_setup(struct spi_nor *nor,
+       /* Setup dummy clock cycles */
+       dummy_clk = nor->read_dummy;
+       if (dummy_clk > CQSPI_DUMMY_CLKS_MAX)
+-              dummy_clk = CQSPI_DUMMY_CLKS_MAX;
++              return -EOPNOTSUPP;
+ 
+       if (dummy_clk / 8) {
+               reg |= (1 << CQSPI_REG_RD_INSTR_MODE_EN_LSB);
+diff --git a/drivers/mtd/spi-nor/hisi-sfc.c b/drivers/mtd/spi-nor/hisi-sfc.c
+index 20378b0d55e98..68be79ba571df 100644
+--- a/drivers/mtd/spi-nor/hisi-sfc.c
++++ b/drivers/mtd/spi-nor/hisi-sfc.c
+@@ -393,8 +393,10 @@ static int hisi_spi_nor_register_all(struct hifmc_host 
*host)
+ 
+       for_each_available_child_of_node(dev->of_node, np) {
+               ret = hisi_spi_nor_register(np, host);
+-              if (ret)
++              if (ret) {
++                      of_node_put(np);
+                       goto fail;
++              }
+ 
+               if (host->num_chip == HIFMC_MAX_CHIP_NUM) {
+                       dev_warn(dev, "Flash device number exceeds the maximum 
chipselect number\n");
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index f9610f860e6d1..148e1ff2e5e0e 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -5095,9 +5095,10 @@ static void bnxt_tx_disable(struct bnxt *bp)
+                       txr->dev_state = BNXT_DEV_STATE_CLOSING;
+               }
+       }
++      /* Drop carrier first to prevent TX timeout */
++      netif_carrier_off(bp->dev);
+       /* Stop all TX queues */
+       netif_tx_disable(bp->dev);
+-      netif_carrier_off(bp->dev);
+ }
+ 
+ static void bnxt_tx_enable(struct bnxt *bp)
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c 
b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+index 2e12ccf73dba0..877b49cc9d3c3 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+@@ -2452,13 +2452,16 @@ static int i40e_tx_enable_csum(struct sk_buff *skb, 
u32 *tx_flags,
+ 
+                       l4_proto = ip.v4->protocol;
+               } else if (*tx_flags & I40E_TX_FLAGS_IPV6) {
++                      int ret;
++
+                       tunnel |= I40E_TX_CTX_EXT_IP_IPV6;
+ 
+                       exthdr = ip.hdr + sizeof(*ip.v6);
+                       l4_proto = ip.v6->nexthdr;
+-                      if (l4.hdr != exthdr)
+-                              ipv6_skip_exthdr(skb, exthdr - skb->data,
+-                                               &l4_proto, &frag_off);
++                      ret = ipv6_skip_exthdr(skb, exthdr - skb->data,
++                                             &l4_proto, &frag_off);
++                      if (ret < 0)
++                              return -1;
+               }
+ 
+               /* define outer transport */
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index 43fb77c6c51ed..9b7ef62ed8fbd 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -5665,8 +5665,6 @@ static void igb_tsync_interrupt(struct igb_adapter 
*adapter)
+               event.type = PTP_CLOCK_PPS;
+               if (adapter->ptp_caps.pps)
+                       ptp_clock_event(adapter->ptp_clock, &event);
+-              else
+-                      dev_err(&adapter->pdev->dev, "unexpected SYS WRAP");
+               ack |= TSINTR_SYS_WRAP;
+       }
+ 
+diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c 
b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+index 7d1e8ab956e64..ab046bffed150 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+@@ -4948,6 +4948,7 @@ static int mlx4_do_mirror_rule(struct mlx4_dev *dev, 
struct res_fs_rule *fs_rule
+ 
+       if (!fs_rule->mirr_mbox) {
+               mlx4_err(dev, "rule mirroring mailbox is null\n");
++              mlx4_free_cmd_mailbox(dev, mailbox);
+               return -EINVAL;
+       }
+       memcpy(mailbox->buf, fs_rule->mirr_mbox, fs_rule->mirr_mbox_size);
+diff --git a/drivers/net/ethernet/sun/sunvnet_common.c 
b/drivers/net/ethernet/sun/sunvnet_common.c
+index 904a5a12a85d0..8408f9551276a 100644
+--- a/drivers/net/ethernet/sun/sunvnet_common.c
++++ b/drivers/net/ethernet/sun/sunvnet_common.c
+@@ -1263,28 +1263,12 @@ int sunvnet_start_xmit_common(struct sk_buff *skb, 
struct net_device *dev,
+               if (vio_version_after_eq(&port->vio, 1, 3))
+                       localmtu -= VLAN_HLEN;
+ 
+-              if (skb->protocol == htons(ETH_P_IP)) {
+-                      struct flowi4 fl4;
+-                      struct rtable *rt = NULL;
+-
+-                      memset(&fl4, 0, sizeof(fl4));
+-                      fl4.flowi4_oif = dev->ifindex;
+-                      fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
+-                      fl4.daddr = ip_hdr(skb)->daddr;
+-                      fl4.saddr = ip_hdr(skb)->saddr;
+-
+-                      rt = ip_route_output_key(dev_net(dev), &fl4);
+-                      rcu_read_unlock();
+-                      if (!IS_ERR(rt)) {
+-                              skb_dst_set(skb, &rt->dst);
+-                              icmp_send(skb, ICMP_DEST_UNREACH,
+-                                        ICMP_FRAG_NEEDED,
+-                                        htonl(localmtu));
+-                      }
+-              }
++              if (skb->protocol == htons(ETH_P_IP))
++                      icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
++                                    htonl(localmtu));
+ #if IS_ENABLED(CONFIG_IPV6)
+               else if (skb->protocol == htons(ETH_P_IPV6))
+-                      icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, localmtu);
++                      icmpv6_ndo_send(skb, ICMPV6_PKT_TOOBIG, 0, localmtu);
+ #endif
+               goto out_dropped;
+       }
+diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
+index fe844888e0ed8..e513736ae0d53 100644
+--- a/drivers/net/gtp.c
++++ b/drivers/net/gtp.c
+@@ -559,9 +559,8 @@ static int gtp_build_skb_ip4(struct sk_buff *skb, struct 
net_device *dev,
+       if (!skb_is_gso(skb) && (iph->frag_off & htons(IP_DF)) &&
+           mtu < ntohs(iph->tot_len)) {
+               netdev_dbg(dev, "packet too big, fragmentation needed\n");
+-              memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
+-              icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
+-                        htonl(mtu));
++              icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED,
++                            htonl(mtu));
+               goto err_rt;
+       }
+ 
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 1c0aec70ee5d2..f9e57405b167b 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -949,6 +949,7 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x1e2d, 0x0082, 5)},    /* Cinterion PHxx,PXxx (2 
RmNet) */
+       {QMI_FIXED_INTF(0x1e2d, 0x0083, 4)},    /* Cinterion PHxx,PXxx (1 RmNet 
+ USB Audio)*/
+       {QMI_QUIRK_SET_DTR(0x1e2d, 0x00b0, 4)}, /* Cinterion CLS8 */
++      {QMI_FIXED_INTF(0x1e2d, 0x00b7, 0)},    /* Cinterion MV31 RmNet */
+       {QMI_FIXED_INTF(0x413c, 0x81a2, 8)},    /* Dell Wireless 5806 Gobi(TM) 
4G LTE Mobile Broadband Card */
+       {QMI_FIXED_INTF(0x413c, 0x81a3, 8)},    /* Dell Wireless 5570 HSPA+ 
(42Mbps) Mobile Broadband Card */
+       {QMI_FIXED_INTF(0x413c, 0x81a4, 8)},    /* Dell Wireless 5570e HSPA+ 
(42Mbps) Mobile Broadband Card */
+diff --git a/drivers/net/wireless/broadcom/b43/phy_n.c 
b/drivers/net/wireless/broadcom/b43/phy_n.c
+index a5557d70689f4..d1afa74aa144b 100644
+--- a/drivers/net/wireless/broadcom/b43/phy_n.c
++++ b/drivers/net/wireless/broadcom/b43/phy_n.c
+@@ -5320,7 +5320,7 @@ static void b43_nphy_restore_cal(struct b43_wldev *dev)
+ 
+       for (i = 0; i < 4; i++) {
+               if (dev->phy.rev >= 3)
+-                      table[i] = coef[i];
++                      coef[i] = table[i];
+               else
+                       coef[i] = 0;
+       }
+diff --git a/drivers/net/xen-netback/interface.c 
b/drivers/net/xen-netback/interface.c
+index e61073c751428..d9d06dc689edc 100644
+--- a/drivers/net/xen-netback/interface.c
++++ b/drivers/net/xen-netback/interface.c
+@@ -161,13 +161,15 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id)
+ {
+       struct xenvif_queue *queue = dev_id;
+       int old;
++      bool has_rx, has_tx;
+ 
+       old = atomic_fetch_or(NETBK_COMMON_EOI, &queue->eoi_pending);
+       WARN(old, "Interrupt while EOI pending\n");
+ 
+-      /* Use bitwise or as we need to call both functions. */
+-      if ((!xenvif_handle_tx_interrupt(queue) |
+-           !xenvif_handle_rx_interrupt(queue))) {
++      has_tx = xenvif_handle_tx_interrupt(queue);
++      has_rx = xenvif_handle_rx_interrupt(queue);
++
++      if (!has_rx && !has_tx) {
+               atomic_andnot(NETBK_COMMON_EOI, &queue->eoi_pending);
+               xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
+       }
+diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c
+index dcb32f34a3024..25b867a9281be 100644
+--- a/drivers/nvdimm/dimm_devs.c
++++ b/drivers/nvdimm/dimm_devs.c
+@@ -317,16 +317,16 @@ static ssize_t state_show(struct device *dev, struct 
device_attribute *attr,
+ }
+ static DEVICE_ATTR_RO(state);
+ 
+-static ssize_t available_slots_show(struct device *dev,
+-              struct device_attribute *attr, char *buf)
++static ssize_t __available_slots_show(struct nvdimm_drvdata *ndd, char *buf)
+ {
+-      struct nvdimm_drvdata *ndd = dev_get_drvdata(dev);
++      struct device *dev;
+       ssize_t rc;
+       u32 nfree;
+ 
+       if (!ndd)
+               return -ENXIO;
+ 
++      dev = ndd->dev;
+       nvdimm_bus_lock(dev);
+       nfree = nd_label_nfree(ndd);
+       if (nfree - 1 > nfree) {
+@@ -338,6 +338,18 @@ static ssize_t available_slots_show(struct device *dev,
+       nvdimm_bus_unlock(dev);
+       return rc;
+ }
++
++static ssize_t available_slots_show(struct device *dev,
++                                  struct device_attribute *attr, char *buf)
++{
++      ssize_t rc;
++
++      device_lock(dev);
++      rc = __available_slots_show(dev_get_drvdata(dev), buf);
++      device_unlock(dev);
++
++      return rc;
++}
+ static DEVICE_ATTR_RO(available_slots);
+ 
+ static struct attribute *nvdimm_attributes[] = {
+diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
+index e9360d5cbcbac..9054b8f218a78 100644
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -1158,8 +1158,16 @@ void __init __weak early_init_dt_add_memory_arch(u64 
base, u64 size)
+ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
+                                       phys_addr_t size, bool nomap)
+ {
+-      if (nomap)
+-              return memblock_remove(base, size);
++      if (nomap) {
++              /*
++               * If the memory is already reserved (by another region), we
++               * should not allow it to be marked nomap.
++               */
++              if (memblock_is_region_reserved(base, size))
++                      return -EBUSY;
++
++              return memblock_mark_nomap(base, size);
++      }
+       return memblock_reserve(base, size);
+ }
+ 
+diff --git a/drivers/pci/syscall.c b/drivers/pci/syscall.c
+index b91c4da683657..7958250856d36 100644
+--- a/drivers/pci/syscall.c
++++ b/drivers/pci/syscall.c
+@@ -21,7 +21,7 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned 
long, dfn,
+       u16 word;
+       u32 dword;
+       long err;
+-      long cfg_ret;
++      int cfg_ret;
+ 
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+@@ -47,7 +47,7 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned 
long, dfn,
+       }
+ 
+       err = -EIO;
+-      if (cfg_ret != PCIBIOS_SUCCESSFUL)
++      if (cfg_ret)
+               goto error;
+ 
+       switch (len) {
+@@ -105,7 +105,7 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, 
unsigned long, dfn,
+               if (err)
+                       break;
+               err = pci_user_write_config_byte(dev, off, byte);
+-              if (err != PCIBIOS_SUCCESSFUL)
++              if (err)
+                       err = -EIO;
+               break;
+ 
+@@ -114,7 +114,7 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, 
unsigned long, dfn,
+               if (err)
+                       break;
+               err = pci_user_write_config_word(dev, off, word);
+-              if (err != PCIBIOS_SUCCESSFUL)
++              if (err)
+                       err = -EIO;
+               break;
+ 
+@@ -123,7 +123,7 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, 
unsigned long, dfn,
+               if (err)
+                       break;
+               err = pci_user_write_config_dword(dev, off, dword);
+-              if (err != PCIBIOS_SUCCESSFUL)
++              if (err)
+                       err = -EIO;
+               break;
+ 
+diff --git a/drivers/power/reset/at91-sama5d2_shdwc.c 
b/drivers/power/reset/at91-sama5d2_shdwc.c
+index 04ca990e8f6cb..dcfc7025f384a 100644
+--- a/drivers/power/reset/at91-sama5d2_shdwc.c
++++ b/drivers/power/reset/at91-sama5d2_shdwc.c
+@@ -36,7 +36,7 @@
+ 
+ #define AT91_SHDW_MR  0x04            /* Shut Down Mode Register */
+ #define AT91_SHDW_WKUPDBC_SHIFT       24
+-#define AT91_SHDW_WKUPDBC_MASK        GENMASK(31, 16)
++#define AT91_SHDW_WKUPDBC_MASK        GENMASK(26, 24)
+ #define AT91_SHDW_WKUPDBC(x)  (((x) << AT91_SHDW_WKUPDBC_SHIFT) \
+                                               & AT91_SHDW_WKUPDBC_MASK)
+ 
+diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c
+index 744d56197286a..1cc6717979537 100644
+--- a/drivers/pwm/pwm-rockchip.c
++++ b/drivers/pwm/pwm-rockchip.c
+@@ -366,7 +366,6 @@ static int rockchip_pwm_probe(struct platform_device *pdev)
+ 
+       ret = pwmchip_add(&pc->chip);
+       if (ret < 0) {
+-              clk_unprepare(pc->clk);
+               dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret);
+       }
+ 
+diff --git a/drivers/regulator/axp20x-regulator.c 
b/drivers/regulator/axp20x-regulator.c
+index a3ade9e4ef478..86776d45b68e1 100644
+--- a/drivers/regulator/axp20x-regulator.c
++++ b/drivers/regulator/axp20x-regulator.c
+@@ -415,7 +415,7 @@ static int axp20x_set_dcdc_freq(struct platform_device 
*pdev, u32 dcdcfreq)
+ static int axp20x_regulator_parse_dt(struct platform_device *pdev)
+ {
+       struct device_node *np, *regulators;
+-      int ret;
++      int ret = 0;
+       u32 dcdcfreq = 0;
+ 
+       np = of_node_get(pdev->dev.parent->of_node);
+@@ -430,13 +430,12 @@ static int axp20x_regulator_parse_dt(struct 
platform_device *pdev)
+               ret = axp20x_set_dcdc_freq(pdev, dcdcfreq);
+               if (ret < 0) {
+                       dev_err(&pdev->dev, "Error setting dcdc frequency: 
%d\n", ret);
+-                      return ret;
+               }
+-
+               of_node_put(regulators);
+       }
+ 
+-      return 0;
++      of_node_put(np);
++      return ret;
+ }
+ 
+ static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 
workmode)
+diff --git a/drivers/scsi/bnx2fc/Kconfig b/drivers/scsi/bnx2fc/Kconfig
+index d401a096dfc7e..2eb2476852b11 100644
+--- a/drivers/scsi/bnx2fc/Kconfig
++++ b/drivers/scsi/bnx2fc/Kconfig
+@@ -4,6 +4,7 @@ config SCSI_BNX2X_FCOE
+       depends on (IPV6 || IPV6=n)
+       depends on LIBFC
+       depends on LIBFCOE
++      depends on MMU
+       select NETDEVICES
+       select ETHERNET
+       select NET_VENDOR_BROADCOM
+diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
+index 58d2d48e16a53..c37e35aeafa44 100644
+--- a/drivers/spi/spi-pxa2xx-pci.c
++++ b/drivers/spi/spi-pxa2xx-pci.c
+@@ -21,7 +21,8 @@ enum {
+       PORT_BSW1,
+       PORT_BSW2,
+       PORT_CE4100,
+-      PORT_LPT,
++      PORT_LPT0,
++      PORT_LPT1,
+ };
+ 
+ struct pxa_spi_info {
+@@ -48,8 +49,10 @@ static struct dw_dma_slave bsw1_rx_param = { .src_id = 7 };
+ static struct dw_dma_slave bsw2_tx_param = { .dst_id = 8 };
+ static struct dw_dma_slave bsw2_rx_param = { .src_id = 9 };
+ 
+-static struct dw_dma_slave lpt_tx_param = { .dst_id = 0 };
+-static struct dw_dma_slave lpt_rx_param = { .src_id = 1 };
++static struct dw_dma_slave lpt1_tx_param = { .dst_id = 0 };
++static struct dw_dma_slave lpt1_rx_param = { .src_id = 1 };
++static struct dw_dma_slave lpt0_tx_param = { .dst_id = 2 };
++static struct dw_dma_slave lpt0_rx_param = { .src_id = 3 };
+ 
+ static bool lpss_dma_filter(struct dma_chan *chan, void *param)
+ {
+@@ -158,12 +161,19 @@ static struct pxa_spi_info spi_info_configs[] = {
+               .num_chipselect = 1,
+               .max_clk_rate = 50000000,
+       },
+-      [PORT_LPT] = {
++      [PORT_LPT0] = {
+               .type = LPSS_LPT_SSP,
+               .port_id = 0,
+               .setup = lpss_spi_setup,
+-              .tx_param = &lpt_tx_param,
+-              .rx_param = &lpt_rx_param,
++              .tx_param = &lpt0_tx_param,
++              .rx_param = &lpt0_rx_param,
++      },
++      [PORT_LPT1] = {
++              .type = LPSS_LPT_SSP,
++              .port_id = 1,
++              .setup = lpss_spi_setup,
++              .tx_param = &lpt1_tx_param,
++              .rx_param = &lpt1_rx_param,
+       },
+ };
+ 
+@@ -251,8 +261,9 @@ static const struct pci_device_id pxa2xx_spi_pci_devices[] 
= {
+       { PCI_VDEVICE(INTEL, 0x2290), PORT_BSW1 },
+       { PCI_VDEVICE(INTEL, 0x22ac), PORT_BSW2 },
+       { PCI_VDEVICE(INTEL, 0x2e6a), PORT_CE4100 },
+-      { PCI_VDEVICE(INTEL, 0x9ce6), PORT_LPT },
+-      { },
++      { PCI_VDEVICE(INTEL, 0x9ce5), PORT_LPT0 },
++      { PCI_VDEVICE(INTEL, 0x9ce6), PORT_LPT1 },
++      { }
+ };
+ MODULE_DEVICE_TABLE(pci, pxa2xx_spi_pci_devices);
+ 
+diff --git a/drivers/spi/spi-s3c24xx-fiq.S b/drivers/spi/spi-s3c24xx-fiq.S
+index 059f2dc1fda2d..1565c792da079 100644
+--- a/drivers/spi/spi-s3c24xx-fiq.S
++++ b/drivers/spi/spi-s3c24xx-fiq.S
+@@ -36,7 +36,6 @@
+       @ and an offset to the irq acknowledgment word
+ 
+ ENTRY(s3c24xx_spi_fiq_rx)
+-s3c24xx_spi_fix_rx:
+       .word   fiq_rx_end - fiq_rx_start
+       .word   fiq_rx_irq_ack - fiq_rx_start
+ fiq_rx_start:
+@@ -50,7 +49,7 @@ fiq_rx_start:
+       strb    fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
+ 
+       subs    fiq_rcount, fiq_rcount, #1
+-      subnes  pc, lr, #4              @@ return, still have work to do
++      subsne  pc, lr, #4              @@ return, still have work to do
+ 
+       @@ set IRQ controller so that next op will trigger IRQ
+       mov     fiq_rtmp, #0
+@@ -62,7 +61,6 @@ fiq_rx_irq_ack:
+ fiq_rx_end:
+ 
+ ENTRY(s3c24xx_spi_fiq_txrx)
+-s3c24xx_spi_fiq_txrx:
+       .word   fiq_txrx_end - fiq_txrx_start
+       .word   fiq_txrx_irq_ack - fiq_txrx_start
+ fiq_txrx_start:
+@@ -77,7 +75,7 @@ fiq_txrx_start:
+       strb    fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
+ 
+       subs    fiq_rcount, fiq_rcount, #1
+-      subnes  pc, lr, #4              @@ return, still have work to do
++      subsne  pc, lr, #4              @@ return, still have work to do
+ 
+       mov     fiq_rtmp, #0
+       str     fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD  - S3C24XX_VA_IRQ ]
+@@ -89,7 +87,6 @@ fiq_txrx_irq_ack:
+ fiq_txrx_end:
+ 
+ ENTRY(s3c24xx_spi_fiq_tx)
+-s3c24xx_spi_fix_tx:
+       .word   fiq_tx_end - fiq_tx_start
+       .word   fiq_tx_irq_ack - fiq_tx_start
+ fiq_tx_start:
+@@ -102,7 +99,7 @@ fiq_tx_start:
+       strb    fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ]
+ 
+       subs    fiq_rcount, fiq_rcount, #1
+-      subnes  pc, lr, #4              @@ return, still have work to do
++      subsne  pc, lr, #4              @@ return, still have work to do
+ 
+       mov     fiq_rtmp, #0
+       str     fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD  - S3C24XX_VA_IRQ ]
+diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c 
b/drivers/staging/rtl8188eu/os_dep/usb_intf.c
+index c14088075c597..3afdb326e2243 100644
+--- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c
++++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c
+@@ -49,6 +49,7 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
+       {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */
+       {USB_DEVICE(0x2C4E, 0x0102)}, /* MERCUSYS MW150US v2 */
+       {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */
++      {USB_DEVICE(0x7392, 0xb811)}, /* Edimax EW-7811UN V2 */
+       {USB_DEVICE(USB_VENDER_ID_REALTEK, 0xffef)}, /* Rosewill RNX-N150NUB */
+       {}      /* Terminating entry */
+ };
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 5d109717ac4e3..2fc735efc3dc5 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -230,6 +230,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */
+       { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
+ 
++      /* ELMO L-12F document camera */
++      { USB_DEVICE(0x09a1, 0x0028), .driver_info = USB_QUIRK_DELAY_CTRL_MSG },
++
+       /* Broadcom BCM92035DGROM BT dongle */
+       { USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
+index 120c8f716acf8..f2c7cd22b73f2 100644
+--- a/drivers/usb/dwc2/hcd.c
++++ b/drivers/usb/dwc2/hcd.c
+@@ -1425,19 +1425,20 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg 
*hsotg,
+                       if (num_packets > max_hc_pkt_count) {
+                               num_packets = max_hc_pkt_count;
+                               chan->xfer_len = num_packets * chan->max_packet;
++                      } else if (chan->ep_is_in) {
++                              /*
++                               * Always program an integral # of max packets
++                               * for IN transfers.
++                               * Note: This assumes that the input buffer is
++                               * aligned and sized accordingly.
++                               */
++                              chan->xfer_len = num_packets * chan->max_packet;
+                       }
+               } else {
+                       /* Need 1 packet for transfer length of 0 */
+                       num_packets = 1;
+               }
+ 
+-              if (chan->ep_is_in)
+-                      /*
+-                       * Always program an integral # of max packets for IN
+-                       * transfers
+-                       */
+-                      chan->xfer_len = num_packets * chan->max_packet;
+-
+               if (chan->ep_type == USB_ENDPOINT_XFER_INT ||
+                   chan->ep_type == USB_ENDPOINT_XFER_ISOC)
+                       /*
+diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c
+index 8066fa9ac97ba..e39210bd97100 100644
+--- a/drivers/usb/dwc2/hcd_intr.c
++++ b/drivers/usb/dwc2/hcd_intr.c
+@@ -488,7 +488,7 @@ static int dwc2_update_urb_state(struct dwc2_hsotg *hsotg,
+                                                     &short_read);
+ 
+       if (urb->actual_length + xfer_length > urb->length) {
+-              dev_warn(hsotg->dev, "%s(): trimming xfer length\n", __func__);
++              dev_dbg(hsotg->dev, "%s(): trimming xfer length\n", __func__);
+               xfer_length = urb->length - urb->actual_length;
+       }
+ 
+@@ -1921,6 +1921,18 @@ error:
+               qtd->error_count++;
+               dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb,
+                                         qtd, DWC2_HC_XFER_XACT_ERR);
++              /*
++               * We can get here after a completed transaction
++               * (urb->actual_length >= urb->length) which was not reported
++               * as completed. If that is the case, and we do not abort
++               * the transfer, a transfer of size 0 will be enqueued
++               * subsequently. If urb->actual_length is not DMA-aligned,
++               * the buffer will then point to an unaligned address, and
++               * the resulting behavior is undefined. Bail out in that
++               * situation.
++               */
++              if (qtd->urb->actual_length >= qtd->urb->length)
++                      qtd->error_count = 3;
+               dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd);
+               dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR);
+       }
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index bf36eda082d65..e0fb7b3723c53 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -528,8 +528,23 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, 
struct dwc3_ep *dep,
+               params.param0 |= DWC3_DEPCFG_FIFO_NUMBER(dep->number >> 1);
+ 
+       if (desc->bInterval) {
+-              params.param1 |= DWC3_DEPCFG_BINTERVAL_M1(desc->bInterval - 1);
+-              dep->interval = 1 << (desc->bInterval - 1);
++              u8 bInterval_m1;
++
++              /*
++               * Valid range for DEPCFG.bInterval_m1 is from 0 to 13, and it
++               * must be set to 0 when the controller operates in full-speed.
++               */
++              bInterval_m1 = min_t(u8, desc->bInterval - 1, 13);
++              if (dwc->gadget.speed == USB_SPEED_FULL)
++                      bInterval_m1 = 0;
++
++              if (usb_endpoint_type(desc) == USB_ENDPOINT_XFER_INT &&
++                  dwc->gadget.speed == USB_SPEED_FULL)
++                      dep->interval = desc->bInterval;
++              else
++                      dep->interval = 1 << (desc->bInterval - 1);
++
++              params.param1 |= DWC3_DEPCFG_BINTERVAL_M1(bInterval_m1);
+       }
+ 
+       return dwc3_send_gadget_ep_cmd(dep, DWC3_DEPCMD_SETEPCONFIG, &params);
+diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
+index c232229162e0c..fcc709c043f09 100644
+--- a/drivers/usb/musb/musb_core.c
++++ b/drivers/usb/musb/musb_core.c
+@@ -2097,32 +2097,35 @@ int musb_queue_resume_work(struct musb *musb,
+ {
+       struct musb_pending_work *w;
+       unsigned long flags;
++      bool is_suspended;
+       int error;
+ 
+       if (WARN_ON(!callback))
+               return -EINVAL;
+ 
+-      if (pm_runtime_active(musb->controller))
+-              return callback(musb, data);
++      spin_lock_irqsave(&musb->list_lock, flags);
++      is_suspended = musb->is_runtime_suspended;
++
++      if (is_suspended) {
++              w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC);
++              if (!w) {
++                      error = -ENOMEM;
++                      goto out_unlock;
++              }
+ 
+-      w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC);
+-      if (!w)
+-              return -ENOMEM;
++              w->callback = callback;
++              w->data = data;
+ 
+-      w->callback = callback;
+-      w->data = data;
+-      spin_lock_irqsave(&musb->list_lock, flags);
+-      if (musb->is_runtime_suspended) {
+               list_add_tail(&w->node, &musb->pending_list);
+               error = 0;
+-      } else {
+-              dev_err(musb->controller, "could not add resume work %p\n",
+-                      callback);
+-              devm_kfree(musb->controller, w);
+-              error = -EINPROGRESS;
+       }
++
++out_unlock:
+       spin_unlock_irqrestore(&musb->list_lock, flags);
+ 
++      if (!is_suspended)
++              error = callback(musb, data);
++
+       return error;
+ }
+ EXPORT_SYMBOL_GPL(musb_queue_resume_work);
+diff --git a/drivers/usb/renesas_usbhs/fifo.c 
b/drivers/usb/renesas_usbhs/fifo.c
+index f6a1ae8abb214..7af85c10caea1 100644
+--- a/drivers/usb/renesas_usbhs/fifo.c
++++ b/drivers/usb/renesas_usbhs/fifo.c
+@@ -140,6 +140,8 @@ struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, 
struct usbhs_pkt *pkt)
+                       usbhsf_dma_unmap(pkt);
+               }
+ 
++              usbhs_pipe_running(pipe, 0);
++
+               __usbhsf_pkt_del(pkt);
+       }
+ 
+diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
+index 76c9276b2d75f..b16e37f43247b 100644
+--- a/drivers/usb/serial/mos7720.c
++++ b/drivers/usb/serial/mos7720.c
+@@ -1239,8 +1239,10 @@ static int mos7720_write(struct tty_struct *tty, struct 
usb_serial_port *port,
+       if (urb->transfer_buffer == NULL) {
+               urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
+                                              GFP_ATOMIC);
+-              if (!urb->transfer_buffer)
++              if (!urb->transfer_buffer) {
++                      bytes_sent = -ENOMEM;
+                       goto exit;
++              }
+       }
+       transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
+ 
+diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
+index 0c92252c93163..31ca5d925b364 100644
+--- a/drivers/usb/serial/mos7840.c
++++ b/drivers/usb/serial/mos7840.c
+@@ -1362,8 +1362,10 @@ static int mos7840_write(struct tty_struct *tty, struct 
usb_serial_port *port,
+       if (urb->transfer_buffer == NULL) {
+               urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE,
+                                              GFP_ATOMIC);
+-              if (!urb->transfer_buffer)
++              if (!urb->transfer_buffer) {
++                      bytes_sent = -ENOMEM;
+                       goto exit;
++              }
+       }
+       transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE);
+ 
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 3c536eed07541..351be73862809 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1551,7 +1551,8 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1272, 0xff, 0xff, 
0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1273, 0xff, 0xff, 
0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1274, 0xff, 0xff, 
0xff) },
+-      { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1275, 0xff, 0xff, 
0xff) },
++      { USB_DEVICE(ZTE_VENDOR_ID, 0x1275),    /* ZTE P685M */
++        .driver_info = RSVD(3) | RSVD(4) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1276, 0xff, 0xff, 
0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1277, 0xff, 0xff, 
0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1278, 0xff, 0xff, 
0xff) },
+diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
+index 5d3b0db5ce0af..c0d4e645f3b51 100644
+--- a/drivers/video/fbdev/Kconfig
++++ b/drivers/video/fbdev/Kconfig
+@@ -1405,6 +1405,7 @@ config FB_ATY
+       select FB_CFB_IMAGEBLIT
+       select FB_BACKLIGHT if FB_ATY_BACKLIGHT
+       select FB_MACMODES if PPC
++      select FB_ATY_CT if SPARC64 && PCI
+       help
+         This driver supports graphics boards with the ATI Mach64 chips.
+         Say Y if you have such a graphics board.
+@@ -1415,7 +1416,6 @@ config FB_ATY
+ config FB_ATY_CT
+       bool "Mach64 CT/VT/GT/LT (incl. 3D RAGE) support"
+       depends on PCI && FB_ATY
+-      default y if SPARC64 && PCI
+       help
+         Say Y here to support use of ATI's 64-bit Rage boards (or other
+         boards based on the Mach64 CT, VT, GT, and LT chipsets) as a
+diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
+index 89eeca5bb23e5..0eebd0bd6bc0e 100644
+--- a/fs/btrfs/ctree.c
++++ b/fs/btrfs/ctree.c
+@@ -279,9 +279,12 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans,
+               ret = btrfs_inc_ref(trans, root, cow, 1);
+       else
+               ret = btrfs_inc_ref(trans, root, cow, 0);
+-
+-      if (ret)
++      if (ret) {
++              btrfs_tree_unlock(cow);
++              free_extent_buffer(cow);
++              btrfs_abort_transaction(trans, ret);
+               return ret;
++      }
+ 
+       btrfs_mark_buffer_dirty(cow);
+       *cow_ret = cow;
+diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
+index 8e93bd391b352..f74cb39a64e5e 100644
+--- a/fs/btrfs/free-space-cache.c
++++ b/fs/btrfs/free-space-cache.c
+@@ -753,8 +753,10 @@ static int __load_free_space_cache(struct btrfs_root 
*root, struct inode *inode,
+       while (num_entries) {
+               e = kmem_cache_zalloc(btrfs_free_space_cachep,
+                                     GFP_NOFS);
+-              if (!e)
++              if (!e) {
++                      ret = -ENOMEM;
+                       goto free_cache;
++              }
+ 
+               ret = io_ctl_read_entry(&io_ctl, e, &type);
+               if (ret) {
+@@ -763,6 +765,7 @@ static int __load_free_space_cache(struct btrfs_root 
*root, struct inode *inode,
+               }
+ 
+               if (!e->bytes) {
++                      ret = -1;
+                       kmem_cache_free(btrfs_free_space_cachep, e);
+                       goto free_cache;
+               }
+@@ -782,6 +785,7 @@ static int __load_free_space_cache(struct btrfs_root 
*root, struct inode *inode,
+                       num_bitmaps--;
+                       e->bitmap = kzalloc(PAGE_SIZE, GFP_NOFS);
+                       if (!e->bitmap) {
++                              ret = -ENOMEM;
+                               kmem_cache_free(
+                                       btrfs_free_space_cachep, e);
+                               goto free_cache;
+diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
+index 1003b983a8d7a..cd5b86d80e7a0 100644
+--- a/fs/btrfs/relocation.c
++++ b/fs/btrfs/relocation.c
+@@ -1335,9 +1335,7 @@ static void __del_reloc_root(struct btrfs_root *root)
+                       RB_CLEAR_NODE(&node->rb_node);
+               }
+               spin_unlock(&rc->reloc_root_tree.lock);
+-              if (!node)
+-                      return;
+-              BUG_ON((struct btrfs_root *)node->data != root);
++              ASSERT(!node || (struct btrfs_root *)node->data == root);
+       }
+ 
+       spin_lock(&root->fs_info->trans_lock);
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index af78de9ef036c..8508dc8270593 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -3488,6 +3488,7 @@ int cifs_setup_cifs_sb(struct smb_vol *pvolume_info,
+               cifs_sb->prepath = kstrdup(pvolume_info->prepath, GFP_KERNEL);
+               if (cifs_sb->prepath == NULL)
+                       return -ENOMEM;
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
+       }
+ 
+       return 0;
+diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
+index 0bedcd70b51f4..17f1398929353 100644
+--- a/fs/f2fs/file.c
++++ b/fs/f2fs/file.c
+@@ -682,7 +682,8 @@ static void __setattr_copy(struct inode *inode, const 
struct iattr *attr)
+       if (ia_valid & ATTR_MODE) {
+               umode_t mode = attr->ia_mode;
+ 
+-              if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
++              if (!in_group_p(inode->i_gid) &&
++                      !capable_wrt_inode_uidgid(inode, CAP_FSETID))
+                       mode &= ~S_ISGID;
+               set_acl_inode(inode, mode);
+       }
+diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c
+index 3c3d037df824e..3cbc9147286dd 100644
+--- a/fs/gfs2/lock_dlm.c
++++ b/fs/gfs2/lock_dlm.c
+@@ -284,7 +284,6 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
+ {
+       struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
+       struct lm_lockstruct *ls = &sdp->sd_lockstruct;
+-      int lvb_needs_unlock = 0;
+       int error;
+ 
+       if (gl->gl_lksb.sb_lkid == 0) {
+@@ -297,13 +296,10 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
+       gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
+       gfs2_update_request_times(gl);
+ 
+-      /* don't want to skip dlm_unlock writing the lvb when lock is ex */
+-
+-      if (gl->gl_lksb.sb_lvbptr && (gl->gl_state == LM_ST_EXCLUSIVE))
+-              lvb_needs_unlock = 1;
++      /* don't want to skip dlm_unlock writing the lvb when lock has one */
+ 
+       if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
+-          !lvb_needs_unlock) {
++          !gl->gl_lksb.sb_lvbptr) {
+               gfs2_glock_free(gl);
+               return;
+       }
+diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c
+index e7599615e4e04..e876a30f90735 100644
+--- a/fs/isofs/dir.c
++++ b/fs/isofs/dir.c
+@@ -151,6 +151,7 @@ static int do_isofs_readdir(struct inode *inode, struct 
file *file,
+                       printk(KERN_NOTICE "iso9660: Corrupted directory entry"
+                              " in block %lu of inode %lu\n", block,
+                              inode->i_ino);
++                      brelse(bh);
+                       return -EIO;
+               }
+ 
+diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c
+index aee592767f1d0..2c43de1b034d2 100644
+--- a/fs/isofs/namei.c
++++ b/fs/isofs/namei.c
+@@ -101,6 +101,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
+                       printk(KERN_NOTICE "iso9660: Corrupted directory entry"
+                              " in block %lu of inode %lu\n", block,
+                              dir->i_ino);
++                      brelse(bh);
+                       return 0;
+               }
+ 
+diff --git a/fs/jffs2/summary.c b/fs/jffs2/summary.c
+index be7c8a6a57480..4fe64519870f1 100644
+--- a/fs/jffs2/summary.c
++++ b/fs/jffs2/summary.c
+@@ -783,6 +783,8 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, 
struct jffs2_eraseblock
+                                       dbg_summary("Writing unknown 
RWCOMPAT_COPY node type %x\n",
+                                                   
je16_to_cpu(temp->u.nodetype));
+                                       
jffs2_sum_disable_collecting(c->summary);
++                                      /* The above call removes the list, 
nothing more to do */
++                                      goto bail_rwcompat;
+                               } else {
+                                       BUG();  /* unknown node in summary 
information */
+                               }
+@@ -794,6 +796,7 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, 
struct jffs2_eraseblock
+ 
+               c->summary->sum_num--;
+       }
++ bail_rwcompat:
+ 
+       jffs2_sum_reset_collected(c->summary);
+ 
+diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c
+index 2d514c7affc2a..9ff510a489cb1 100644
+--- a/fs/jfs/jfs_dmap.c
++++ b/fs/jfs/jfs_dmap.c
+@@ -1669,7 +1669,7 @@ s64 dbDiscardAG(struct inode *ip, int agno, s64 minlen)
+               } else if (rc == -ENOSPC) {
+                       /* search for next smaller log2 block */
+                       l2nb = BLKSTOL2(nblocks) - 1;
+-                      nblocks = 1 << l2nb;
++                      nblocks = 1LL << l2nb;
+               } else {
+                       /* Trim any already allocated blocks */
+                       jfs_error(bmp->db_ipbmap->i_sb, "-EIO\n");
+diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
+index 2aa073b82d30f..a4fa548785d60 100644
+--- a/fs/ntfs/inode.c
++++ b/fs/ntfs/inode.c
+@@ -661,6 +661,12 @@ static int ntfs_read_locked_inode(struct inode *vi)
+       }
+       a = ctx->attr;
+       /* Get the standard information attribute value. */
++      if ((u8 *)a + le16_to_cpu(a->data.resident.value_offset)
++                      + le32_to_cpu(a->data.resident.value_length) >
++                      (u8 *)ctx->mrec + vol->mft_record_size) {
++              ntfs_error(vi->i_sb, "Corrupt standard information attribute in 
inode.");
++              goto unm_err_out;
++      }
+       si = (STANDARD_INFORMATION*)((u8*)a +
+                       le16_to_cpu(a->data.resident.value_offset));
+ 
+diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c
+index 5e8709aa1e7ec..89c71d32dc05b 100644
+--- a/fs/ocfs2/cluster/heartbeat.c
++++ b/fs/ocfs2/cluster/heartbeat.c
+@@ -2155,7 +2155,7 @@ static struct config_item 
*o2hb_heartbeat_group_make_item(struct config_group *g
+                       o2hb_nego_timeout_handler,
+                       reg, NULL, &reg->hr_handler_list);
+       if (ret)
+-              goto free;
++              goto remove_item;
+ 
+       ret = o2net_register_handler(O2HB_NEGO_APPROVE_MSG, reg->hr_key,
+                       sizeof(struct o2hb_nego_msg),
+@@ -2174,6 +2174,12 @@ static struct config_item 
*o2hb_heartbeat_group_make_item(struct config_group *g
+ 
+ unregister_handler:
+       o2net_unregister_handler_list(&reg->hr_handler_list);
++remove_item:
++      spin_lock(&o2hb_live_lock);
++      list_del(&reg->hr_all_item);
++      if (o2hb_global_heartbeat_active())
++              clear_bit(reg->hr_region_num, o2hb_region_bitmap);
++      spin_unlock(&o2hb_live_lock);
+ free:
+       kfree(reg);
+       return ERR_PTR(ret);
+diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h
+index 57086e9fc64c6..d87dabac04c1b 100644
+--- a/include/linux/icmpv6.h
++++ b/include/linux/icmpv6.h
+@@ -2,6 +2,7 @@
+ #define _LINUX_ICMPV6_H
+ 
+ #include <linux/skbuff.h>
++#include <linux/ipv6.h>
+ #include <uapi/linux/icmpv6.h>
+ 
+ static inline struct icmp6hdr *icmp6_hdr(const struct sk_buff *skb)
+@@ -12,21 +13,64 @@ static inline struct icmp6hdr *icmp6_hdr(const struct 
sk_buff *skb)
+ #include <linux/netdevice.h>
+ 
+ #if IS_ENABLED(CONFIG_IPV6)
+-extern void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info);
+ 
+ typedef void ip6_icmp_send_t(struct sk_buff *skb, u8 type, u8 code, __u32 
info,
+-                           const struct in6_addr *force_saddr);
++                           const struct in6_addr *force_saddr,
++                           const struct inet6_skb_parm *parm);
++void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
++              const struct in6_addr *force_saddr,
++              const struct inet6_skb_parm *parm);
++#if IS_BUILTIN(CONFIG_IPV6)
++static inline void __icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 
info,
++                               const struct inet6_skb_parm *parm)
++{
++      icmp6_send(skb, type, code, info, NULL, parm);
++}
++static inline int inet6_register_icmp_sender(ip6_icmp_send_t *fn)
++{
++      BUILD_BUG_ON(fn != icmp6_send);
++      return 0;
++}
++static inline int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn)
++{
++      BUILD_BUG_ON(fn != icmp6_send);
++      return 0;
++}
++#else
++extern void __icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
++                        const struct inet6_skb_parm *parm);
+ extern int inet6_register_icmp_sender(ip6_icmp_send_t *fn);
+ extern int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn);
++#endif
++
++static inline void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 
info)
++{
++      __icmpv6_send(skb, type, code, info, IP6CB(skb));
++}
++
+ int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int nhs, int type,
+                              unsigned int data_len);
+ 
++#if IS_ENABLED(CONFIG_NF_NAT)
++void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info);
++#else
++static inline void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, 
__u32 info)
++{
++      struct inet6_skb_parm parm = { 0 };
++      __icmpv6_send(skb_in, type, code, info, &parm);
++}
++#endif
++
+ #else
+ 
+ static inline void icmpv6_send(struct sk_buff *skb,
+                              u8 type, u8 code, __u32 info)
+ {
++}
+ 
++static inline void icmpv6_ndo_send(struct sk_buff *skb,
++                                 u8 type, u8 code, __u32 info)
++{
+ }
+ #endif
+ 
+diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
+index b9dfca557a6c2..97a4e1667f73d 100644
+--- a/include/linux/ipv6.h
++++ b/include/linux/ipv6.h
+@@ -2,6 +2,7 @@
+ #define _IPV6_H
+ 
+ #include <uapi/linux/ipv6.h>
++#include <uapi/linux/icmpv6.h>
+ 
+ #define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
+ #define ipv6_authlen(p) (((p)->hdrlen+2) << 2)
+@@ -73,7 +74,6 @@ struct ipv6_params {
+       __s32 autoconf;
+ };
+ extern struct ipv6_params ipv6_defaults;
+-#include <linux/icmpv6.h>
+ #include <linux/tcp.h>
+ #include <linux/udp.h>
+ 
+diff --git a/include/net/icmp.h b/include/net/icmp.h
+index 8665bf24e3b7a..ffe4a5d2bbe7e 100644
+--- a/include/net/icmp.h
++++ b/include/net/icmp.h
+@@ -47,6 +47,16 @@ static inline void icmp_send(struct sk_buff *skb_in, int 
type, int code, __be32
+       __icmp_send(skb_in, type, code, info, &IPCB(skb_in)->opt);
+ }
+ 
++#if IS_ENABLED(CONFIG_NF_NAT)
++void icmp_ndo_send(struct sk_buff *skb_in, int type, int code, __be32 info);
++#else
++static inline void icmp_ndo_send(struct sk_buff *skb_in, int type, int code, 
__be32 info)
++{
++      struct ip_options opts = { 0 };
++      __icmp_send(skb_in, type, code, info, &opts);
++}
++#endif
++
+ int icmp_rcv(struct sk_buff *skb);
+ void icmp_err(struct sk_buff *skb, u32 info);
+ int icmp_init(void);
+diff --git a/kernel/debug/kdb/kdb_private.h b/kernel/debug/kdb/kdb_private.h
+index 533e04e75a9c4..f51b762d68864 100644
+--- a/kernel/debug/kdb/kdb_private.h
++++ b/kernel/debug/kdb/kdb_private.h
+@@ -234,7 +234,7 @@ extern struct task_struct *kdb_curr_task(int);
+ #define       kdb_do_each_thread(g, p) do_each_thread(g, p)
+ #define       kdb_while_each_thread(g, p) while_each_thread(g, p)
+ 
+-#define GFP_KDB (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)
++#define GFP_KDB (in_dbg_master() ? GFP_ATOMIC : GFP_KERNEL)
+ 
+ extern void *debug_kmalloc(size_t size, gfp_t flags);
+ extern void debug_kfree(void *);
+diff --git a/kernel/futex.c b/kernel/futex.c
+index b65dbb5d60bb1..0b49a8e1e1bec 100644
+--- a/kernel/futex.c
++++ b/kernel/futex.c
+@@ -1207,11 +1207,11 @@ static int handle_exit_race(u32 __user *uaddr, u32 
uval,
+       u32 uval2;
+ 
+       /*
+-       * If the futex exit state is not yet FUTEX_STATE_DEAD, wait
+-       * for it to finish.
++       * If the futex exit state is not yet FUTEX_STATE_DEAD, tell the
++       * caller that the alleged owner is busy.
+        */
+       if (tsk && tsk->futex_state != FUTEX_STATE_DEAD)
+-              return -EAGAIN;
++              return -EBUSY;
+ 
+       /*
+        * Reread the user space value to handle the following situation:
+@@ -2424,9 +2424,6 @@ static int __fixup_pi_state_owner(u32 __user *uaddr, 
struct futex_q *q,
+       int err = 0;
+ 
+       oldowner = pi_state->owner;
+-      /* Owner died? */
+-      if (!pi_state->owner)
+-              newtid |= FUTEX_OWNER_DIED;
+ 
+       /*
+        * We are here because either:
+@@ -2484,6 +2481,9 @@ retry:
+       }
+ 
+       newtid = task_pid_vnr(newowner) | FUTEX_WAITERS;
++      /* Owner died? */
++      if (!pi_state->owner)
++              newtid |= FUTEX_OWNER_DIED;
+ 
+       if (get_futex_value_locked(&uval, uaddr))
+               goto handle_fault;
+diff --git a/kernel/module.c b/kernel/module.c
+index 0219301b6109c..cc401a7ffc2e3 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2209,6 +2209,21 @@ static int verify_export_symbols(struct module *mod)
+       return 0;
+ }
+ 
++static bool ignore_undef_symbol(Elf_Half emachine, const char *name)
++{
++      /*
++       * On x86, PIC code and Clang non-PIC code may have call foo@PLT. GNU as
++       * before 2.37 produces an unreferenced _GLOBAL_OFFSET_TABLE_ on x86-64.
++       * i386 has a similar problem but may not deserve a fix.
++       *
++       * If we ever have to ignore many symbols, consider refactoring the 
code to
++       * only warn if referenced by a relocation.
++       */
++      if (emachine == EM_386 || emachine == EM_X86_64)
++              return !strcmp(name, "_GLOBAL_OFFSET_TABLE_");
++      return false;
++}
++
+ /* Change all symbols so that st_value encodes the pointer directly. */
+ static int simplify_symbols(struct module *mod, const struct load_info *info)
+ {
+@@ -2254,8 +2269,10 @@ static int simplify_symbols(struct module *mod, const 
struct load_info *info)
+                               break;
+                       }
+ 
+-                      /* Ok if weak.  */
+-                      if (!ksym && ELF_ST_BIND(sym[i].st_info) == STB_WEAK)
++                      /* Ok if weak or ignored.  */
++                      if (!ksym &&
++                          (ELF_ST_BIND(sym[i].st_info) == STB_WEAK ||
++                           ignore_undef_symbol(info->hdr->e_machine, name)))
+                               break;
+ 
+                       pr_warn("%s: Unknown symbol %s (err %li)\n",
+diff --git a/kernel/seccomp.c b/kernel/seccomp.c
+index 3975856d476c2..ac56ebffeb955 100644
+--- a/kernel/seccomp.c
++++ b/kernel/seccomp.c
+@@ -669,6 +669,8 @@ static int __seccomp_filter(int this_syscall, const struct 
seccomp_data *sd,
+                           const bool recheck_after_trace)
+ {
+       BUG();
++
++      return -1;
+ }
+ #endif
+ 
+diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
+index c8e7cc0e6ff6e..88ae873ee6cf3 100644
+--- a/kernel/tracepoint.c
++++ b/kernel/tracepoint.c
+@@ -59,6 +59,12 @@ struct tp_probes {
+       struct tracepoint_func probes[0];
+ };
+ 
++/* Called in removal of a func but failed to allocate a new tp_funcs */
++static void tp_stub_func(void)
++{
++      return;
++}
++
+ static inline void *allocate_probes(int count)
+ {
+       struct tp_probes *p  = kmalloc(count * sizeof(struct tracepoint_func)
+@@ -97,6 +103,7 @@ func_add(struct tracepoint_func **funcs, struct 
tracepoint_func *tp_func,
+ {
+       struct tracepoint_func *old, *new;
+       int nr_probes = 0;
++      int stub_funcs = 0;
+       int pos = -1;
+ 
+       if (WARN_ON(!tp_func->func))
+@@ -113,14 +120,34 @@ func_add(struct tracepoint_func **funcs, struct 
tracepoint_func *tp_func,
+                       if (old[nr_probes].func == tp_func->func &&
+                           old[nr_probes].data == tp_func->data)
+                               return ERR_PTR(-EEXIST);
++                      if (old[nr_probes].func == tp_stub_func)
++                              stub_funcs++;
+               }
+       }
+-      /* + 2 : one for new probe, one for NULL func */
+-      new = allocate_probes(nr_probes + 2);
++      /* + 2 : one for new probe, one for NULL func - stub functions */
++      new = allocate_probes(nr_probes + 2 - stub_funcs);
+       if (new == NULL)
+               return ERR_PTR(-ENOMEM);
+       if (old) {
+-              if (pos < 0) {
++              if (stub_funcs) {
++                      /* Need to copy one at a time to remove stubs */
++                      int probes = 0;
++
++                      pos = -1;
++                      for (nr_probes = 0; old[nr_probes].func; nr_probes++) {
++                              if (old[nr_probes].func == tp_stub_func)
++                                      continue;
++                              if (pos < 0 && old[nr_probes].prio < prio)
++                                      pos = probes++;
++                              new[probes++] = old[nr_probes];
++                      }
++                      nr_probes = probes;
++                      if (pos < 0)
++                              pos = probes;
++                      else
++                              nr_probes--; /* Account for insertion */
++
++              } else if (pos < 0) {
+                       pos = nr_probes;
+                       memcpy(new, old, nr_probes * sizeof(struct 
tracepoint_func));
+               } else {
+@@ -154,8 +181,9 @@ static void *func_remove(struct tracepoint_func **funcs,
+       /* (N -> M), (N > 1, M >= 0) probes */
+       if (tp_func->func) {
+               for (nr_probes = 0; old[nr_probes].func; nr_probes++) {
+-                      if (old[nr_probes].func == tp_func->func &&
+-                           old[nr_probes].data == tp_func->data)
++                      if ((old[nr_probes].func == tp_func->func &&
++                           old[nr_probes].data == tp_func->data) ||
++                          old[nr_probes].func == tp_stub_func)
+                               nr_del++;
+               }
+       }
+@@ -174,14 +202,32 @@ static void *func_remove(struct tracepoint_func **funcs,
+               /* N -> M, (N > 1, M > 0) */
+               /* + 1 for NULL */
+               new = allocate_probes(nr_probes - nr_del + 1);
+-              if (new == NULL)
+-                      return ERR_PTR(-ENOMEM);
+-              for (i = 0; old[i].func; i++)
+-                      if (old[i].func != tp_func->func
+-                                      || old[i].data != tp_func->data)
+-                              new[j++] = old[i];
+-              new[nr_probes - nr_del].func = NULL;
+-              *funcs = new;
++              if (new) {
++                      for (i = 0; old[i].func; i++)
++                              if ((old[i].func != tp_func->func
++                                   || old[i].data != tp_func->data)
++                                  && old[i].func != tp_stub_func)
++                                      new[j++] = old[i];
++                      new[nr_probes - nr_del].func = NULL;
++                      *funcs = new;
++              } else {
++                      /*
++                       * Failed to allocate, replace the old function
++                       * with calls to tp_stub_func.
++                       */
++                      for (i = 0; old[i].func; i++)
++                              if (old[i].func == tp_func->func &&
++                                  old[i].data == tp_func->data) {
++                                      old[i].func = tp_stub_func;
++                                      /* Set the prio to the next event. */
++                                      if (old[i + 1].func)
++                                              old[i].prio =
++                                                      old[i + 1].prio;
++                                      else
++                                              old[i].prio = -1;
++                              }
++                      *funcs = old;
++              }
+       }
+       debug_print_probes(*funcs);
+       return old;
+@@ -234,10 +280,12 @@ static int tracepoint_remove_func(struct tracepoint *tp,
+       tp_funcs = rcu_dereference_protected(tp->funcs,
+                       lockdep_is_held(&tracepoints_mutex));
+       old = func_remove(&tp_funcs, func);
+-      if (IS_ERR(old)) {
+-              WARN_ON_ONCE(PTR_ERR(old) != -ENOMEM);
++      if (WARN_ON_ONCE(IS_ERR(old)))
+               return PTR_ERR(old);
+-      }
++
++      if (tp_funcs == old)
++              /* Failed allocating new tp_funcs, replaced func with stub */
++              return 0;
+ 
+       if (!tp_funcs) {
+               /* Removed last function */
+diff --git a/mm/huge_memory.c b/mm/huge_memory.c
+index 05ca01ef97f7f..14cd0ef33b628 100644
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -1022,6 +1022,19 @@ int do_huge_pmd_wp_page(struct fault_env *fe, pmd_t 
orig_pmd)
+        * We can only reuse the page if nobody else maps the huge page or it's
+        * part.
+        */
++      if (!trylock_page(page)) {
++              get_page(page);
++              spin_unlock(fe->ptl);
++              lock_page(page);
++              spin_lock(fe->ptl);
++              if (unlikely(!pmd_same(*fe->pmd, orig_pmd))) {
++                      unlock_page(page);
++                      put_page(page);
++                      goto out_unlock;
++              }
++              put_page(page);
++      }
++
+       if (page_trans_huge_mapcount(page, NULL) == 1) {
+               pmd_t entry;
+               entry = pmd_mkyoung(orig_pmd);
+@@ -1029,8 +1042,10 @@ int do_huge_pmd_wp_page(struct fault_env *fe, pmd_t 
orig_pmd)
+               if (pmdp_set_access_flags(vma, haddr, fe->pmd, entry,  1))
+                       update_mmu_cache_pmd(vma, fe->address, fe->pmd);
+               ret |= VM_FAULT_WRITE;
++              unlock_page(page);
+               goto out_unlock;
+       }
++      unlock_page(page);
+       get_page(page);
+       spin_unlock(fe->ptl);
+ alloc:
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 5a16d892c891c..e814cc1785354 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -66,6 +66,21 @@ DEFINE_SPINLOCK(hugetlb_lock);
+ static int num_fault_mutexes;
+ struct mutex *hugetlb_fault_mutex_table ____cacheline_aligned_in_smp;
+ 
++static inline bool PageHugeFreed(struct page *head)
++{
++      return page_private(head + 4) == -1UL;
++}
++
++static inline void SetPageHugeFreed(struct page *head)
++{
++      set_page_private(head + 4, -1UL);
++}
++
++static inline void ClearPageHugeFreed(struct page *head)
++{
++      set_page_private(head + 4, 0);
++}
++
+ /* Forward declaration */
+ static int hugetlb_acct_memory(struct hstate *h, long delta);
+ 
+@@ -863,6 +878,7 @@ static void enqueue_huge_page(struct hstate *h, struct 
page *page)
+       list_move(&page->lru, &h->hugepage_freelists[nid]);
+       h->free_huge_pages++;
+       h->free_huge_pages_node[nid]++;
++      SetPageHugeFreed(page);
+ }
+ 
+ static struct page *dequeue_huge_page_node(struct hstate *h, int nid)
+@@ -880,6 +896,7 @@ static struct page *dequeue_huge_page_node(struct hstate 
*h, int nid)
+               return NULL;
+       list_move(&page->lru, &h->hugepage_activelist);
+       set_page_refcounted(page);
++      ClearPageHugeFreed(page);
+       h->free_huge_pages--;
+       h->free_huge_pages_node[nid]--;
+       return page;
+@@ -1292,6 +1309,7 @@ static void prep_new_huge_page(struct hstate *h, struct 
page *page, int nid)
+       set_hugetlb_cgroup(page, NULL);
+       h->nr_huge_pages++;
+       h->nr_huge_pages_node[nid]++;
++      ClearPageHugeFreed(page);
+       spin_unlock(&hugetlb_lock);
+       put_page(page); /* free it into the hugepage allocator */
+ }
+@@ -1455,6 +1473,7 @@ static int dissolve_free_huge_page(struct page *page)
+ {
+       int rc = 0;
+ 
++retry:
+       spin_lock(&hugetlb_lock);
+       if (PageHuge(page) && !page_count(page)) {
+               struct page *head = compound_head(page);
+@@ -1464,6 +1483,26 @@ static int dissolve_free_huge_page(struct page *page)
+                       rc = -EBUSY;
+                       goto out;
+               }
++
++              /*
++               * We should make sure that the page is already on the free list
++               * when it is dissolved.
++               */
++              if (unlikely(!PageHugeFreed(head))) {
++                      spin_unlock(&hugetlb_lock);
++                      cond_resched();
++
++                      /*
++                       * Theoretically, we should return -EBUSY when we
++                       * encounter this race. In fact, we have a chance
++                       * to successfully dissolve the page if we do a
++                       * retry. Because the race window is quite small.
++                       * If we seize this opportunity, it is an optimization
++                       * for increasing the success rate of dissolving page.
++                       */
++                      goto retry;
++              }
++
+               list_del(&head->lru);
+               h->free_huge_pages--;
+               h->free_huge_pages_node[nid]--;
+@@ -2618,8 +2657,10 @@ static int hugetlb_sysfs_add_hstate(struct hstate *h, 
struct kobject *parent,
+               return -ENOMEM;
+ 
+       retval = sysfs_create_group(hstate_kobjs[hi], hstate_attr_group);
+-      if (retval)
++      if (retval) {
+               kobject_put(hstate_kobjs[hi]);
++              hstate_kobjs[hi] = NULL;
++      }
+ 
+       return retval;
+ }
+diff --git a/mm/memory.c b/mm/memory.c
+index 47248dc0b9e1a..d1cc9923320b4 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -1687,11 +1687,11 @@ static int remap_pte_range(struct mm_struct *mm, pmd_t 
*pmd,
+                       unsigned long addr, unsigned long end,
+                       unsigned long pfn, pgprot_t prot)
+ {
+-      pte_t *pte;
++      pte_t *pte, *mapped_pte;
+       spinlock_t *ptl;
+       int err = 0;
+ 
+-      pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
++      mapped_pte = pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
+       if (!pte)
+               return -ENOMEM;
+       arch_enter_lazy_mmu_mode();
+@@ -1705,7 +1705,7 @@ static int remap_pte_range(struct mm_struct *mm, pmd_t 
*pmd,
+               pfn++;
+       } while (pte++, addr += PAGE_SIZE, addr != end);
+       arch_leave_lazy_mmu_mode();
+-      pte_unmap_unlock(pte - 1, ptl);
++      pte_unmap_unlock(mapped_pte, ptl);
+       return err;
+ }
+ 
+diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c
+index 8f918155685db..fcd819ffda108 100644
+--- a/net/bluetooth/a2mp.c
++++ b/net/bluetooth/a2mp.c
+@@ -388,9 +388,9 @@ static int a2mp_getampassoc_req(struct amp_mgr *mgr, 
struct sk_buff *skb,
+       hdev = hci_dev_get(req->id);
+       if (!hdev || hdev->amp_type == AMP_TYPE_BREDR || tmp) {
+               struct a2mp_amp_assoc_rsp rsp;
+-              rsp.id = req->id;
+ 
+               memset(&rsp, 0, sizeof(rsp));
++              rsp.id = req->id;
+ 
+               if (tmp) {
+                       rsp.status = A2MP_STATUS_COLLISION_OCCURED;
+@@ -519,6 +519,7 @@ static int a2mp_createphyslink_req(struct amp_mgr *mgr, 
struct sk_buff *skb,
+               assoc = kmemdup(req->amp_assoc, assoc_len, GFP_KERNEL);
+               if (!assoc) {
+                       amp_ctrl_put(ctrl);
++                      hci_dev_put(hdev);
+                       return -ENOMEM;
+               }
+ 
+diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
+index a70b078ceb3ca..02f44a408edbd 100644
+--- a/net/bluetooth/hci_core.c
++++ b/net/bluetooth/hci_core.c
+@@ -1243,8 +1243,10 @@ int hci_inquiry(void __user *arg)
+                * cleared). If it is interrupted by a signal, return -EINTR.
+                */
+               if (wait_on_bit(&hdev->flags, HCI_INQUIRY,
+-                              TASK_INTERRUPTIBLE))
+-                      return -EINTR;
++                              TASK_INTERRUPTIBLE)) {
++                      err = -EINTR;
++                      goto done;
++              }
+       }
+ 
+       /* for unlimited number of responses we will use buffer with
+diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
+index 9a21080e24560..27518ea7ec3c8 100644
+--- a/net/ipv4/icmp.c
++++ b/net/ipv4/icmp.c
+@@ -738,6 +738,40 @@ out:;
+ }
+ EXPORT_SYMBOL(__icmp_send);
+ 
++#if IS_ENABLED(CONFIG_NF_NAT)
++#include <net/netfilter/nf_conntrack.h>
++void icmp_ndo_send(struct sk_buff *skb_in, int type, int code, __be32 info)
++{
++      struct sk_buff *cloned_skb = NULL;
++      struct ip_options opts = { 0 };
++      enum ip_conntrack_info ctinfo;
++      struct nf_conn *ct;
++      __be32 orig_ip;
++
++      ct = nf_ct_get(skb_in, &ctinfo);
++      if (!ct || !(ct->status & IPS_SRC_NAT)) {
++              __icmp_send(skb_in, type, code, info, &opts);
++              return;
++      }
++
++      if (skb_shared(skb_in))
++              skb_in = cloned_skb = skb_clone(skb_in, GFP_ATOMIC);
++
++      if (unlikely(!skb_in || skb_network_header(skb_in) < skb_in->head ||
++          (skb_network_header(skb_in) + sizeof(struct iphdr)) >
++          skb_tail_pointer(skb_in) || skb_ensure_writable(skb_in,
++          skb_network_offset(skb_in) + sizeof(struct iphdr))))
++              goto out;
++
++      orig_ip = ip_hdr(skb_in)->saddr;
++      ip_hdr(skb_in)->saddr = ct->tuplehash[0].tuple.src.u3.ip;
++      __icmp_send(skb_in, type, code, info, &opts);
++      ip_hdr(skb_in)->saddr = orig_ip;
++out:
++      consume_skb(cloned_skb);
++}
++EXPORT_SYMBOL(icmp_ndo_send);
++#endif
+ 
+ static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
+ {
+diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
+index 2772004ba5a18..c879a8202286e 100644
+--- a/net/ipv6/icmp.c
++++ b/net/ipv6/icmp.c
+@@ -298,10 +298,9 @@ static int icmpv6_getfrag(void *from, char *to, int 
offset, int len, int odd, st
+ }
+ 
+ #if IS_ENABLED(CONFIG_IPV6_MIP6)
+-static void mip6_addr_swap(struct sk_buff *skb)
++static void mip6_addr_swap(struct sk_buff *skb, const struct inet6_skb_parm 
*opt)
+ {
+       struct ipv6hdr *iph = ipv6_hdr(skb);
+-      struct inet6_skb_parm *opt = IP6CB(skb);
+       struct ipv6_destopt_hao *hao;
+       struct in6_addr tmp;
+       int off;
+@@ -318,7 +317,7 @@ static void mip6_addr_swap(struct sk_buff *skb)
+       }
+ }
+ #else
+-static inline void mip6_addr_swap(struct sk_buff *skb) {}
++static inline void mip6_addr_swap(struct sk_buff *skb, const struct 
inet6_skb_parm *opt) {}
+ #endif
+ 
+ static struct dst_entry *icmpv6_route_lookup(struct net *net,
+@@ -388,8 +387,9 @@ relookup_failed:
+ /*
+  *    Send an ICMP message in response to a packet in error
+  */
+-static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
+-                     const struct in6_addr *force_saddr)
++void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
++              const struct in6_addr *force_saddr,
++              const struct inet6_skb_parm *parm)
+ {
+       struct net *net = dev_net(skb->dev);
+       struct inet6_dev *idev = NULL;
+@@ -473,7 +473,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 
code, __u32 info,
+               return;
+       }
+ 
+-      mip6_addr_swap(skb);
++      mip6_addr_swap(skb, parm);
+ 
+       memset(&fl6, 0, sizeof(fl6));
+       fl6.flowi6_proto = IPPROTO_ICMPV6;
+@@ -556,9 +556,10 @@ out:
+  */
+ void icmpv6_param_prob(struct sk_buff *skb, u8 code, int pos)
+ {
+-      icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL);
++      icmp6_send(skb, ICMPV6_PARAMPROB, code, pos, NULL, IP6CB(skb));
+       kfree_skb(skb);
+ }
++EXPORT_SYMBOL(icmp6_send);
+ 
+ /* Generate icmpv6 with type/code ICMPV6_DEST_UNREACH/ICMPV6_ADDR_UNREACH
+  * if sufficient data bytes are available
+@@ -612,10 +613,10 @@ int ip6_err_gen_icmpv6_unreach(struct sk_buff *skb, int 
nhs, int type,
+       }
+       if (type == ICMP_TIME_EXCEEDED)
+               icmp6_send(skb2, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
+-                         info, &temp_saddr);
++                         info, &temp_saddr, IP6CB(skb2));
+       else
+               icmp6_send(skb2, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH,
+-                         info, &temp_saddr);
++                         info, &temp_saddr, IP6CB(skb2));
+       if (rt)
+               ip6_rt_put(rt);
+ 
+diff --git a/net/ipv6/ip6_icmp.c b/net/ipv6/ip6_icmp.c
+index 713676f14a0ee..05287bc36dbdf 100644
+--- a/net/ipv6/ip6_icmp.c
++++ b/net/ipv6/ip6_icmp.c
+@@ -8,6 +8,8 @@
+ 
+ #if IS_ENABLED(CONFIG_IPV6)
+ 
++#if !IS_BUILTIN(CONFIG_IPV6)
++
+ static ip6_icmp_send_t __rcu *ip6_icmp_send;
+ 
+ int inet6_register_icmp_sender(ip6_icmp_send_t *fn)
+@@ -30,18 +32,52 @@ int inet6_unregister_icmp_sender(ip6_icmp_send_t *fn)
+ }
+ EXPORT_SYMBOL(inet6_unregister_icmp_sender);
+ 
+-void icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info)
++void __icmpv6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
++                 const struct inet6_skb_parm *parm)
+ {
+       ip6_icmp_send_t *send;
+ 
+       rcu_read_lock();
+       send = rcu_dereference(ip6_icmp_send);
++      if (send)
++              send(skb, type, code, info, NULL, parm);
++      rcu_read_unlock();
++}
++EXPORT_SYMBOL(__icmpv6_send);
++#endif
++
++#if IS_ENABLED(CONFIG_NF_NAT)
++#include <net/netfilter/nf_conntrack.h>
++void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info)
++{
++      struct inet6_skb_parm parm = { 0 };
++      struct sk_buff *cloned_skb = NULL;
++      enum ip_conntrack_info ctinfo;
++      struct in6_addr orig_ip;
++      struct nf_conn *ct;
+ 
+-      if (!send)
++      ct = nf_ct_get(skb_in, &ctinfo);
++      if (!ct || !(ct->status & IPS_SRC_NAT)) {
++              __icmpv6_send(skb_in, type, code, info, &parm);
++              return;
++      }
++
++      if (skb_shared(skb_in))
++              skb_in = cloned_skb = skb_clone(skb_in, GFP_ATOMIC);
++
++      if (unlikely(!skb_in || skb_network_header(skb_in) < skb_in->head ||
++          (skb_network_header(skb_in) + sizeof(struct ipv6hdr)) >
++          skb_tail_pointer(skb_in) || skb_ensure_writable(skb_in,
++          skb_network_offset(skb_in) + sizeof(struct ipv6hdr))))
+               goto out;
+-      send(skb, type, code, info, NULL);
++
++      orig_ip = ipv6_hdr(skb_in)->saddr;
++      ipv6_hdr(skb_in)->saddr = ct->tuplehash[0].tuple.src.u3.in6;
++      __icmpv6_send(skb_in, type, code, info, &parm);
++      ipv6_hdr(skb_in)->saddr = orig_ip;
+ out:
+-      rcu_read_unlock();
++      consume_skb(cloned_skb);
+ }
+-EXPORT_SYMBOL(icmpv6_send);
++EXPORT_SYMBOL(icmpv6_ndo_send);
++#endif
+ #endif
+diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
+index 2fbd100b9e73d..a8b837d0498a4 100644
+--- a/net/mac80211/mesh_hwmp.c
++++ b/net/mac80211/mesh_hwmp.c
+@@ -355,7 +355,7 @@ static u32 airtime_link_metric_get(struct ieee80211_local 
*local,
+        */
+       tx_time = (device_constant + 10 * test_frame_len / rate);
+       estimated_retx = ((1 << (2 * ARITH_SHIFT)) / (s_unit - err));
+-      result = (tx_time * estimated_retx) >> (2 * ARITH_SHIFT);
++      result = ((u64)tx_time * estimated_retx) >> (2 * ARITH_SHIFT);
+       return (u32)result;
+ }
+ 
+diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
+index faac4b10d8eaf..fb0d25ced2fb3 100755
+--- a/scripts/recordmcount.pl
++++ b/scripts/recordmcount.pl
+@@ -261,7 +261,11 @@ if ($arch eq "x86_64") {
+ 
+     # force flags for this arch
+     $ld .= " -m shlelf_linux";
+-    $objcopy .= " -O elf32-sh-linux";
++    if ($endian eq "big") {
++        $objcopy .= " -O elf32-shbig-linux";
++    } else {
++        $objcopy .= " -O elf32-sh-linux";
++    }
+ 
+ } elsif ($arch eq "powerpc") {
+     $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)";
+diff --git a/security/keys/trusted.c b/security/keys/trusted.c
+index 4ba2f6b912421..21e40a5c96c6c 100644
+--- a/security/keys/trusted.c
++++ b/security/keys/trusted.c
+@@ -797,7 +797,7 @@ static int getoptions(char *c, struct trusted_key_payload 
*pay,
+               case Opt_migratable:
+                       if (*args[0].from == '0')
+                               pay->migratable = 0;
+-                      else
++                      else if (*args[0].from != '1')
+                               return -EINVAL;
+                       break;
+               case Opt_pcrlock:
+diff --git a/sound/soc/codecs/cs42l56.c b/sound/soc/codecs/cs42l56.c
+index 54c1768bc8185..a2535a7eb4bbd 100644
+--- a/sound/soc/codecs/cs42l56.c
++++ b/sound/soc/codecs/cs42l56.c
+@@ -1270,6 +1270,7 @@ static int cs42l56_i2c_probe(struct i2c_client 
*i2c_client,
+               dev_err(&i2c_client->dev,
+                       "CS42L56 Device ID (%X). Expected %X\n",
+                       devid, CS42L56_DEVID);
++              ret = -EINVAL;
+               goto err_enable;
+       }
+       alpha_rev = reg & CS42L56_AREV_MASK;
+@@ -1325,7 +1326,7 @@ static int cs42l56_i2c_probe(struct i2c_client 
*i2c_client,
+       ret =  snd_soc_register_codec(&i2c_client->dev,
+                       &soc_codec_dev_cs42l56, &cs42l56_dai, 1);
+       if (ret < 0)
+-              return ret;
++              goto err_enable;
+ 
+       return 0;
+ 
+diff --git a/tools/perf/tests/sample-parsing.c 
b/tools/perf/tests/sample-parsing.c
+index 5f23710b9fee6..60e5348f0a43f 100644
+--- a/tools/perf/tests/sample-parsing.c
++++ b/tools/perf/tests/sample-parsing.c
+@@ -167,7 +167,7 @@ static int do_test(u64 sample_type, u64 sample_regs, u64 
read_format)
+               .data = {1, 211, 212, 213},
+       };
+       u64 regs[64];
+-      const u64 raw_data[] = {0x123456780a0b0c0dULL, 0x1102030405060708ULL};
++      const u32 raw_data[] = {0x12345678, 0x0a0b0c0d, 0x11020304, 0x05060708, 
0 };
+       const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL};
+       struct perf_sample sample = {
+               .ip             = 101,
+diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
+index 659c41004322d..5742adf4d5e89 100644
+--- a/tools/perf/util/event.c
++++ b/tools/perf/util/event.c
+@@ -1370,6 +1370,8 @@ int machine__resolve(struct machine *machine, struct 
addr_location *al,
+               }
+ 
+               al->sym = map__find_symbol(al->map, al->addr);
++      } else if (symbol_conf.dso_list) {
++              al->filtered |= (1 << HIST_FILTER__DSO);
+       }
+ 
+       if (symbol_conf.sym_list &&
+diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c 
b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+index 63fa3a95a1d69..7292f73118ed3 100644
+--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+@@ -1508,6 +1508,9 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder 
*decoder)
+                       break;
+ 
+               case INTEL_PT_CYC:
++                      intel_pt_calc_cyc_timestamp(decoder);
++                      break;
++
+               case INTEL_PT_VMCS:
+               case INTEL_PT_MNT:
+               case INTEL_PT_PAD:

Reply via email to