commit:     2183a8158b9cc71af59c64c6b24b9beedb255032
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Feb 12 20:51:07 2019 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Feb 12 20:51:07 2019 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=2183a815

proj/linux-patches: Linux patch 4.9.156

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

 0000_README              |    4 +
 1155_linux-4.9.156.patch | 3695 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3699 insertions(+)

diff --git a/0000_README b/0000_README
index 0ed3743..dc5a410 100644
--- a/0000_README
+++ b/0000_README
@@ -663,6 +663,10 @@ Patch:  1154_linux-4.9.155.patch
 From:   http://www.k5rnel.org
 Desc:   Linux 4.9.155
 
+Patch:  1155_linux-4.9.156.patch
+From:   http://www.k5rnel.org
+Desc:   Linux 4.9.156
+
 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/1155_linux-4.9.156.patch b/1155_linux-4.9.156.patch
new file mode 100644
index 0000000..34f1d1f
--- /dev/null
+++ b/1155_linux-4.9.156.patch
@@ -0,0 +1,3695 @@
+diff --git a/Makefile b/Makefile
+index 1933ac9c3406..956923115f7e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 155
++SUBLEVEL = 156
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
+index 766bbb8495b6..47e5b63339d1 100644
+--- a/arch/arm/boot/dts/mmp2.dtsi
++++ b/arch/arm/boot/dts/mmp2.dtsi
+@@ -220,12 +220,15 @@
+                               status = "disabled";
+                       };
+ 
+-                      twsi2: i2c@d4025000 {
++                      twsi2: i2c@d4031000 {
+                               compatible = "mrvl,mmp-twsi";
+-                              reg = <0xd4025000 0x1000>;
+-                              interrupts = <58>;
++                              reg = <0xd4031000 0x1000>;
++                              interrupt-parent = <&intcmux17>;
++                              interrupts = <0>;
+                               clocks = <&soc_clocks MMP2_CLK_TWSI1>;
+                               resets = <&soc_clocks MMP2_CLK_TWSI1>;
++                              #address-cells = <1>;
++                              #size-cells = <0>;
+                               status = "disabled";
+                       };
+ 
+diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts
+index d728ec963111..891ba75fd459 100644
+--- a/arch/arm/boot/dts/omap4-sdp.dts
++++ b/arch/arm/boot/dts/omap4-sdp.dts
+@@ -33,6 +33,7 @@
+               gpio = <&gpio2 16 GPIO_ACTIVE_HIGH>;  /* gpio line 48 */
+               enable-active-high;
+               regulator-boot-on;
++              startup-delay-us = <25000>;
+       };
+ 
+       vbat: fixedregulator-vbat {
+diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
+index d2ce37da87d8..4b129aac7233 100644
+--- a/arch/arm/kernel/smp.c
++++ b/arch/arm/kernel/smp.c
+@@ -690,6 +690,21 @@ void smp_send_stop(void)
+               pr_warn("SMP: failed to stop secondary CPUs\n");
+ }
+ 
++/* In case panic() and panic() called at the same time on CPU1 and CPU2,
++ * and CPU 1 calls panic_smp_self_stop() before crash_smp_send_stop()
++ * CPU1 can't receive the ipi irqs from CPU2, CPU1 will be always online,
++ * kdump fails. So split out the panic_smp_self_stop() and add
++ * set_cpu_online(smp_processor_id(), false).
++ */
++void panic_smp_self_stop(void)
++{
++      pr_debug("CPU %u will stop doing anything useful since another CPU has 
paniced\n",
++               smp_processor_id());
++      set_cpu_online(smp_processor_id(), false);
++      while (1)
++              cpu_relax();
++}
++
+ /*
+  * not supported here
+  */
+diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c
+index dac7ceb1a677..08443a15e6be 100644
+--- a/arch/arm/kvm/mmio.c
++++ b/arch/arm/kvm/mmio.c
+@@ -117,6 +117,12 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct 
kvm_run *run)
+               vcpu_set_reg(vcpu, vcpu->arch.mmio_decode.rt, data);
+       }
+ 
++      /*
++       * The MMIO instruction is emulated and should not be re-executed
++       * in the guest.
++       */
++      kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
++
+       return 0;
+ }
+ 
+@@ -144,11 +150,6 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool 
*is_write, int *len)
+       vcpu->arch.mmio_decode.sign_extend = sign_extend;
+       vcpu->arch.mmio_decode.rt = rt;
+ 
+-      /*
+-       * The MMIO instruction is emulated and should not be re-executed
+-       * in the guest.
+-       */
+-      kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
+       return 0;
+ }
+ 
+diff --git a/arch/arm/mach-omap2/omap_hwmod.c 
b/arch/arm/mach-omap2/omap_hwmod.c
+index b5c1714ebfdd..bfc74954540c 100644
+--- a/arch/arm/mach-omap2/omap_hwmod.c
++++ b/arch/arm/mach-omap2/omap_hwmod.c
+@@ -2551,7 +2551,7 @@ static int __init _init(struct omap_hwmod *oh, void 
*data)
+  * a stub; implementing this properly requires iclk autoidle usecounting in
+  * the clock code.   No return value.
+  */
+-static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
++static void _setup_iclk_autoidle(struct omap_hwmod *oh)
+ {
+       struct omap_hwmod_ocp_if *os;
+       struct list_head *p;
+@@ -2586,7 +2586,7 @@ static void __init _setup_iclk_autoidle(struct 
omap_hwmod *oh)
+  * reset.  Returns 0 upon success or a negative error code upon
+  * failure.
+  */
+-static int __init _setup_reset(struct omap_hwmod *oh)
++static int _setup_reset(struct omap_hwmod *oh)
+ {
+       int r;
+ 
+@@ -2647,7 +2647,7 @@ static int __init _setup_reset(struct omap_hwmod *oh)
+  *
+  * No return value.
+  */
+-static void __init _setup_postsetup(struct omap_hwmod *oh)
++static void _setup_postsetup(struct omap_hwmod *oh)
+ {
+       u8 postsetup_state;
+ 
+diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
+index 868448d2cd82..38ab30869821 100644
+--- a/arch/arm/mach-pxa/cm-x300.c
++++ b/arch/arm/mach-pxa/cm-x300.c
+@@ -547,7 +547,7 @@ static struct pxa3xx_u2d_platform_data 
cm_x300_u2d_platform_data = {
+       .exit           = cm_x300_u2d_exit,
+ };
+ 
+-static void cm_x300_init_u2d(void)
++static void __init cm_x300_init_u2d(void)
+ {
+       pxa3xx_set_u2d_info(&cm_x300_u2d_platform_data);
+ }
+diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c
+index 051c554776a6..ebdef6661f5f 100644
+--- a/arch/arm/mach-pxa/littleton.c
++++ b/arch/arm/mach-pxa/littleton.c
+@@ -183,7 +183,7 @@ static struct pxafb_mach_info littleton_lcd_info = {
+       .lcd_conn               = LCD_COLOR_TFT_16BPP,
+ };
+ 
+-static void littleton_init_lcd(void)
++static void __init littleton_init_lcd(void)
+ {
+       pxa_set_fb_info(NULL, &littleton_lcd_info);
+ }
+diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
+index 3b94ecfb9426..3fcd5854bf5b 100644
+--- a/arch/arm/mach-pxa/zeus.c
++++ b/arch/arm/mach-pxa/zeus.c
+@@ -557,7 +557,7 @@ static struct pxaohci_platform_data 
zeus_ohci_platform_data = {
+       .flags          = ENABLE_PORT_ALL | POWER_SENSE_LOW,
+ };
+ 
+-static void zeus_register_ohci(void)
++static void __init zeus_register_ohci(void)
+ {
+       /* Port 2 is shared between host and client interface. */
+       UP2OCR = UP2OCR_HXOE | UP2OCR_HXS | UP2OCR_DMPDE | UP2OCR_DPPDE;
+diff --git a/arch/arm64/kernel/entry-ftrace.S 
b/arch/arm64/kernel/entry-ftrace.S
+index aef02d2af3b5..7a87d32e98f4 100644
+--- a/arch/arm64/kernel/entry-ftrace.S
++++ b/arch/arm64/kernel/entry-ftrace.S
+@@ -78,7 +78,6 @@
+       .macro mcount_get_lr reg
+       ldr     \reg, [x29]
+       ldr     \reg, [\reg, #8]
+-      mcount_adjust_addr      \reg, \reg
+       .endm
+ 
+       .macro mcount_get_lr_addr reg
+diff --git a/arch/mips/include/uapi/asm/inst.h 
b/arch/mips/include/uapi/asm/inst.h
+index 711d9b8465b8..377d5179ea3b 100644
+--- a/arch/mips/include/uapi/asm/inst.h
++++ b/arch/mips/include/uapi/asm/inst.h
+@@ -361,8 +361,8 @@ enum mm_32a_minor_op {
+       mm_ext_op = 0x02c,
+       mm_pool32axf_op = 0x03c,
+       mm_srl32_op = 0x040,
++      mm_srlv32_op = 0x050,
+       mm_sra_op = 0x080,
+-      mm_srlv32_op = 0x090,
+       mm_rotr_op = 0x0c0,
+       mm_lwxs_op = 0x118,
+       mm_addu32_op = 0x150,
+diff --git a/arch/mips/ralink/Kconfig b/arch/mips/ralink/Kconfig
+index 813826a456ca..55a5fee781e8 100644
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -38,6 +38,7 @@ choice
+ 
+       config SOC_MT7620
+               bool "MT7620/8"
++              select CPU_MIPSR2_IRQ_VI
+               select HW_HAS_PCI
+ 
+       config SOC_MT7621
+diff --git a/arch/powerpc/include/asm/uaccess.h 
b/arch/powerpc/include/asm/uaccess.h
+index c266227fdd5b..31913b3ac7ab 100644
+--- a/arch/powerpc/include/asm/uaccess.h
++++ b/arch/powerpc/include/asm/uaccess.h
+@@ -59,7 +59,7 @@
+ #endif
+ 
+ #define access_ok(type, addr, size)           \
+-      (__chk_user_ptr(addr),                  \
++      (__chk_user_ptr(addr), (void)(type),            \
+        __access_ok((__force unsigned long)(addr), (size), get_fs()))
+ 
+ /*
+diff --git a/arch/powerpc/platforms/pseries/dlpar.c 
b/arch/powerpc/platforms/pseries/dlpar.c
+index 72ae2cdbcd6a..999b04819d69 100644
+--- a/arch/powerpc/platforms/pseries/dlpar.c
++++ b/arch/powerpc/platforms/pseries/dlpar.c
+@@ -288,6 +288,8 @@ int dlpar_detach_node(struct device_node *dn)
+       if (rc)
+               return rc;
+ 
++      of_node_put(dn);
++
+       return 0;
+ }
+ 
+diff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h
+index 7485398d0737..9c04562310b3 100644
+--- a/arch/um/include/asm/pgtable.h
++++ b/arch/um/include/asm/pgtable.h
+@@ -197,12 +197,17 @@ static inline pte_t pte_mkold(pte_t pte)
+ 
+ static inline pte_t pte_wrprotect(pte_t pte)
+ { 
+-      pte_clear_bits(pte, _PAGE_RW);
++      if (likely(pte_get_bits(pte, _PAGE_RW)))
++              pte_clear_bits(pte, _PAGE_RW);
++      else
++              return pte;
+       return(pte_mknewprot(pte)); 
+ }
+ 
+ static inline pte_t pte_mkread(pte_t pte)
+ { 
++      if (unlikely(pte_get_bits(pte, _PAGE_USER)))
++              return pte;
+       pte_set_bits(pte, _PAGE_USER);
+       return(pte_mknewprot(pte)); 
+ }
+@@ -221,6 +226,8 @@ static inline pte_t pte_mkyoung(pte_t pte)
+ 
+ static inline pte_t pte_mkwrite(pte_t pte)    
+ {
++      if (unlikely(pte_get_bits(pte,  _PAGE_RW)))
++              return pte;
+       pte_set_bits(pte, _PAGE_RW);
+       return(pte_mknewprot(pte)); 
+ }
+diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
+index 4f8560774082..f600ab601e00 100644
+--- a/arch/x86/events/intel/core.c
++++ b/arch/x86/events/intel/core.c
+@@ -3234,6 +3234,11 @@ static void free_excl_cntrs(int cpu)
+ }
+ 
+ static void intel_pmu_cpu_dying(int cpu)
++{
++      fini_debug_store_on_cpu(cpu);
++}
++
++static void intel_pmu_cpu_dead(int cpu)
+ {
+       struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
+       struct intel_shared_regs *pc;
+@@ -3246,8 +3251,6 @@ static void intel_pmu_cpu_dying(int cpu)
+       }
+ 
+       free_excl_cntrs(cpu);
+-
+-      fini_debug_store_on_cpu(cpu);
+ }
+ 
+ static void intel_pmu_sched_task(struct perf_event_context *ctx,
+@@ -3324,6 +3327,7 @@ static __initconst const struct x86_pmu core_pmu = {
+       .cpu_prepare            = intel_pmu_cpu_prepare,
+       .cpu_starting           = intel_pmu_cpu_starting,
+       .cpu_dying              = intel_pmu_cpu_dying,
++      .cpu_dead               = intel_pmu_cpu_dead,
+ };
+ 
+ static __initconst const struct x86_pmu intel_pmu = {
+@@ -3359,6 +3363,8 @@ static __initconst const struct x86_pmu intel_pmu = {
+       .cpu_prepare            = intel_pmu_cpu_prepare,
+       .cpu_starting           = intel_pmu_cpu_starting,
+       .cpu_dying              = intel_pmu_cpu_dying,
++      .cpu_dead               = intel_pmu_cpu_dead,
++
+       .guest_get_msrs         = intel_guest_get_msrs,
+       .sched_task             = intel_pmu_sched_task,
+ };
+diff --git a/arch/x86/events/intel/uncore_snbep.c 
b/arch/x86/events/intel/uncore_snbep.c
+index 8c2a9fa0caf3..686dd4339370 100644
+--- a/arch/x86/events/intel/uncore_snbep.c
++++ b/arch/x86/events/intel/uncore_snbep.c
+@@ -1221,6 +1221,8 @@ static struct pci_driver snbep_uncore_pci_driver = {
+       .id_table       = snbep_uncore_pci_ids,
+ };
+ 
++#define NODE_ID_MASK  0x7
++
+ /*
+  * build pci bus to socket mapping
+  */
+@@ -1242,7 +1244,7 @@ static int snbep_pci2phy_map_init(int devid, int 
nodeid_loc, int idmap_loc, bool
+               err = pci_read_config_dword(ubox_dev, nodeid_loc, &config);
+               if (err)
+                       break;
+-              nodeid = config;
++              nodeid = config & NODE_ID_MASK;
+               /* get the Node ID mapping */
+               err = pci_read_config_dword(ubox_dev, idmap_loc, &config);
+               if (err)
+diff --git a/arch/x86/include/asm/fpu/internal.h 
b/arch/x86/include/asm/fpu/internal.h
+index 499d6ed0e376..21d6fa27b4a9 100644
+--- a/arch/x86/include/asm/fpu/internal.h
++++ b/arch/x86/include/asm/fpu/internal.h
+@@ -97,6 +97,9 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
+ #define user_insn(insn, output, input...)                             \
+ ({                                                                    \
+       int err;                                                        \
++                                                                      \
++      might_fault();                                                  \
++                                                                      \
+       asm volatile(ASM_STAC "\n"                                      \
+                    "1:" #insn "\n\t"                                  \
+                    "2: " ASM_CLAC "\n"                                \
+diff --git a/arch/x86/kernel/cpu/mcheck/mce.c 
b/arch/x86/kernel/cpu/mcheck/mce.c
+index 7e6163c9d434..25310d2b8609 100644
+--- a/arch/x86/kernel/cpu/mcheck/mce.c
++++ b/arch/x86/kernel/cpu/mcheck/mce.c
+@@ -751,6 +751,7 @@ static int mce_no_way_out(struct mce *m, char **msg, 
unsigned long *validp,
+                       quirk_no_way_out(i, m, regs);
+ 
+               if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= 
MCE_PANIC_SEVERITY) {
++                      m->bank = i;
+                       mce_read_aux(m, i);
+                       *msg = tmp;
+                       return 1;
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
+index fa1b0e3c8a06..c8efacf2e65f 100644
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -5223,6 +5223,13 @@ static bool svm_cpu_has_accelerated_tpr(void)
+ 
+ static bool svm_has_emulated_msr(int index)
+ {
++      switch (index) {
++      case MSR_IA32_MCG_EXT_CTL:
++              return false;
++      default:
++              break;
++      }
++
+       return true;
+ }
+ 
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 9446a3a2fc69..91db841101ca 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -7368,6 +7368,7 @@ static void free_nested(struct vcpu_vmx *vmx)
+       if (!vmx->nested.vmxon)
+               return;
+ 
++      hrtimer_cancel(&vmx->nested.preemption_timer);
+       vmx->nested.vmxon = false;
+       free_vpid(vmx->nested.vpid02);
+       nested_release_vmcs12(vmx);
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 851e9d6c864f..5a35fee46620 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -4513,6 +4513,13 @@ int kvm_read_guest_virt(struct kvm_vcpu *vcpu,
+ {
+       u32 access = (kvm_x86_ops->get_cpl(vcpu) == 3) ? PFERR_USER_MASK : 0;
+ 
++      /*
++       * FIXME: this should call handle_emulation_failure if X86EMUL_IO_NEEDED
++       * is returned, but our callers are not ready for that and they blindly
++       * call kvm_inject_page_fault.  Ensure that they at least do not leak
++       * uninitialized kernel stack memory into cr2 and error code.
++       */
++      memset(exception, 0, sizeof(*exception));
+       return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, access,
+                                         exception);
+ }
+diff --git a/arch/x86/pci/broadcom_bus.c b/arch/x86/pci/broadcom_bus.c
+index 526536c81ddc..ca1e8e6dccc8 100644
+--- a/arch/x86/pci/broadcom_bus.c
++++ b/arch/x86/pci/broadcom_bus.c
+@@ -50,8 +50,8 @@ static void __init cnb20le_res(u8 bus, u8 slot, u8 func)
+       word1 = read_pci_config_16(bus, slot, func, 0xc0);
+       word2 = read_pci_config_16(bus, slot, func, 0xc2);
+       if (word1 != word2) {
+-              res.start = (word1 << 16) | 0x0000;
+-              res.end   = (word2 << 16) | 0xffff;
++              res.start = ((resource_size_t) word1 << 16) | 0x0000;
++              res.end   = ((resource_size_t) word2 << 16) | 0xffff;
+               res.flags = IORESOURCE_MEM;
+               update_res(info, res.start, res.end, res.flags, 0);
+       }
+diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c
+index e83a3d3421b9..07e146b772ea 100644
+--- a/drivers/ata/sata_rcar.c
++++ b/drivers/ata/sata_rcar.c
+@@ -872,7 +872,9 @@ static int sata_rcar_probe(struct platform_device *pdev)
+       int ret = 0;
+ 
+       irq = platform_get_irq(pdev, 0);
+-      if (irq <= 0)
++      if (irq < 0)
++              return irq;
++      if (!irq)
+               return -EINVAL;
+ 
+       priv = devm_kzalloc(&pdev->dev, sizeof(struct sata_rcar_priv),
+diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
+index f35db29cac76..abee91940a36 100644
+--- a/drivers/block/drbd/drbd_nl.c
++++ b/drivers/block/drbd/drbd_nl.c
+@@ -668,14 +668,15 @@ drbd_set_role(struct drbd_device *const device, enum 
drbd_role new_role, int for
+               if (rv == SS_TWO_PRIMARIES) {
+                       /* Maybe the peer is detected as dead very soon...
+                          retry at most once more in this case. */
+-                      int timeo;
+-                      rcu_read_lock();
+-                      nc = rcu_dereference(connection->net_conf);
+-                      timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1;
+-                      rcu_read_unlock();
+-                      schedule_timeout_interruptible(timeo);
+-                      if (try < max_tries)
++                      if (try < max_tries) {
++                              int timeo;
+                               try = max_tries - 1;
++                              rcu_read_lock();
++                              nc = rcu_dereference(connection->net_conf);
++                              timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1;
++                              rcu_read_unlock();
++                              schedule_timeout_interruptible(timeo);
++                      }
+                       continue;
+               }
+               if (rv < SS_SUCCESS) {
+diff --git a/drivers/block/drbd/drbd_receiver.c 
b/drivers/block/drbd/drbd_receiver.c
+index 942384f34e22..83957a1e15ed 100644
+--- a/drivers/block/drbd/drbd_receiver.c
++++ b/drivers/block/drbd/drbd_receiver.c
+@@ -3421,7 +3421,7 @@ static enum drbd_conns drbd_sync_handshake(struct 
drbd_peer_device *peer_device,
+       enum drbd_conns rv = C_MASK;
+       enum drbd_disk_state mydisk;
+       struct net_conf *nc;
+-      int hg, rule_nr, rr_conflict, tentative;
++      int hg, rule_nr, rr_conflict, tentative, always_asbp;
+ 
+       mydisk = device->state.disk;
+       if (mydisk == D_NEGOTIATING)
+@@ -3472,8 +3472,12 @@ static enum drbd_conns drbd_sync_handshake(struct 
drbd_peer_device *peer_device,
+ 
+       rcu_read_lock();
+       nc = rcu_dereference(peer_device->connection->net_conf);
++      always_asbp = nc->always_asbp;
++      rr_conflict = nc->rr_conflict;
++      tentative = nc->tentative;
++      rcu_read_unlock();
+ 
+-      if (hg == 100 || (hg == -100 && nc->always_asbp)) {
++      if (hg == 100 || (hg == -100 && always_asbp)) {
+               int pcount = (device->state.role == R_PRIMARY)
+                          + (peer_role == R_PRIMARY);
+               int forced = (hg == -100);
+@@ -3512,9 +3516,6 @@ static enum drbd_conns drbd_sync_handshake(struct 
drbd_peer_device *peer_device,
+                            "Sync from %s node\n",
+                            (hg < 0) ? "peer" : "this");
+       }
+-      rr_conflict = nc->rr_conflict;
+-      tentative = nc->tentative;
+-      rcu_read_unlock();
+ 
+       if (hg == -100) {
+               /* FIXME this log message is not correct if we end up here
+@@ -4198,7 +4199,7 @@ static int receive_uuids(struct drbd_connection 
*connection, struct packet_info
+       kfree(device->p_uuid);
+       device->p_uuid = p_uuid;
+ 
+-      if (device->state.conn < C_CONNECTED &&
++      if ((device->state.conn < C_CONNECTED || device->state.pdsk == 
D_DISKLESS) &&
+           device->state.disk < D_INCONSISTENT &&
+           device->state.role == R_PRIMARY &&
+           (device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) {
+diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
+index cab157331c4e..c6d43a2a807d 100644
+--- a/drivers/block/sunvdc.c
++++ b/drivers/block/sunvdc.c
+@@ -40,6 +40,8 @@ MODULE_VERSION(DRV_MODULE_VERSION);
+ #define WAITING_FOR_GEN_CMD   0x04
+ #define WAITING_FOR_ANY               -1
+ 
++#define       VDC_MAX_RETRIES 10
++
+ static struct workqueue_struct *sunvdc_wq;
+ 
+ struct vdc_req_entry {
+@@ -419,6 +421,7 @@ static int __vdc_tx_trigger(struct vdc_port *port)
+               .end_idx                = dr->prod,
+       };
+       int err, delay;
++      int retries = 0;
+ 
+       hdr.seq = dr->snd_nxt;
+       delay = 1;
+@@ -431,6 +434,8 @@ static int __vdc_tx_trigger(struct vdc_port *port)
+               udelay(delay);
+               if ((delay <<= 1) > 128)
+                       delay = 128;
++              if (retries++ > VDC_MAX_RETRIES)
++                      break;
+       } while (err == -EAGAIN);
+ 
+       if (err == -ENOTCONN)
+diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c
+index c264f2d284a7..2e0a9e2531cb 100644
+--- a/drivers/block/swim3.c
++++ b/drivers/block/swim3.c
+@@ -1027,7 +1027,11 @@ static void floppy_release(struct gendisk *disk, 
fmode_t mode)
+       struct swim3 __iomem *sw = fs->swim3;
+ 
+       mutex_lock(&swim3_mutex);
+-      if (fs->ref_count > 0 && --fs->ref_count == 0) {
++      if (fs->ref_count > 0)
++              --fs->ref_count;
++      else if (fs->ref_count == -1)
++              fs->ref_count = 0;
++      if (fs->ref_count == 0) {
+               swim3_action(fs, MOTOR_OFF);
+               out_8(&sw->control_bic, 0xff);
+               swim3_select(fs, RELAX);
+diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
+index e2808fefbb78..1852d19d0d7b 100644
+--- a/drivers/cdrom/gdrom.c
++++ b/drivers/cdrom/gdrom.c
+@@ -882,6 +882,7 @@ static void __exit exit_gdrom(void)
+       platform_device_unregister(pd);
+       platform_driver_unregister(&gdrom_driver);
+       kfree(gd.toc);
++      kfree(gd.cd_info);
+ }
+ 
+ module_init(init_gdrom);
+diff --git a/drivers/clk/imx/clk-imx6sl.c b/drivers/clk/imx/clk-imx6sl.c
+index 5fd4ddac1bf1..f3d9dc2d2405 100644
+--- a/drivers/clk/imx/clk-imx6sl.c
++++ b/drivers/clk/imx/clk-imx6sl.c
+@@ -17,6 +17,8 @@
+ 
+ #include "clk.h"
+ 
++#define CCDR                          0x4
++#define BM_CCM_CCDR_MMDC_CH0_MASK     (1 << 17)
+ #define CCSR                  0xc
+ #define BM_CCSR_PLL1_SW_CLK_SEL       (1 << 2)
+ #define CACRR                 0x10
+@@ -414,6 +416,10 @@ static void __init imx6sl_clocks_init(struct device_node 
*ccm_node)
+       clks[IMX6SL_CLK_USDHC3]       = imx_clk_gate2("usdhc3",       
"usdhc3_podf",       base + 0x80, 6);
+       clks[IMX6SL_CLK_USDHC4]       = imx_clk_gate2("usdhc4",       
"usdhc4_podf",       base + 0x80, 8);
+ 
++      /* Ensure the MMDC CH0 handshake is bypassed */
++      writel_relaxed(readl_relaxed(base + CCDR) |
++              BM_CCM_CCDR_MMDC_CH0_MASK, base + CCDR);
++
+       imx_check_clocks(clks, ARRAY_SIZE(clks));
+ 
+       clk_data.clks = clks;
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c 
b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
+index e1dc4e5b34e1..82add4670c53 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
+@@ -362,10 +362,10 @@ static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", 
mod0_default_parents, 0x0a4,
+ static const char * const i2s_parents[] = { "pll-audio-8x", "pll-audio-4x",
+                                           "pll-audio-2x", "pll-audio" };
+ static SUNXI_CCU_MUX_WITH_GATE(i2s0_clk, "i2s0", i2s_parents,
+-                             0x0b0, 16, 2, BIT(31), 0);
++                             0x0b0, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+ 
+ static SUNXI_CCU_MUX_WITH_GATE(i2s1_clk, "i2s1", i2s_parents,
+-                             0x0b4, 16, 2, BIT(31), 0);
++                             0x0b4, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
+ 
+ /* TODO: the parent for most of the USB clocks is not known */
+ static SUNXI_CCU_GATE(usb_phy0_clk,   "usb-phy0",     "osc24M",
+@@ -442,7 +442,7 @@ static SUNXI_CCU_M_WITH_GATE(ve_clk, "ve", "pll-ve",
+ static SUNXI_CCU_GATE(ac_dig_clk,     "ac-dig",       "pll-audio",
+                     0x140, BIT(31), 0);
+ static SUNXI_CCU_GATE(ac_dig_4x_clk,  "ac-dig-4x",    "pll-audio-4x",
+-                    0x140, BIT(30), 0);
++                    0x140, BIT(30), CLK_SET_RATE_PARENT);
+ static SUNXI_CCU_GATE(avs_clk,                "avs",          "osc24M",
+                     0x144, BIT(31), 0);
+ 
+diff --git a/drivers/cpuidle/cpuidle-big_little.c 
b/drivers/cpuidle/cpuidle-big_little.c
+index db2ede565f1a..b44476a1b7ad 100644
+--- a/drivers/cpuidle/cpuidle-big_little.c
++++ b/drivers/cpuidle/cpuidle-big_little.c
+@@ -167,6 +167,7 @@ static int __init bl_idle_init(void)
+ {
+       int ret;
+       struct device_node *root = of_find_node_by_path("/");
++      const struct of_device_id *match_id;
+ 
+       if (!root)
+               return -ENODEV;
+@@ -174,7 +175,11 @@ static int __init bl_idle_init(void)
+       /*
+        * Initialize the driver just for a compliant set of machines
+        */
+-      if (!of_match_node(compatible_machine_match, root))
++      match_id = of_match_node(compatible_machine_match, root);
++
++      of_node_put(root);
++
++      if (!match_id)
+               return -ENODEV;
+ 
+       if (!mcpm_is_available())
+diff --git a/drivers/crypto/ux500/cryp/cryp_core.c 
b/drivers/crypto/ux500/cryp/cryp_core.c
+index 790f7cadc1ed..efebc484e371 100644
+--- a/drivers/crypto/ux500/cryp/cryp_core.c
++++ b/drivers/crypto/ux500/cryp/cryp_core.c
+@@ -555,7 +555,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx,
+               desc = dmaengine_prep_slave_sg(channel,
+                               ctx->device->dma.sg_src,
+                               ctx->device->dma.sg_src_len,
+-                              direction, DMA_CTRL_ACK);
++                              DMA_MEM_TO_DEV, DMA_CTRL_ACK);
+               break;
+ 
+       case DMA_FROM_DEVICE:
+@@ -579,7 +579,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx,
+               desc = dmaengine_prep_slave_sg(channel,
+                               ctx->device->dma.sg_dst,
+                               ctx->device->dma.sg_dst_len,
+-                              direction,
++                              DMA_DEV_TO_MEM,
+                               DMA_CTRL_ACK |
+                               DMA_PREP_INTERRUPT);
+ 
+diff --git a/drivers/crypto/ux500/hash/hash_core.c 
b/drivers/crypto/ux500/hash/hash_core.c
+index 9acccad26928..17c8e2b28c42 100644
+--- a/drivers/crypto/ux500/hash/hash_core.c
++++ b/drivers/crypto/ux500/hash/hash_core.c
+@@ -165,7 +165,7 @@ static int hash_set_dma_transfer(struct hash_ctx *ctx, 
struct scatterlist *sg,
+               __func__);
+       desc = dmaengine_prep_slave_sg(channel,
+                       ctx->device->dma.sg, ctx->device->dma.sg_len,
+-                      direction, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
++                      DMA_MEM_TO_DEV, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
+       if (!desc) {
+               dev_err(ctx->device->dev,
+                       "%s: dmaengine_prep_slave_sg() failed!\n", __func__);
+diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c
+index 6204cc32d09c..6ba53bbd0e16 100644
+--- a/drivers/dma/bcm2835-dma.c
++++ b/drivers/dma/bcm2835-dma.c
+@@ -415,38 +415,32 @@ static void bcm2835_dma_fill_cb_chain_with_sg(
+       }
+ }
+ 
+-static int bcm2835_dma_abort(void __iomem *chan_base)
++static int bcm2835_dma_abort(struct bcm2835_chan *c)
+ {
+-      unsigned long cs;
++      void __iomem *chan_base = c->chan_base;
+       long int timeout = 10000;
+ 
+-      cs = readl(chan_base + BCM2835_DMA_CS);
+-      if (!(cs & BCM2835_DMA_ACTIVE))
++      /*
++       * A zero control block address means the channel is idle.
++       * (The ACTIVE flag in the CS register is not a reliable indicator.)
++       */
++      if (!readl(chan_base + BCM2835_DMA_ADDR))
+               return 0;
+ 
+       /* Write 0 to the active bit - Pause the DMA */
+       writel(0, chan_base + BCM2835_DMA_CS);
+ 
+       /* Wait for any current AXI transfer to complete */
+-      while ((cs & BCM2835_DMA_ISPAUSED) && --timeout) {
++      while ((readl(chan_base + BCM2835_DMA_CS) &
++              BCM2835_DMA_WAITING_FOR_WRITES) && --timeout)
+               cpu_relax();
+-              cs = readl(chan_base + BCM2835_DMA_CS);
+-      }
+ 
+-      /* We'll un-pause when we set of our next DMA */
++      /* Peripheral might be stuck and fail to signal AXI write responses */
+       if (!timeout)
+-              return -ETIMEDOUT;
+-
+-      if (!(cs & BCM2835_DMA_ACTIVE))
+-              return 0;
+-
+-      /* Terminate the control block chain */
+-      writel(0, chan_base + BCM2835_DMA_NEXTCB);
+-
+-      /* Abort the whole DMA */
+-      writel(BCM2835_DMA_ABORT | BCM2835_DMA_ACTIVE,
+-             chan_base + BCM2835_DMA_CS);
++              dev_err(c->vc.chan.device->dev,
++                      "failed to complete outstanding writes\n");
+ 
++      writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS);
+       return 0;
+ }
+ 
+@@ -485,8 +479,15 @@ static irqreturn_t bcm2835_dma_callback(int irq, void 
*data)
+ 
+       spin_lock_irqsave(&c->vc.lock, flags);
+ 
+-      /* Acknowledge interrupt */
+-      writel(BCM2835_DMA_INT, c->chan_base + BCM2835_DMA_CS);
++      /*
++       * Clear the INT flag to receive further interrupts. Keep the channel
++       * active in case the descriptor is cyclic or in case the client has
++       * already terminated the descriptor and issued a new one. (May happen
++       * if this IRQ handler is threaded.) If the channel is finished, it
++       * will remain idle despite the ACTIVE flag being set.
++       */
++      writel(BCM2835_DMA_INT | BCM2835_DMA_ACTIVE,
++             c->chan_base + BCM2835_DMA_CS);
+ 
+       d = c->desc;
+ 
+@@ -494,11 +495,7 @@ static irqreturn_t bcm2835_dma_callback(int irq, void 
*data)
+               if (d->cyclic) {
+                       /* call the cyclic callback */
+                       vchan_cyclic_callback(&d->vd);
+-
+-                      /* Keep the DMA engine running */
+-                      writel(BCM2835_DMA_ACTIVE,
+-                             c->chan_base + BCM2835_DMA_CS);
+-              } else {
++              } else if (!readl(c->chan_base + BCM2835_DMA_ADDR)) {
+                       vchan_cookie_complete(&c->desc->vd);
+                       bcm2835_dma_start_desc(c);
+               }
+@@ -796,7 +793,6 @@ static int bcm2835_dma_terminate_all(struct dma_chan *chan)
+       struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
+       struct bcm2835_dmadev *d = to_bcm2835_dma_dev(c->vc.chan.device);
+       unsigned long flags;
+-      int timeout = 10000;
+       LIST_HEAD(head);
+ 
+       spin_lock_irqsave(&c->vc.lock, flags);
+@@ -806,27 +802,11 @@ static int bcm2835_dma_terminate_all(struct dma_chan 
*chan)
+       list_del_init(&c->node);
+       spin_unlock(&d->lock);
+ 
+-      /*
+-       * Stop DMA activity: we assume the callback will not be called
+-       * after bcm_dma_abort() returns (even if it does, it will see
+-       * c->desc is NULL and exit.)
+-       */
++      /* stop DMA activity */
+       if (c->desc) {
+               bcm2835_dma_desc_free(&c->desc->vd);
+               c->desc = NULL;
+-              bcm2835_dma_abort(c->chan_base);
+-
+-              /* Wait for stopping */
+-              while (--timeout) {
+-                      if (!(readl(c->chan_base + BCM2835_DMA_CS) &
+-                                              BCM2835_DMA_ACTIVE))
+-                              break;
+-
+-                      cpu_relax();
+-              }
+-
+-              if (!timeout)
+-                      dev_err(d->ddev.dev, "DMA transfer could not be 
terminated\n");
++              bcm2835_dma_abort(c);
+       }
+ 
+       vchan_get_all_descriptors(&c->vc, &head);
+diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
+index ab0fb804fb1e..1cfa1d9bc971 100644
+--- a/drivers/dma/imx-dma.c
++++ b/drivers/dma/imx-dma.c
+@@ -623,7 +623,7 @@ static void imxdma_tasklet(unsigned long data)
+ {
+       struct imxdma_channel *imxdmac = (void *)data;
+       struct imxdma_engine *imxdma = imxdmac->imxdma;
+-      struct imxdma_desc *desc;
++      struct imxdma_desc *desc, *next_desc;
+       unsigned long flags;
+ 
+       spin_lock_irqsave(&imxdma->lock, flags);
+@@ -653,10 +653,10 @@ static void imxdma_tasklet(unsigned long data)
+       list_move_tail(imxdmac->ld_active.next, &imxdmac->ld_free);
+ 
+       if (!list_empty(&imxdmac->ld_queue)) {
+-              desc = list_first_entry(&imxdmac->ld_queue, struct imxdma_desc,
+-                                      node);
++              next_desc = list_first_entry(&imxdmac->ld_queue,
++                                           struct imxdma_desc, node);
+               list_move_tail(imxdmac->ld_queue.next, &imxdmac->ld_active);
+-              if (imxdma_xfer_desc(desc) < 0)
++              if (imxdma_xfer_desc(next_desc) < 0)
+                       dev_warn(imxdma->dev, "%s: channel: %d couldn't xfer 
desc\n",
+                                __func__, imxdmac->channel);
+       }
+diff --git a/drivers/dma/xilinx/zynqmp_dma.c b/drivers/dma/xilinx/zynqmp_dma.c
+index 22658057fe27..9069fb854319 100644
+--- a/drivers/dma/xilinx/zynqmp_dma.c
++++ b/drivers/dma/xilinx/zynqmp_dma.c
+@@ -159,7 +159,7 @@ struct zynqmp_dma_desc_ll {
+       u32 ctrl;
+       u64 nxtdscraddr;
+       u64 rsvd;
+-}; __aligned(64)
++};
+ 
+ /**
+  * struct zynqmp_dma_desc_sw - Per Transaction structure
+diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
+index 9336ffdf6e2c..fceaafd67ec6 100644
+--- a/drivers/firmware/efi/vars.c
++++ b/drivers/firmware/efi/vars.c
+@@ -318,7 +318,12 @@ EXPORT_SYMBOL_GPL(efivar_variable_is_removable);
+ static efi_status_t
+ check_var_size(u32 attributes, unsigned long size)
+ {
+-      const struct efivar_operations *fops = __efivars->ops;
++      const struct efivar_operations *fops;
++
++      if (!__efivars)
++              return EFI_UNSUPPORTED;
++
++      fops = __efivars->ops;
+ 
+       if (!fops->query_variable_store)
+               return EFI_UNSUPPORTED;
+@@ -329,7 +334,12 @@ check_var_size(u32 attributes, unsigned long size)
+ static efi_status_t
+ check_var_size_nonblocking(u32 attributes, unsigned long size)
+ {
+-      const struct efivar_operations *fops = __efivars->ops;
++      const struct efivar_operations *fops;
++
++      if (!__efivars)
++              return EFI_UNSUPPORTED;
++
++      fops = __efivars->ops;
+ 
+       if (!fops->query_variable_store)
+               return EFI_UNSUPPORTED;
+@@ -429,13 +439,18 @@ static void dup_variable_bug(efi_char16_t *str16, 
efi_guid_t *vendor_guid,
+ int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void 
*),
+               void *data, bool duplicates, struct list_head *head)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       unsigned long variable_name_size = 1024;
+       efi_char16_t *variable_name;
+       efi_status_t status;
+       efi_guid_t vendor_guid;
+       int err = 0;
+ 
++      if (!__efivars)
++              return -EFAULT;
++
++      ops = __efivars->ops;
++
+       variable_name = kzalloc(variable_name_size, GFP_KERNEL);
+       if (!variable_name) {
+               printk(KERN_ERR "efivars: Memory allocation failed.\n");
+@@ -583,12 +598,14 @@ static void efivar_entry_list_del_unlock(struct 
efivar_entry *entry)
+  */
+ int __efivar_entry_delete(struct efivar_entry *entry)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
+       efi_status_t status;
+ 
+-      status = ops->set_variable(entry->var.VariableName,
+-                                 &entry->var.VendorGuid,
+-                                 0, 0, NULL);
++      if (!__efivars)
++              return -EINVAL;
++
++      status = __efivars->ops->set_variable(entry->var.VariableName,
++                                            &entry->var.VendorGuid,
++                                            0, 0, NULL);
+ 
+       return efi_status_to_err(status);
+ }
+@@ -607,12 +624,17 @@ EXPORT_SYMBOL_GPL(__efivar_entry_delete);
+  */
+ int efivar_entry_delete(struct efivar_entry *entry)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       efi_status_t status;
+ 
+       if (down_interruptible(&efivars_lock))
+               return -EINTR;
+ 
++      if (!__efivars) {
++              up(&efivars_lock);
++              return -EINVAL;
++      }
++      ops = __efivars->ops;
+       status = ops->set_variable(entry->var.VariableName,
+                                  &entry->var.VendorGuid,
+                                  0, 0, NULL);
+@@ -650,13 +672,19 @@ EXPORT_SYMBOL_GPL(efivar_entry_delete);
+ int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
+                    unsigned long size, void *data, struct list_head *head)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       efi_status_t status;
+       efi_char16_t *name = entry->var.VariableName;
+       efi_guid_t vendor = entry->var.VendorGuid;
+ 
+       if (down_interruptible(&efivars_lock))
+               return -EINTR;
++
++      if (!__efivars) {
++              up(&efivars_lock);
++              return -EINVAL;
++      }
++      ops = __efivars->ops;
+       if (head && efivar_entry_find(name, vendor, head, false)) {
+               up(&efivars_lock);
+               return -EEXIST;
+@@ -687,12 +715,17 @@ static int
+ efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor,
+                            u32 attributes, unsigned long size, void *data)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       efi_status_t status;
+ 
+       if (down_trylock(&efivars_lock))
+               return -EBUSY;
+ 
++      if (!__efivars) {
++              up(&efivars_lock);
++              return -EINVAL;
++      }
++
+       status = check_var_size_nonblocking(attributes,
+                                           size + ucs2_strsize(name, 1024));
+       if (status != EFI_SUCCESS) {
+@@ -700,6 +733,7 @@ efivar_entry_set_nonblocking(efi_char16_t *name, 
efi_guid_t vendor,
+               return -ENOSPC;
+       }
+ 
++      ops = __efivars->ops;
+       status = ops->set_variable_nonblocking(name, &vendor, attributes,
+                                              size, data);
+ 
+@@ -727,9 +761,13 @@ efivar_entry_set_nonblocking(efi_char16_t *name, 
efi_guid_t vendor,
+ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 
attributes,
+                         bool block, unsigned long size, void *data)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       efi_status_t status;
+ 
++      if (!__efivars)
++              return -EINVAL;
++
++      ops = __efivars->ops;
+       if (!ops->query_variable_store)
+               return -ENOSYS;
+ 
+@@ -829,13 +867,18 @@ EXPORT_SYMBOL_GPL(efivar_entry_find);
+  */
+ int efivar_entry_size(struct efivar_entry *entry, unsigned long *size)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       efi_status_t status;
+ 
+       *size = 0;
+ 
+       if (down_interruptible(&efivars_lock))
+               return -EINTR;
++      if (!__efivars) {
++              up(&efivars_lock);
++              return -EINVAL;
++      }
++      ops = __efivars->ops;
+       status = ops->get_variable(entry->var.VariableName,
+                                  &entry->var.VendorGuid, NULL, size, NULL);
+       up(&efivars_lock);
+@@ -861,12 +904,14 @@ EXPORT_SYMBOL_GPL(efivar_entry_size);
+ int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
+                      unsigned long *size, void *data)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
+       efi_status_t status;
+ 
+-      status = ops->get_variable(entry->var.VariableName,
+-                                 &entry->var.VendorGuid,
+-                                 attributes, size, data);
++      if (!__efivars)
++              return -EINVAL;
++
++      status = __efivars->ops->get_variable(entry->var.VariableName,
++                                            &entry->var.VendorGuid,
++                                            attributes, size, data);
+ 
+       return efi_status_to_err(status);
+ }
+@@ -882,14 +927,19 @@ EXPORT_SYMBOL_GPL(__efivar_entry_get);
+ int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
+                    unsigned long *size, void *data)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
+       efi_status_t status;
+ 
+       if (down_interruptible(&efivars_lock))
+               return -EINTR;
+-      status = ops->get_variable(entry->var.VariableName,
+-                                 &entry->var.VendorGuid,
+-                                 attributes, size, data);
++
++      if (!__efivars) {
++              up(&efivars_lock);
++              return -EINVAL;
++      }
++
++      status = __efivars->ops->get_variable(entry->var.VariableName,
++                                            &entry->var.VendorGuid,
++                                            attributes, size, data);
+       up(&efivars_lock);
+ 
+       return efi_status_to_err(status);
+@@ -921,7 +971,7 @@ EXPORT_SYMBOL_GPL(efivar_entry_get);
+ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
+                             unsigned long *size, void *data, bool *set)
+ {
+-      const struct efivar_operations *ops = __efivars->ops;
++      const struct efivar_operations *ops;
+       efi_char16_t *name = entry->var.VariableName;
+       efi_guid_t *vendor = &entry->var.VendorGuid;
+       efi_status_t status;
+@@ -940,6 +990,11 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, 
u32 attributes,
+       if (down_interruptible(&efivars_lock))
+               return -EINTR;
+ 
++      if (!__efivars) {
++              err = -EINVAL;
++              goto out;
++      }
++
+       /*
+        * Ensure that the available space hasn't shrunk below the safe level
+        */
+@@ -956,6 +1011,8 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, 
u32 attributes,
+               }
+       }
+ 
++      ops = __efivars->ops;
++
+       status = ops->set_variable(name, vendor, attributes, *size, data);
+       if (status != EFI_SUCCESS) {
+               err = efi_status_to_err(status);
+diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
+index adb1dd7fde5f..9ccd7d702cd3 100644
+--- a/drivers/gpu/drm/drm_bufs.c
++++ b/drivers/gpu/drm/drm_bufs.c
+@@ -36,6 +36,8 @@
+ #include <drm/drmP.h>
+ #include "drm_legacy.h"
+ 
++#include <linux/nospec.h>
++
+ static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
+                                                 struct drm_local_map *map)
+ {
+@@ -1413,6 +1415,7 @@ int drm_legacy_freebufs(struct drm_device *dev, void 
*data,
+                                 idx, dma->buf_count - 1);
+                       return -EINVAL;
+               }
++              idx = array_index_nospec(idx, dma->buf_count);
+               buf = dma->buflist[idx];
+               if (buf->file_priv != file_priv) {
+                       DRM_ERROR("Process %d freeing buffer not owned\n",
+diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
+index 70051bf0ee5c..0376c0c2fc66 100644
+--- a/drivers/gpu/drm/vc4/vc4_plane.c
++++ b/drivers/gpu/drm/vc4/vc4_plane.c
+@@ -345,12 +345,14 @@ static int vc4_plane_setup_clipping_and_scaling(struct 
drm_plane_state *state)
+                       vc4_get_scaling_mode(vc4_state->src_h[1],
+                                            vc4_state->crtc_h);
+ 
+-              /* YUV conversion requires that horizontal scaling be enabled,
+-               * even on a plane that's otherwise 1:1. Looks like only PPF
+-               * works in that case, so let's pick that one.
++              /* YUV conversion requires that horizontal scaling be enabled
++               * on the UV plane even if vc4_get_scaling_mode() returned
++               * VC4_SCALING_NONE (which can happen when the down-scaling
++               * ratio is 0.5). Let's force it to VC4_SCALING_PPF in this
++               * case.
+                */
+-              if (vc4_state->is_unity)
+-                      vc4_state->x_scaling[0] = VC4_SCALING_PPF;
++              if (vc4_state->x_scaling[1] == VC4_SCALING_NONE)
++                      vc4_state->x_scaling[1] = VC4_SCALING_PPF;
+       } else {
+               vc4_state->is_yuv = false;
+               vc4_state->x_scaling[1] = VC4_SCALING_NONE;
+diff --git a/drivers/gpu/ipu-v3/ipu-image-convert.c 
b/drivers/gpu/ipu-v3/ipu-image-convert.c
+index 805b6fa7b5f4..50b73f3876fb 100644
+--- a/drivers/gpu/ipu-v3/ipu-image-convert.c
++++ b/drivers/gpu/ipu-v3/ipu-image-convert.c
+@@ -1513,7 +1513,7 @@ unlock:
+ EXPORT_SYMBOL_GPL(ipu_image_convert_queue);
+ 
+ /* Abort any active or pending conversions for this context */
+-void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
++static void __ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
+ {
+       struct ipu_image_convert_chan *chan = ctx->chan;
+       struct ipu_image_convert_priv *priv = chan->priv;
+@@ -1540,7 +1540,7 @@ void ipu_image_convert_abort(struct 
ipu_image_convert_ctx *ctx)
+ 
+       need_abort = (run_count || active_run);
+ 
+-      ctx->aborting = need_abort;
++      ctx->aborting = true;
+ 
+       spin_unlock_irqrestore(&chan->irqlock, flags);
+ 
+@@ -1561,7 +1561,11 @@ void ipu_image_convert_abort(struct 
ipu_image_convert_ctx *ctx)
+               dev_warn(priv->ipu->dev, "%s: timeout\n", __func__);
+               force_abort(ctx);
+       }
++}
+ 
++void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
++{
++      __ipu_image_convert_abort(ctx);
+       ctx->aborting = false;
+ }
+ EXPORT_SYMBOL_GPL(ipu_image_convert_abort);
+@@ -1575,7 +1579,7 @@ void ipu_image_convert_unprepare(struct 
ipu_image_convert_ctx *ctx)
+       bool put_res;
+ 
+       /* make sure no runs are hanging around */
+-      ipu_image_convert_abort(ctx);
++      __ipu_image_convert_abort(ctx);
+ 
+       dev_dbg(priv->ipu->dev, "%s: task %u: removing ctx %p\n", __func__,
+               chan->ic_task, ctx);
+diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
+index 1ac4ff4d57a6..d409cc8759fc 100644
+--- a/drivers/hid/hid-lenovo.c
++++ b/drivers/hid/hid-lenovo.c
+@@ -713,7 +713,9 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
+       data_pointer->led_mute.brightness_get = lenovo_led_brightness_get_tpkbd;
+       data_pointer->led_mute.brightness_set = lenovo_led_brightness_set_tpkbd;
+       data_pointer->led_mute.dev = dev;
+-      led_classdev_register(dev, &data_pointer->led_mute);
++      ret = led_classdev_register(dev, &data_pointer->led_mute);
++      if (ret < 0)
++              goto err;
+ 
+       data_pointer->led_micmute.name = name_micmute;
+       data_pointer->led_micmute.brightness_get =
+@@ -721,7 +723,11 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
+       data_pointer->led_micmute.brightness_set =
+               lenovo_led_brightness_set_tpkbd;
+       data_pointer->led_micmute.dev = dev;
+-      led_classdev_register(dev, &data_pointer->led_micmute);
++      ret = led_classdev_register(dev, &data_pointer->led_micmute);
++      if (ret < 0) {
++              led_classdev_unregister(&data_pointer->led_mute);
++              goto err;
++      }
+ 
+       lenovo_features_set_tpkbd(hdev);
+ 
+diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c
+index 4bcd9b882948..cb6606a0470d 100644
+--- a/drivers/hwmon/lm80.c
++++ b/drivers/hwmon/lm80.c
+@@ -360,9 +360,11 @@ static ssize_t set_fan_div(struct device *dev, struct 
device_attribute *attr,
+       struct i2c_client *client = data->client;
+       unsigned long min, val;
+       u8 reg;
+-      int err = kstrtoul(buf, 10, &val);
+-      if (err < 0)
+-              return err;
++      int rv;
++
++      rv = kstrtoul(buf, 10, &val);
++      if (rv < 0)
++              return rv;
+ 
+       /* Save fan_min */
+       mutex_lock(&data->update_lock);
+@@ -390,8 +392,11 @@ static ssize_t set_fan_div(struct device *dev, struct 
device_attribute *attr,
+               return -EINVAL;
+       }
+ 
+-      reg = (lm80_read_value(client, LM80_REG_FANDIV) &
+-             ~(3 << (2 * (nr + 1)))) | (data->fan_div[nr] << (2 * (nr + 1)));
++      rv = lm80_read_value(client, LM80_REG_FANDIV);
++      if (rv < 0)
++              return rv;
++      reg = (rv & ~(3 << (2 * (nr + 1))))
++          | (data->fan_div[nr] << (2 * (nr + 1)));
+       lm80_write_value(client, LM80_REG_FANDIV, reg);
+ 
+       /* Restore fan_min */
+@@ -623,6 +628,7 @@ static int lm80_probe(struct i2c_client *client,
+       struct device *dev = &client->dev;
+       struct device *hwmon_dev;
+       struct lm80_data *data;
++      int rv;
+ 
+       data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL);
+       if (!data)
+@@ -635,8 +641,14 @@ static int lm80_probe(struct i2c_client *client,
+       lm80_init_client(client);
+ 
+       /* A few vars need to be filled upon startup */
+-      data->fan[f_min][0] = lm80_read_value(client, LM80_REG_FAN_MIN(1));
+-      data->fan[f_min][1] = lm80_read_value(client, LM80_REG_FAN_MIN(2));
++      rv = lm80_read_value(client, LM80_REG_FAN_MIN(1));
++      if (rv < 0)
++              return rv;
++      data->fan[f_min][0] = rv;
++      rv = lm80_read_value(client, LM80_REG_FAN_MIN(2));
++      if (rv < 0)
++              return rv;
++      data->fan[f_min][1] = rv;
+ 
+       hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
+                                                          data, lm80_groups);
+diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
+index 96a6d5df9b26..b0962897bc45 100644
+--- a/drivers/i2c/busses/i2c-axxia.c
++++ b/drivers/i2c/busses/i2c-axxia.c
+@@ -296,22 +296,7 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
+                       i2c_int_disable(idev, MST_STATUS_TFL);
+       }
+ 
+-      if (status & MST_STATUS_SCC) {
+-              /* Stop completed */
+-              i2c_int_disable(idev, ~MST_STATUS_TSS);
+-              complete(&idev->msg_complete);
+-      } else if (status & MST_STATUS_SNS) {
+-              /* Transfer done */
+-              i2c_int_disable(idev, ~MST_STATUS_TSS);
+-              if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
+-                      axxia_i2c_empty_rx_fifo(idev);
+-              complete(&idev->msg_complete);
+-      } else if (status & MST_STATUS_TSS) {
+-              /* Transfer timeout */
+-              idev->msg_err = -ETIMEDOUT;
+-              i2c_int_disable(idev, ~MST_STATUS_TSS);
+-              complete(&idev->msg_complete);
+-      } else if (unlikely(status & MST_STATUS_ERR)) {
++      if (unlikely(status & MST_STATUS_ERR)) {
+               /* Transfer error */
+               i2c_int_disable(idev, ~0);
+               if (status & MST_STATUS_AL)
+@@ -328,6 +313,21 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
+                       readl(idev->base + MST_TX_BYTES_XFRD),
+                       readl(idev->base + MST_TX_XFER));
+               complete(&idev->msg_complete);
++      } else if (status & MST_STATUS_SCC) {
++              /* Stop completed */
++              i2c_int_disable(idev, ~MST_STATUS_TSS);
++              complete(&idev->msg_complete);
++      } else if (status & MST_STATUS_SNS) {
++              /* Transfer done */
++              i2c_int_disable(idev, ~MST_STATUS_TSS);
++              if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
++                      axxia_i2c_empty_rx_fifo(idev);
++              complete(&idev->msg_complete);
++      } else if (status & MST_STATUS_TSS) {
++              /* Transfer timeout */
++              idev->msg_err = -ETIMEDOUT;
++              i2c_int_disable(idev, ~MST_STATUS_TSS);
++              complete(&idev->msg_complete);
+       }
+ 
+ out:
+diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
+index 3f968c46e667..784636800361 100644
+--- a/drivers/iio/accel/kxcjk-1013.c
++++ b/drivers/iio/accel/kxcjk-1013.c
+@@ -1393,6 +1393,7 @@ static const struct acpi_device_id kx_acpi_match[] = {
+       {"KXCJ1008", KXCJ91008},
+       {"KXCJ9000", KXCJ91008},
+       {"KIOX000A", KXCJ91008},
++      {"KIOX010A", KXCJ91008}, /* KXCJ91008 inside the display of a 2-in-1 */
+       {"KXTJ1009", KXTJ21009},
+       {"SMO8500",  KXCJ91008},
+       { },
+diff --git a/drivers/infiniband/hw/hfi1/ruc.c 
b/drivers/infiniband/hw/hfi1/ruc.c
+index 9f768b48321f..d1514294bd68 100644
+--- a/drivers/infiniband/hw/hfi1/ruc.c
++++ b/drivers/infiniband/hw/hfi1/ruc.c
+@@ -471,6 +471,8 @@ send:
+                       goto op_err;
+               if (!ret)
+                       goto rnr_nak;
++              if (wqe->length > qp->r_len)
++                      goto inv_err;
+               break;
+ 
+       case IB_WR_RDMA_WRITE_WITH_IMM:
+@@ -638,7 +640,10 @@ op_err:
+       goto err;
+ 
+ inv_err:
+-      send_status = IB_WC_REM_INV_REQ_ERR;
++      send_status =
++              sqp->ibqp.qp_type == IB_QPT_RC ?
++                      IB_WC_REM_INV_REQ_ERR :
++                      IB_WC_SUCCESS;
+       wc.status = IB_WC_LOC_QP_OP_ERR;
+       goto err;
+ 
+diff --git a/drivers/infiniband/hw/qib/qib_ruc.c 
b/drivers/infiniband/hw/qib/qib_ruc.c
+index de1bde5950f5..10afde6d02fa 100644
+--- a/drivers/infiniband/hw/qib/qib_ruc.c
++++ b/drivers/infiniband/hw/qib/qib_ruc.c
+@@ -449,6 +449,8 @@ again:
+                       goto op_err;
+               if (!ret)
+                       goto rnr_nak;
++              if (wqe->length > qp->r_len)
++                      goto inv_err;
+               break;
+ 
+       case IB_WR_RDMA_WRITE_WITH_IMM:
+@@ -612,7 +614,10 @@ op_err:
+       goto err;
+ 
+ inv_err:
+-      send_status = IB_WC_REM_INV_REQ_ERR;
++      send_status =
++              sqp->ibqp.qp_type == IB_QPT_RC ?
++                      IB_WC_REM_INV_REQ_ERR :
++                      IB_WC_SUCCESS;
+       wc.status = IB_WC_LOC_QP_OP_ERR;
+       goto err;
+ 
+diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
+index bba1b9f2f782..e984418ffa2a 100644
+--- a/drivers/iommu/amd_iommu.c
++++ b/drivers/iommu/amd_iommu.c
+@@ -464,7 +464,14 @@ static int iommu_init_device(struct device *dev)
+ 
+       dev_data->alias = get_alias(dev);
+ 
+-      if (dev_is_pci(dev) && pci_iommuv2_capable(to_pci_dev(dev))) {
++      /*
++       * By default we use passthrough mode for IOMMUv2 capable device.
++       * But if amd_iommu=force_isolation is set (e.g. to debug DMA to
++       * invalid address), we ignore the capability for the device so
++       * it'll be forced to go into translation mode.
++       */
++      if ((iommu_pass_through || !amd_iommu_force_isolation) &&
++          dev_is_pci(dev) && pci_iommuv2_capable(to_pci_dev(dev))) {
+               struct amd_iommu *iommu;
+ 
+               iommu = amd_iommu_rlookup_table[dev_data->devid];
+diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
+index ff4be1174ff0..7bd98585d78d 100644
+--- a/drivers/iommu/arm-smmu-v3.c
++++ b/drivers/iommu/arm-smmu-v3.c
+@@ -697,7 +697,13 @@ static void queue_inc_cons(struct arm_smmu_queue *q)
+       u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
+ 
+       q->cons = Q_OVF(q, q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
+-      writel(q->cons, q->cons_reg);
++
++      /*
++       * Ensure that all CPU accesses (reads and writes) to the queue
++       * are complete before we update the cons pointer.
++       */
++      mb();
++      writel_relaxed(q->cons, q->cons_reg);
+ }
+ 
+ static int queue_sync_prod(struct arm_smmu_queue *q)
+diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
+index 5a9a4416f467..f7ecb30a0bac 100644
+--- a/drivers/iommu/arm-smmu.c
++++ b/drivers/iommu/arm-smmu.c
+@@ -297,6 +297,7 @@ enum arm_smmu_implementation {
+       GENERIC_SMMU,
+       ARM_MMU500,
+       CAVIUM_SMMUV2,
++      QCOM_SMMUV2,
+ };
+ 
+ struct arm_smmu_s2cr {
+@@ -1894,6 +1895,7 @@ ARM_SMMU_MATCH_DATA(smmu_generic_v2, ARM_SMMU_V2, 
GENERIC_SMMU);
+ ARM_SMMU_MATCH_DATA(arm_mmu401, ARM_SMMU_V1_64K, GENERIC_SMMU);
+ ARM_SMMU_MATCH_DATA(arm_mmu500, ARM_SMMU_V2, ARM_MMU500);
+ ARM_SMMU_MATCH_DATA(cavium_smmuv2, ARM_SMMU_V2, CAVIUM_SMMUV2);
++ARM_SMMU_MATCH_DATA(qcom_smmuv2, ARM_SMMU_V2, QCOM_SMMUV2);
+ 
+ static const struct of_device_id arm_smmu_of_match[] = {
+       { .compatible = "arm,smmu-v1", .data = &smmu_generic_v1 },
+@@ -1902,6 +1904,7 @@ static const struct of_device_id arm_smmu_of_match[] = {
+       { .compatible = "arm,mmu-401", .data = &arm_mmu401 },
+       { .compatible = "arm,mmu-500", .data = &arm_mmu500 },
+       { .compatible = "cavium,smmu-v2", .data = &cavium_smmuv2 },
++      { .compatible = "qcom,smmu-v2", .data = &qcom_smmuv2 },
+       { },
+ };
+ MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
+diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c
+index 90449e1e91e5..1b1453d62fed 100644
+--- a/drivers/isdn/hisax/hfc_pci.c
++++ b/drivers/isdn/hisax/hfc_pci.c
+@@ -1169,11 +1169,13 @@ HFCPCI_l1hw(struct PStack *st, int pr, void *arg)
+               if (cs->debug & L1_DEB_LAPD)
+                       debugl1(cs, "-> PH_REQUEST_PULL");
+ #endif
++              spin_lock_irqsave(&cs->lock, flags);
+               if (!cs->tx_skb) {
+                       test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
+                       st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
+               } else
+                       test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
++              spin_unlock_irqrestore(&cs->lock, flags);
+               break;
+       case (HW_RESET | REQUEST):
+               spin_lock_irqsave(&cs->lock, flags);
+diff --git a/drivers/media/i2c/ad9389b.c b/drivers/media/i2c/ad9389b.c
+index 50f354144ee7..2abbbc6392c0 100644
+--- a/drivers/media/i2c/ad9389b.c
++++ b/drivers/media/i2c/ad9389b.c
+@@ -590,7 +590,7 @@ static const struct v4l2_dv_timings_cap 
ad9389b_timings_cap = {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 170000000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 170000000,
+               V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+               V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
+diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511.c
+index 5ba0f21bcfe4..5f1c8ee8a50e 100644
+--- a/drivers/media/i2c/adv7511.c
++++ b/drivers/media/i2c/adv7511.c
+@@ -142,7 +142,7 @@ static const struct v4l2_dv_timings_cap 
adv7511_timings_cap = {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, ADV7511_MAX_WIDTH, 0, ADV7511_MAX_HEIGHT,
++      V4L2_INIT_BT_TIMINGS(640, ADV7511_MAX_WIDTH, 350, ADV7511_MAX_HEIGHT,
+               ADV7511_MIN_PIXELCLOCK, ADV7511_MAX_PIXELCLOCK,
+               V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
+index 7b1935ab03c8..ce6f93074ae0 100644
+--- a/drivers/media/i2c/adv7604.c
++++ b/drivers/media/i2c/adv7604.c
+@@ -777,7 +777,7 @@ static const struct v4l2_dv_timings_cap 
adv7604_timings_cap_analog = {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 170000000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 170000000,
+               V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+               V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
+@@ -788,7 +788,7 @@ static const struct v4l2_dv_timings_cap 
adv76xx_timings_cap_digital = {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 225000000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 225000000,
+               V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+               V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
+diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c
+index 8c2a52e280af..cf3b42c9417e 100644
+--- a/drivers/media/i2c/adv7842.c
++++ b/drivers/media/i2c/adv7842.c
+@@ -676,7 +676,7 @@ static const struct v4l2_dv_timings_cap 
adv7842_timings_cap_analog = {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 170000000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 170000000,
+               V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+               V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
+@@ -687,7 +687,7 @@ static const struct v4l2_dv_timings_cap 
adv7842_timings_cap_digital = {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 225000000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 225000000,
+               V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+               V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
+diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
+index 0f572bff64f5..7ebcb9473956 100644
+--- a/drivers/media/i2c/tc358743.c
++++ b/drivers/media/i2c/tc358743.c
+@@ -66,7 +66,7 @@ static const struct v4l2_dv_timings_cap tc358743_timings_cap 
= {
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+       /* Pixel clock from REF_01 p. 20. Min/max height/width are unknown */
+-      V4L2_INIT_BT_TIMINGS(1, 10000, 1, 10000, 0, 165000000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 13000000, 165000000,
+                       V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
+                       V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
+                       V4L2_DV_BT_CAP_PROGRESSIVE |
+diff --git a/drivers/media/i2c/ths8200.c b/drivers/media/i2c/ths8200.c
+index 42340e364cea..e06e2de87f90 100644
+--- a/drivers/media/i2c/ths8200.c
++++ b/drivers/media/i2c/ths8200.c
+@@ -49,7 +49,7 @@ static const struct v4l2_dv_timings_cap ths8200_timings_cap 
= {
+       .type = V4L2_DV_BT_656_1120,
+       /* keep this initialization for compatibility with GCC < 4.4.6 */
+       .reserved = { 0 },
+-      V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1080, 25000000, 148500000,
++      V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1080, 25000000, 148500000,
+               V4L2_DV_BT_STD_CEA861, V4L2_DV_BT_CAP_PROGRESSIVE)
+ };
+ 
+diff --git a/drivers/media/platform/davinci/vpbe.c 
b/drivers/media/platform/davinci/vpbe.c
+index 9a6c2cc38acb..abce9c4a1a8e 100644
+--- a/drivers/media/platform/davinci/vpbe.c
++++ b/drivers/media/platform/davinci/vpbe.c
+@@ -753,7 +753,7 @@ static int vpbe_initialize(struct device *dev, struct 
vpbe_device *vpbe_dev)
+       if (ret) {
+               v4l2_err(&vpbe_dev->v4l2_dev, "Failed to set default output %s",
+                        def_output);
+-              return ret;
++              goto fail_kfree_amp;
+       }
+ 
+       printk(KERN_NOTICE "Setting default mode to %s\n", def_mode);
+@@ -761,12 +761,15 @@ static int vpbe_initialize(struct device *dev, struct 
vpbe_device *vpbe_dev)
+       if (ret) {
+               v4l2_err(&vpbe_dev->v4l2_dev, "Failed to set default mode %s",
+                        def_mode);
+-              return ret;
++              goto fail_kfree_amp;
+       }
+       vpbe_dev->initialized = 1;
+       /* TBD handling of bootargs for default output and mode */
+       return 0;
+ 
++fail_kfree_amp:
++      mutex_lock(&vpbe_dev->lock);
++      kfree(vpbe_dev->amp);
+ fail_kfree_encoders:
+       kfree(vpbe_dev->encoders);
+ fail_dev_unregister:
+diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c 
b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c
+index 3e73e9db781f..7c025045ea90 100644
+--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c
++++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_pm.c
+@@ -41,25 +41,27 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev)
+       node = of_parse_phandle(dev->of_node, "mediatek,larb", 0);
+       if (!node) {
+               mtk_v4l2_err("no mediatek,larb found");
+-              return -1;
++              return -ENODEV;
+       }
+       pdev = of_find_device_by_node(node);
++      of_node_put(node);
+       if (!pdev) {
+               mtk_v4l2_err("no mediatek,larb device found");
+-              return -1;
++              return -ENODEV;
+       }
+       pm->larbvenc = &pdev->dev;
+ 
+       node = of_parse_phandle(dev->of_node, "mediatek,larb", 1);
+       if (!node) {
+               mtk_v4l2_err("no mediatek,larb found");
+-              return -1;
++              return -ENODEV;
+       }
+ 
+       pdev = of_find_device_by_node(node);
++      of_node_put(node);
+       if (!pdev) {
+               mtk_v4l2_err("no mediatek,larb device found");
+-              return -1;
++              return -ENODEV;
+       }
+ 
+       pm->larbvenclt = &pdev->dev;
+diff --git a/drivers/memstick/core/memstick.c 
b/drivers/memstick/core/memstick.c
+index a0547dbf9806..4d673a626db4 100644
+--- a/drivers/memstick/core/memstick.c
++++ b/drivers/memstick/core/memstick.c
+@@ -18,6 +18,7 @@
+ #include <linux/delay.h>
+ #include <linux/slab.h>
+ #include <linux/module.h>
++#include <linux/pm_runtime.h>
+ 
+ #define DRIVER_NAME "memstick"
+ 
+@@ -436,6 +437,7 @@ static void memstick_check(struct work_struct *work)
+       struct memstick_dev *card;
+ 
+       dev_dbg(&host->dev, "memstick_check started\n");
++      pm_runtime_get_noresume(host->dev.parent);
+       mutex_lock(&host->lock);
+       if (!host->card) {
+               if (memstick_power_on(host))
+@@ -479,6 +481,7 @@ out_power_off:
+               host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF);
+ 
+       mutex_unlock(&host->lock);
++      pm_runtime_put(host->dev.parent);
+       dev_dbg(&host->dev, "memstick_check finished\n");
+ }
+ 
+diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c 
b/drivers/net/ethernet/broadcom/bcmsysport.c
+index 16dc9ac7ecb6..53a506b0d790 100644
+--- a/drivers/net/ethernet/broadcom/bcmsysport.c
++++ b/drivers/net/ethernet/broadcom/bcmsysport.c
+@@ -378,7 +378,6 @@ static void bcm_sysport_get_wol(struct net_device *dev,
+                               struct ethtool_wolinfo *wol)
+ {
+       struct bcm_sysport_priv *priv = netdev_priv(dev);
+-      u32 reg;
+ 
+       wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE;
+       wol->wolopts = priv->wolopts;
+@@ -386,11 +385,7 @@ static void bcm_sysport_get_wol(struct net_device *dev,
+       if (!(priv->wolopts & WAKE_MAGICSECURE))
+               return;
+ 
+-      /* Return the programmed SecureOn password */
+-      reg = umac_readl(priv, UMAC_PSW_MS);
+-      put_unaligned_be16(reg, &wol->sopass[0]);
+-      reg = umac_readl(priv, UMAC_PSW_LS);
+-      put_unaligned_be32(reg, &wol->sopass[2]);
++      memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass));
+ }
+ 
+ static int bcm_sysport_set_wol(struct net_device *dev,
+@@ -406,13 +401,8 @@ static int bcm_sysport_set_wol(struct net_device *dev,
+       if (wol->wolopts & ~supported)
+               return -EINVAL;
+ 
+-      /* Program the SecureOn password */
+-      if (wol->wolopts & WAKE_MAGICSECURE) {
+-              umac_writel(priv, get_unaligned_be16(&wol->sopass[0]),
+-                          UMAC_PSW_MS);
+-              umac_writel(priv, get_unaligned_be32(&wol->sopass[2]),
+-                          UMAC_PSW_LS);
+-      }
++      if (wol->wolopts & WAKE_MAGICSECURE)
++              memcpy(priv->sopass, wol->sopass, sizeof(priv->sopass));
+ 
+       /* Flag the device and relevant IRQ as wakeup capable */
+       if (wol->wolopts) {
+@@ -1875,12 +1865,17 @@ static int bcm_sysport_suspend_to_wol(struct 
bcm_sysport_priv *priv)
+       unsigned int timeout = 1000;
+       u32 reg;
+ 
+-      /* Password has already been programmed */
+       reg = umac_readl(priv, UMAC_MPD_CTRL);
+       reg |= MPD_EN;
+       reg &= ~PSW_EN;
+-      if (priv->wolopts & WAKE_MAGICSECURE)
++      if (priv->wolopts & WAKE_MAGICSECURE) {
++              /* Program the SecureOn password */
++              umac_writel(priv, get_unaligned_be16(&priv->sopass[0]),
++                          UMAC_PSW_MS);
++              umac_writel(priv, get_unaligned_be32(&priv->sopass[2]),
++                          UMAC_PSW_LS);
+               reg |= PSW_EN;
++      }
+       umac_writel(priv, reg, UMAC_MPD_CTRL);
+ 
+       /* Make sure RBUF entered WoL mode as result */
+diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h 
b/drivers/net/ethernet/broadcom/bcmsysport.h
+index 07b0aaa98de0..0d3444f1d78a 100644
+--- a/drivers/net/ethernet/broadcom/bcmsysport.h
++++ b/drivers/net/ethernet/broadcom/bcmsysport.h
+@@ -11,6 +11,7 @@
+ #ifndef __BCM_SYSPORT_H
+ #define __BCM_SYSPORT_H
+ 
++#include <linux/ethtool.h>
+ #include <linux/if_vlan.h>
+ 
+ /* Receive/transmit descriptor format */
+@@ -681,6 +682,7 @@ struct bcm_sysport_priv {
+       unsigned int            crc_fwd:1;
+       u16                     rev;
+       u32                     wolopts;
++      u8                      sopass[SOPASS_MAX];
+       unsigned int            wol_irq_disabled:1;
+ 
+       /* MIB related fields */
+diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c 
b/drivers/net/ethernet/cisco/enic/enic_main.c
+index 07282eb76867..89acf7bc4cf9 100644
+--- a/drivers/net/ethernet/cisco/enic/enic_main.c
++++ b/drivers/net/ethernet/cisco/enic/enic_main.c
+@@ -1180,7 +1180,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
+                * CHECSUM_UNNECESSARY.
+                */
+               if ((netdev->features & NETIF_F_RXCSUM) && tcp_udp_csum_ok &&
+-                  ipv4_csum_ok)
++                  (ipv4_csum_ok || ipv6))
+                       skb->ip_summed = CHECKSUM_UNNECESSARY;
+ 
+               if (vlan_stripped)
+diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c 
b/drivers/net/ethernet/freescale/fman/fman_memac.c
+index 71a5ded9d1de..21dd5579130e 100644
+--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
++++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
+@@ -923,7 +923,7 @@ int memac_add_hash_mac_address(struct fman_mac *memac, 
enet_addr_t *eth_addr)
+       hash = get_mac_addr_hash_code(addr) & HASH_CTRL_ADDR_MASK;
+ 
+       /* Create element to be added to the driver hash table */
+-      hash_entry = kmalloc(sizeof(*hash_entry), GFP_KERNEL);
++      hash_entry = kmalloc(sizeof(*hash_entry), GFP_ATOMIC);
+       if (!hash_entry)
+               return -ENOMEM;
+       hash_entry->addr = addr;
+diff --git a/drivers/net/ethernet/freescale/fman/fman_tgec.c 
b/drivers/net/ethernet/freescale/fman/fman_tgec.c
+index 4b0f3a50b293..e575259d20f4 100644
+--- a/drivers/net/ethernet/freescale/fman/fman_tgec.c
++++ b/drivers/net/ethernet/freescale/fman/fman_tgec.c
+@@ -551,7 +551,7 @@ int tgec_add_hash_mac_address(struct fman_mac *tgec, 
enet_addr_t *eth_addr)
+       hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK;
+ 
+       /* Create element to be added to the driver hash table */
+-      hash_entry = kmalloc(sizeof(*hash_entry), GFP_KERNEL);
++      hash_entry = kmalloc(sizeof(*hash_entry), GFP_ATOMIC);
+       if (!hash_entry)
+               return -ENOMEM;
+       hash_entry->addr = addr;
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index 57c7456a5751..7836072d3f63 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -9194,6 +9194,9 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
+       ether_addr_copy(netdev->dev_addr, mac_addr);
+       ether_addr_copy(netdev->perm_addr, mac_addr);
+ 
++      /* i40iw_net_event() reads 16 bytes from neigh->primary_key */
++      netdev->neigh_priv_len = sizeof(u32) * 4;
++
+       netdev->priv_flags |= IFF_UNICAST_FLT;
+       netdev->priv_flags |= IFF_SUPP_NOFCS;
+       /* Setup netdev TC information */
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index 3a61491421b1..82e48e355fb9 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -7564,9 +7564,11 @@ static int __igb_shutdown(struct pci_dev *pdev, bool 
*enable_wake,
+       rtnl_unlock();
+ 
+ #ifdef CONFIG_PM
+-      retval = pci_save_state(pdev);
+-      if (retval)
+-              return retval;
++      if (!runtime) {
++              retval = pci_save_state(pdev);
++              if (retval)
++                      return retval;
++      }
+ #endif
+ 
+       status = rd32(E1000_STATUS);
+diff --git a/drivers/net/ethernet/marvell/skge.c 
b/drivers/net/ethernet/marvell/skge.c
+index 7173836fe361..c9f4b5412844 100644
+--- a/drivers/net/ethernet/marvell/skge.c
++++ b/drivers/net/ethernet/marvell/skge.c
+@@ -152,8 +152,10 @@ static void skge_get_regs(struct net_device *dev, struct 
ethtool_regs *regs,
+       memset(p, 0, regs->len);
+       memcpy_fromio(p, io, B3_RAM_ADDR);
+ 
+-      memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1,
+-                    regs->len - B3_RI_WTO_R1);
++      if (regs->len > B3_RI_WTO_R1) {
++              memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1,
++                            regs->len - B3_RI_WTO_R1);
++      }
+ }
+ 
+ /* Wake on Lan only supported on Yukon chips with rev 1 or above */
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+index 7309ae3b8c7b..2b6a7eb2be7e 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+@@ -553,6 +553,8 @@ static inline bool is_first_ethertype_ip(struct sk_buff 
*skb)
+       return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6));
+ }
+ 
++#define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN)
++
+ static inline void mlx5e_handle_csum(struct net_device *netdev,
+                                    struct mlx5_cqe64 *cqe,
+                                    struct mlx5e_rq *rq,
+@@ -567,6 +569,17 @@ static inline void mlx5e_handle_csum(struct net_device 
*netdev,
+               return;
+       }
+ 
++      /* CQE csum doesn't cover padding octets in short ethernet
++       * frames. And the pad field is appended prior to calculating
++       * and appending the FCS field.
++       *
++       * Detecting these padded frames requires to verify and parse
++       * IP headers, so we simply force all those small frames to be
++       * CHECKSUM_UNNECESSARY even if they are not padded.
++       */
++      if (short_frame(skb->len))
++              goto csum_unnecessary;
++
+       if (is_first_ethertype_ip(skb)) {
+               skb->ip_summed = CHECKSUM_COMPLETE;
+               skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
+@@ -574,6 +587,7 @@ static inline void mlx5e_handle_csum(struct net_device 
*netdev,
+               return;
+       }
+ 
++csum_unnecessary:
+       if (likely((cqe->hds_ip_ext & CQE_L3_OK) &&
+                  (cqe->hds_ip_ext & CQE_L4_OK))) {
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
+index e45e2f14fb94..fe5b0ac8c631 100644
+--- a/drivers/net/ethernet/sun/niu.c
++++ b/drivers/net/ethernet/sun/niu.c
+@@ -8121,6 +8121,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 
start, u32 end)
+               start += 3;
+ 
+               prop_len = niu_pci_eeprom_read(np, start + 4);
++              if (prop_len < 0)
++                      return prop_len;
+               err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
+               if (err < 0)
+                       return err;
+@@ -8165,8 +8167,12 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 
start, u32 end)
+                       netif_printk(np, probe, KERN_DEBUG, np->dev,
+                                    "VPD_SCAN: Reading in property [%s] 
len[%d]\n",
+                                    namebuf, prop_len);
+-                      for (i = 0; i < prop_len; i++)
+-                              *prop_buf++ = niu_pci_eeprom_read(np, off + i);
++                      for (i = 0; i < prop_len; i++) {
++                              err = niu_pci_eeprom_read(np, off + i);
++                              if (err >= 0)
++                                      *prop_buf = err;
++                              ++prop_buf;
++                      }
+               }
+ 
+               start += len;
+diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
+index 482ea404a2d4..557f6510bad7 100644
+--- a/drivers/net/phy/dp83640.c
++++ b/drivers/net/phy/dp83640.c
+@@ -891,14 +891,14 @@ static void decode_txts(struct dp83640_private *dp83640,
+                       struct phy_txts *phy_txts)
+ {
+       struct skb_shared_hwtstamps shhwtstamps;
++      struct dp83640_skb_info *skb_info;
+       struct sk_buff *skb;
+-      u64 ns;
+       u8 overflow;
++      u64 ns;
+ 
+       /* We must already have the skb that triggered this. */
+-
++again:
+       skb = skb_dequeue(&dp83640->tx_queue);
+-
+       if (!skb) {
+               pr_debug("have timestamp but tx_queue empty\n");
+               return;
+@@ -913,6 +913,11 @@ static void decode_txts(struct dp83640_private *dp83640,
+               }
+               return;
+       }
++      skb_info = (struct dp83640_skb_info *)skb->cb;
++      if (time_after(jiffies, skb_info->tmo)) {
++              kfree_skb(skb);
++              goto again;
++      }
+ 
+       ns = phy2txts(phy_txts);
+       memset(&shhwtstamps, 0, sizeof(shhwtstamps));
+@@ -1463,6 +1468,7 @@ static bool dp83640_rxtstamp(struct phy_device *phydev,
+ static void dp83640_txtstamp(struct phy_device *phydev,
+                            struct sk_buff *skb, int type)
+ {
++      struct dp83640_skb_info *skb_info = (struct dp83640_skb_info *)skb->cb;
+       struct dp83640_private *dp83640 = phydev->priv;
+ 
+       switch (dp83640->hwts_tx_en) {
+@@ -1475,6 +1481,7 @@ static void dp83640_txtstamp(struct phy_device *phydev,
+               /* fall through */
+       case HWTSTAMP_TX_ON:
+               skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
++              skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
+               skb_queue_tail(&dp83640->tx_queue, skb);
+               break;
+ 
+diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h 
b/drivers/net/wireless/ath/ath9k/ath9k.h
+index a7316710a902..7bda18c61eb6 100644
+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -267,7 +267,7 @@ struct ath_node {
+ #endif
+       u8 key_idx[4];
+ 
+-      u32 ackto;
++      int ackto;
+       struct list_head list;
+ };
+ 
+diff --git a/drivers/net/wireless/ath/ath9k/dynack.c 
b/drivers/net/wireless/ath/ath9k/dynack.c
+index 7334c9b09e82..6e236a485431 100644
+--- a/drivers/net/wireless/ath/ath9k/dynack.c
++++ b/drivers/net/wireless/ath/ath9k/dynack.c
+@@ -29,9 +29,13 @@
+  * ath_dynack_ewma - EWMA (Exponentially Weighted Moving Average) calculation
+  *
+  */
+-static inline u32 ath_dynack_ewma(u32 old, u32 new)
++static inline int ath_dynack_ewma(int old, int new)
+ {
+-      return (new * (EWMA_DIV - EWMA_LEVEL) + old * EWMA_LEVEL) / EWMA_DIV;
++      if (old > 0)
++              return (new * (EWMA_DIV - EWMA_LEVEL) +
++                      old * EWMA_LEVEL) / EWMA_DIV;
++      else
++              return new;
+ }
+ 
+ /**
+@@ -82,10 +86,10 @@ static inline bool ath_dynack_bssidmask(struct ath_hw *ah, 
const u8 *mac)
+  */
+ static void ath_dynack_compute_ackto(struct ath_hw *ah)
+ {
+-      struct ath_node *an;
+-      u32 to = 0;
+-      struct ath_dynack *da = &ah->dynack;
+       struct ath_common *common = ath9k_hw_common(ah);
++      struct ath_dynack *da = &ah->dynack;
++      struct ath_node *an;
++      int to = 0;
+ 
+       list_for_each_entry(an, &da->nodes, list)
+               if (an->ackto > to)
+@@ -144,7 +148,8 @@ static void ath_dynack_compute_to(struct ath_hw *ah)
+                                       an->ackto = ath_dynack_ewma(an->ackto,
+                                                                   ackto);
+                                       ath_dbg(ath9k_hw_common(ah), DYNACK,
+-                                              "%pM to %u\n", dst, an->ackto);
++                                              "%pM to %d [%u]\n", dst,
++                                              an->ackto, ackto);
+                                       if (time_is_before_jiffies(da->lto)) {
+                                               ath_dynack_compute_ackto(ah);
+                                               da->lto = jiffies + COMPUTE_TO;
+@@ -166,10 +171,12 @@ static void ath_dynack_compute_to(struct ath_hw *ah)
+  * @ah: ath hw
+  * @skb: socket buffer
+  * @ts: tx status info
++ * @sta: station pointer
+  *
+  */
+ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
+-                           struct ath_tx_status *ts)
++                           struct ath_tx_status *ts,
++                           struct ieee80211_sta *sta)
+ {
+       u8 ridx;
+       struct ieee80211_hdr *hdr;
+@@ -177,7 +184,7 @@ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct 
sk_buff *skb,
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ 
+-      if ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !da->enabled)
++      if (!da->enabled || (info->flags & IEEE80211_TX_CTL_NO_ACK))
+               return;
+ 
+       spin_lock_bh(&da->qlock);
+@@ -187,11 +194,19 @@ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct 
sk_buff *skb,
+       /* late ACK */
+       if (ts->ts_status & ATH9K_TXERR_XRETRY) {
+               if (ieee80211_is_assoc_req(hdr->frame_control) ||
+-                  ieee80211_is_assoc_resp(hdr->frame_control)) {
++                  ieee80211_is_assoc_resp(hdr->frame_control) ||
++                  ieee80211_is_auth(hdr->frame_control)) {
+                       ath_dbg(common, DYNACK, "late ack\n");
++
+                       ath9k_hw_setslottime(ah, (LATEACK_TO - 3) / 2);
+                       ath9k_hw_set_ack_timeout(ah, LATEACK_TO);
+                       ath9k_hw_set_cts_timeout(ah, LATEACK_TO);
++                      if (sta) {
++                              struct ath_node *an;
++
++                              an = (struct ath_node *)sta->drv_priv;
++                              an->ackto = -1;
++                      }
+                       da->lto = jiffies + LATEACK_DELAY;
+               }
+ 
+@@ -251,7 +266,7 @@ void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct 
sk_buff *skb,
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+ 
+-      if (!ath_dynack_bssidmask(ah, hdr->addr1) || !da->enabled)
++      if (!da->enabled || !ath_dynack_bssidmask(ah, hdr->addr1))
+               return;
+ 
+       spin_lock_bh(&da->qlock);
+diff --git a/drivers/net/wireless/ath/ath9k/dynack.h 
b/drivers/net/wireless/ath/ath9k/dynack.h
+index 6d7bef976742..cf60224d40df 100644
+--- a/drivers/net/wireless/ath/ath9k/dynack.h
++++ b/drivers/net/wireless/ath/ath9k/dynack.h
+@@ -86,7 +86,8 @@ void ath_dynack_node_deinit(struct ath_hw *ah, struct 
ath_node *an);
+ void ath_dynack_init(struct ath_hw *ah);
+ void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct sk_buff *skb, u32 ts);
+ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
+-                           struct ath_tx_status *ts);
++                           struct ath_tx_status *ts,
++                           struct ieee80211_sta *sta);
+ #else
+ static inline void ath_dynack_init(struct ath_hw *ah) {}
+ static inline void ath_dynack_node_init(struct ath_hw *ah,
+@@ -97,7 +98,8 @@ static inline void ath_dynack_sample_ack_ts(struct ath_hw 
*ah,
+                                           struct sk_buff *skb, u32 ts) {}
+ static inline void ath_dynack_sample_tx_ts(struct ath_hw *ah,
+                                          struct sk_buff *skb,
+-                                         struct ath_tx_status *ts) {}
++                                         struct ath_tx_status *ts,
++                                         struct ieee80211_sta *sta) {}
+ #endif
+ 
+ #endif /* DYNACK_H */
+diff --git a/drivers/net/wireless/ath/ath9k/xmit.c 
b/drivers/net/wireless/ath/ath9k/xmit.c
+index 8a504afe667e..0ef27d99bef3 100644
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -593,7 +593,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, 
struct ath_txq *txq,
+                               if (bf == bf->bf_lastbf)
+                                       ath_dynack_sample_tx_ts(sc->sc_ah,
+                                                               bf->bf_mpdu,
+-                                                              ts);
++                                                              ts, sta);
+                       }
+ 
+                       ath_tx_complete_buf(sc, bf, txq, &bf_head, sta, ts,
+@@ -709,7 +709,8 @@ static void ath_tx_process_buffer(struct ath_softc *sc, 
struct ath_txq *txq,
+                       memcpy(info->control.rates, bf->rates,
+                              sizeof(info->control.rates));
+                       ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
+-                      ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts);
++                      ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts,
++                                              sta);
+               }
+               ath_tx_complete_buf(sc, bf, txq, bf_head, sta, ts, txok);
+       } else
+diff --git a/drivers/net/wireless/st/cw1200/scan.c 
b/drivers/net/wireless/st/cw1200/scan.c
+index 0a0ff7e31f5b..c5492d792f43 100644
+--- a/drivers/net/wireless/st/cw1200/scan.c
++++ b/drivers/net/wireless/st/cw1200/scan.c
+@@ -78,6 +78,10 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
+       if (req->n_ssids > WSM_SCAN_MAX_NUM_OF_SSIDS)
+               return -EINVAL;
+ 
++      /* will be unlocked in cw1200_scan_work() */
++      down(&priv->scan.lock);
++      mutex_lock(&priv->conf_mutex);
++
+       frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
+               req->ie_len);
+       if (!frame.skb)
+@@ -86,19 +90,15 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
+       if (req->ie_len)
+               memcpy(skb_put(frame.skb, req->ie_len), req->ie, req->ie_len);
+ 
+-      /* will be unlocked in cw1200_scan_work() */
+-      down(&priv->scan.lock);
+-      mutex_lock(&priv->conf_mutex);
+-
+       ret = wsm_set_template_frame(priv, &frame);
+       if (!ret) {
+               /* Host want to be the probe responder. */
+               ret = wsm_set_probe_responder(priv, true);
+       }
+       if (ret) {
++              dev_kfree_skb(frame.skb);
+               mutex_unlock(&priv->conf_mutex);
+               up(&priv->scan.lock);
+-              dev_kfree_skb(frame.skb);
+               return ret;
+       }
+ 
+@@ -120,10 +120,9 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
+               ++priv->scan.n_ssids;
+       }
+ 
+-      mutex_unlock(&priv->conf_mutex);
+-
+       if (frame.skb)
+               dev_kfree_skb(frame.skb);
++      mutex_unlock(&priv->conf_mutex);
+       queue_work(priv->workqueue, &priv->scan.work);
+       return 0;
+ }
+diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c
+index 0e7f8f319fe3..9a60098f7b7d 100644
+--- a/drivers/pci/host/vmd.c
++++ b/drivers/pci/host/vmd.c
+@@ -731,6 +731,11 @@ static void vmd_remove(struct pci_dev *dev)
+ static int vmd_suspend(struct device *dev)
+ {
+       struct pci_dev *pdev = to_pci_dev(dev);
++      struct vmd_dev *vmd = pci_get_drvdata(pdev);
++      int i;
++
++      for (i = 0; i < vmd->msix_count; i++)
++                devm_free_irq(dev, pci_irq_vector(pdev, i), &vmd->irqs[i]);
+ 
+       pci_save_state(pdev);
+       return 0;
+@@ -739,6 +744,16 @@ static int vmd_suspend(struct device *dev)
+ static int vmd_resume(struct device *dev)
+ {
+       struct pci_dev *pdev = to_pci_dev(dev);
++      struct vmd_dev *vmd = pci_get_drvdata(pdev);
++      int err, i;
++
++      for (i = 0; i < vmd->msix_count; i++) {
++              err = devm_request_irq(dev, pci_irq_vector(pdev, i),
++                                     vmd_irq, IRQF_NO_THREAD,
++                                     "vmd", &vmd->irqs[i]);
++              if (err)
++                      return err;
++      }
+ 
+       pci_restore_state(pdev);
+       return 0;
+diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c 
b/drivers/pinctrl/meson/pinctrl-meson8.c
+index 07f1cb21c1b8..0de7fa414beb 100644
+--- a/drivers/pinctrl/meson/pinctrl-meson8.c
++++ b/drivers/pinctrl/meson/pinctrl-meson8.c
+@@ -736,7 +736,9 @@ static const char * const gpio_groups[] = {
+       "BOOT_5", "BOOT_6", "BOOT_7", "BOOT_8", "BOOT_9",
+       "BOOT_10", "BOOT_11", "BOOT_12", "BOOT_13", "BOOT_14",
+       "BOOT_15", "BOOT_16", "BOOT_17", "BOOT_18",
++};
+ 
++static const char * const gpio_aobus_groups[] = {
+       "GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3",
+       "GPIOAO_4", "GPIOAO_5", "GPIOAO_6", "GPIOAO_7",
+       "GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
+@@ -908,6 +910,7 @@ static struct meson_pmx_func meson8_cbus_functions[] = {
+ };
+ 
+ static struct meson_pmx_func meson8_aobus_functions[] = {
++      FUNCTION(gpio_aobus),
+       FUNCTION(uart_ao),
+       FUNCTION(remote),
+       FUNCTION(i2c_slave_ao),
+diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c 
b/drivers/pinctrl/meson/pinctrl-meson8b.c
+index f87ef5a0ee6c..cbe5f5cbddb8 100644
+--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
++++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
+@@ -643,16 +643,18 @@ static const char * const gpio_groups[] = {
+       "BOOT_10", "BOOT_11", "BOOT_12", "BOOT_13", "BOOT_14",
+       "BOOT_15", "BOOT_16", "BOOT_17", "BOOT_18",
+ 
+-      "GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3",
+-      "GPIOAO_4", "GPIOAO_5", "GPIOAO_6", "GPIOAO_7",
+-      "GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
+-      "GPIOAO_12", "GPIOAO_13", "GPIO_BSD_EN", "GPIO_TEST_N",
+-
+       "DIF_0_P", "DIF_0_N", "DIF_1_P", "DIF_1_N",
+       "DIF_2_P", "DIF_2_N", "DIF_3_P", "DIF_3_N",
+       "DIF_4_P", "DIF_4_N"
+ };
+ 
++static const char * const gpio_aobus_groups[] = {
++      "GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3",
++      "GPIOAO_4", "GPIOAO_5", "GPIOAO_6", "GPIOAO_7",
++      "GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
++      "GPIOAO_12", "GPIOAO_13", "GPIO_BSD_EN", "GPIO_TEST_N"
++};
++
+ static const char * const sd_a_groups[] = {
+       "sd_d0_a", "sd_d1_a", "sd_d2_a", "sd_d3_a", "sd_clk_a",
+       "sd_cmd_a"
+@@ -868,6 +870,7 @@ static struct meson_pmx_func meson8b_cbus_functions[] = {
+ };
+ 
+ static struct meson_pmx_func meson8b_aobus_functions[] = {
++      FUNCTION(gpio_aobus),
+       FUNCTION(uart_ao),
+       FUNCTION(uart_ao_b),
+       FUNCTION(i2c_slave_ao),
+diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c
+index a421d6c551b6..ecb41eacd74b 100644
+--- a/drivers/ptp/ptp_chardev.c
++++ b/drivers/ptp/ptp_chardev.c
+@@ -228,7 +228,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, 
unsigned long arg)
+                       pct->sec = ts.tv_sec;
+                       pct->nsec = ts.tv_nsec;
+                       pct++;
+-                      ptp->info->gettime64(ptp->info, &ts);
++                      err = ptp->info->gettime64(ptp->info, &ts);
++                      if (err)
++                              goto out;
+                       pct->sec = ts.tv_sec;
+                       pct->nsec = ts.tv_nsec;
+                       pct++;
+@@ -281,6 +283,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, 
unsigned long arg)
+               break;
+       }
+ 
++out:
+       kfree(sysoff);
+       return err;
+ }
+diff --git a/drivers/scsi/aic94xx/aic94xx_init.c 
b/drivers/scsi/aic94xx/aic94xx_init.c
+index 913ebb6d0d29..85442edf3c49 100644
+--- a/drivers/scsi/aic94xx/aic94xx_init.c
++++ b/drivers/scsi/aic94xx/aic94xx_init.c
+@@ -281,7 +281,7 @@ static ssize_t asd_show_dev_rev(struct device *dev,
+       return snprintf(buf, PAGE_SIZE, "%s\n",
+                       asd_dev_rev[asd_ha->revision_id]);
+ }
+-static DEVICE_ATTR(revision, S_IRUGO, asd_show_dev_rev, NULL);
++static DEVICE_ATTR(aic_revision, S_IRUGO, asd_show_dev_rev, NULL);
+ 
+ static ssize_t asd_show_dev_bios_build(struct device *dev,
+                                      struct device_attribute *attr,char *buf)
+@@ -478,7 +478,7 @@ static int asd_create_dev_attrs(struct asd_ha_struct 
*asd_ha)
+ {
+       int err;
+ 
+-      err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_revision);
++      err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
+       if (err)
+               return err;
+ 
+@@ -500,13 +500,13 @@ err_update_bios:
+ err_biosb:
+       device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
+ err_rev:
+-      device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
++      device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
+       return err;
+ }
+ 
+ static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha)
+ {
+-      device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
++      device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
+       device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
+       device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
+       device_remove_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
+diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
+index fc7addaf24da..4905455bbfc7 100644
+--- a/drivers/scsi/lpfc/lpfc_els.c
++++ b/drivers/scsi/lpfc/lpfc_els.c
+@@ -5396,6 +5396,9 @@ error:
+       stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
+       stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
+ 
++      if (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE)
++              stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS;
++
+       elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
+       phba->fc_stat.elsXmitLSRJT++;
+       rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
+diff --git a/drivers/scsi/smartpqi/smartpqi_init.c 
b/drivers/scsi/smartpqi/smartpqi_init.c
+index b2b969990a5d..06a062455404 100644
+--- a/drivers/scsi/smartpqi/smartpqi_init.c
++++ b/drivers/scsi/smartpqi/smartpqi_init.c
+@@ -473,6 +473,7 @@ struct bmic_host_wellness_driver_version {
+       u8      driver_version_tag[2];
+       __le16  driver_version_length;
+       char    driver_version[32];
++      u8      dont_write_tag[2];
+       u8      end_tag[2];
+ };
+ 
+@@ -502,6 +503,8 @@ static int pqi_write_driver_version_to_host_wellness(
+       strncpy(buffer->driver_version, DRIVER_VERSION,
+               sizeof(buffer->driver_version) - 1);
+       buffer->driver_version[sizeof(buffer->driver_version) - 1] = '\0';
++      buffer->dont_write_tag[0] = 'D';
++      buffer->dont_write_tag[1] = 'W';
+       buffer->end_tag[0] = 'Z';
+       buffer->end_tag[1] = 'Z';
+ 
+@@ -980,6 +983,9 @@ static void pqi_get_volume_status(struct pqi_ctrl_info 
*ctrl_info,
+       if (rc)
+               goto out;
+ 
++      if (vpd->page_code != CISS_VPD_LV_STATUS)
++              goto out;
++
+       page_length = offsetof(struct ciss_vpd_logical_volume_status,
+               volume_status) + vpd->page_length;
+       if (page_length < sizeof(*vpd))
+diff --git a/drivers/soc/bcm/brcmstb/common.c 
b/drivers/soc/bcm/brcmstb/common.c
+index 94e7335553f4..3f6063b639ac 100644
+--- a/drivers/soc/bcm/brcmstb/common.c
++++ b/drivers/soc/bcm/brcmstb/common.c
+@@ -31,13 +31,17 @@ static const struct of_device_id brcmstb_machine_match[] = 
{
+ 
+ bool soc_is_brcmstb(void)
+ {
++      const struct of_device_id *match;
+       struct device_node *root;
+ 
+       root = of_find_node_by_path("/");
+       if (!root)
+               return false;
+ 
+-      return of_match_node(brcmstb_machine_match, root) != NULL;
++      match = of_match_node(brcmstb_machine_match, root);
++      of_node_put(root);
++
++      return match != NULL;
+ }
+ 
+ static const struct of_device_id sun_top_ctrl_match[] = {
+diff --git a/drivers/soc/tegra/common.c b/drivers/soc/tegra/common.c
+index cd8f41351add..7bfb154d6fa5 100644
+--- a/drivers/soc/tegra/common.c
++++ b/drivers/soc/tegra/common.c
+@@ -22,11 +22,15 @@ static const struct of_device_id tegra_machine_match[] = {
+ 
+ bool soc_is_tegra(void)
+ {
++      const struct of_device_id *match;
+       struct device_node *root;
+ 
+       root = of_find_node_by_path("/");
+       if (!root)
+               return false;
+ 
+-      return of_match_node(tegra_machine_match, root) != NULL;
++      match = of_match_node(tegra_machine_match, root);
++      of_node_put(root);
++
++      return match != NULL;
+ }
+diff --git a/drivers/staging/iio/adc/ad7280a.c 
b/drivers/staging/iio/adc/ad7280a.c
+index b460dda7eb65..dec25fadba8c 100644
+--- a/drivers/staging/iio/adc/ad7280a.c
++++ b/drivers/staging/iio/adc/ad7280a.c
+@@ -250,7 +250,9 @@ static int ad7280_read(struct ad7280_state *st, unsigned 
int devaddr,
+       if (ret)
+               return ret;
+ 
+-      __ad7280_read32(st, &tmp);
++      ret = __ad7280_read32(st, &tmp);
++      if (ret)
++              return ret;
+ 
+       if (ad7280_check_crc(st, tmp))
+               return -EIO;
+@@ -288,7 +290,9 @@ static int ad7280_read_channel(struct ad7280_state *st, 
unsigned int devaddr,
+ 
+       ad7280_delay(st);
+ 
+-      __ad7280_read32(st, &tmp);
++      ret = __ad7280_read32(st, &tmp);
++      if (ret)
++              return ret;
+ 
+       if (ad7280_check_crc(st, tmp))
+               return -EIO;
+@@ -321,7 +325,9 @@ static int ad7280_read_all_channels(struct ad7280_state 
*st, unsigned int cnt,
+       ad7280_delay(st);
+ 
+       for (i = 0; i < cnt; i++) {
+-              __ad7280_read32(st, &tmp);
++              ret = __ad7280_read32(st, &tmp);
++              if (ret)
++                      return ret;
+ 
+               if (ad7280_check_crc(st, tmp))
+                       return -EIO;
+@@ -364,7 +370,10 @@ static int ad7280_chain_setup(struct ad7280_state *st)
+               return ret;
+ 
+       for (n = 0; n <= AD7280A_MAX_CHAIN; n++) {
+-              __ad7280_read32(st, &val);
++              ret = __ad7280_read32(st, &val);
++              if (ret)
++                      return ret;
++
+               if (val == 0)
+                       return n - 1;
+ 
+diff --git a/drivers/staging/iio/adc/ad7780.c 
b/drivers/staging/iio/adc/ad7780.c
+index c9a0c2aa602f..5d163386ab6e 100644
+--- a/drivers/staging/iio/adc/ad7780.c
++++ b/drivers/staging/iio/adc/ad7780.c
+@@ -87,12 +87,16 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,
+                          long m)
+ {
+       struct ad7780_state *st = iio_priv(indio_dev);
++      int voltage_uv;
+ 
+       switch (m) {
+       case IIO_CHAN_INFO_RAW:
+               return ad_sigma_delta_single_conversion(indio_dev, chan, val);
+       case IIO_CHAN_INFO_SCALE:
+-              *val = st->int_vref_mv * st->gain;
++              voltage_uv = regulator_get_voltage(st->reg);
++              if (voltage_uv < 0)
++                      return voltage_uv;
++              *val = (voltage_uv / 1000) * st->gain;
+               *val2 = chan->scan_type.realbits - 1;
+               return IIO_VAL_FRACTIONAL_LOG2;
+       case IIO_CHAN_INFO_OFFSET:
+diff --git a/drivers/staging/iio/resolver/ad2s90.c 
b/drivers/staging/iio/resolver/ad2s90.c
+index 5b1c0db33e7f..b44253eb62ec 100644
+--- a/drivers/staging/iio/resolver/ad2s90.c
++++ b/drivers/staging/iio/resolver/ad2s90.c
+@@ -86,7 +86,12 @@ static int ad2s90_probe(struct spi_device *spi)
+       /* need 600ns between CS and the first falling edge of SCLK */
+       spi->max_speed_hz = 830000;
+       spi->mode = SPI_MODE_3;
+-      spi_setup(spi);
++      ret = spi_setup(spi);
++
++      if (ret < 0) {
++              dev_err(&spi->dev, "spi_setup failed!\n");
++              return ret;
++      }
+ 
+       return 0;
+ }
+diff --git a/drivers/thermal/thermal-generic-adc.c 
b/drivers/thermal/thermal-generic-adc.c
+index 73f55d6a1721..ad601e5b4175 100644
+--- a/drivers/thermal/thermal-generic-adc.c
++++ b/drivers/thermal/thermal-generic-adc.c
+@@ -26,7 +26,7 @@ struct gadc_thermal_info {
+ 
+ static int gadc_thermal_adc_to_temp(struct gadc_thermal_info *gti, int val)
+ {
+-      int temp, adc_hi, adc_lo;
++      int temp, temp_hi, temp_lo, adc_hi, adc_lo;
+       int i;
+ 
+       for (i = 0; i < gti->nlookup_table; i++) {
+@@ -36,13 +36,17 @@ static int gadc_thermal_adc_to_temp(struct 
gadc_thermal_info *gti, int val)
+ 
+       if (i == 0) {
+               temp = gti->lookup_table[0];
+-      } else if (i >= (gti->nlookup_table - 1)) {
++      } else if (i >= gti->nlookup_table) {
+               temp = gti->lookup_table[2 * (gti->nlookup_table - 1)];
+       } else {
+               adc_hi = gti->lookup_table[2 * i - 1];
+               adc_lo = gti->lookup_table[2 * i + 1];
+-              temp = gti->lookup_table[2 * i];
+-              temp -= ((val - adc_lo) * 1000) / (adc_hi - adc_lo);
++
++              temp_hi = gti->lookup_table[2 * i - 2];
++              temp_lo = gti->lookup_table[2 * i];
++
++              temp = temp_hi + mult_frac(temp_lo - temp_hi, val - adc_hi,
++                                         adc_lo - adc_hi);
+       }
+ 
+       return temp;
+diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
+index 226b0b4aced6..cd82ae34ddfa 100644
+--- a/drivers/thermal/thermal_core.c
++++ b/drivers/thermal/thermal_core.c
+@@ -597,16 +597,20 @@ static void update_temperature(struct 
thermal_zone_device *tz)
+                       tz->last_temperature, tz->temperature);
+ }
+ 
+-static void thermal_zone_device_reset(struct thermal_zone_device *tz)
++static void thermal_zone_device_init(struct thermal_zone_device *tz)
+ {
+       struct thermal_instance *pos;
+-
+       tz->temperature = THERMAL_TEMP_INVALID;
+-      tz->passive = 0;
+       list_for_each_entry(pos, &tz->thermal_instances, tz_node)
+               pos->initialized = false;
+ }
+ 
++static void thermal_zone_device_reset(struct thermal_zone_device *tz)
++{
++      tz->passive = 0;
++      thermal_zone_device_init(tz);
++}
++
+ void thermal_zone_device_update(struct thermal_zone_device *tz,
+                               enum thermal_notify_event event)
+ {
+@@ -2297,7 +2301,7 @@ static int thermal_pm_notify(struct notifier_block *nb,
+       case PM_POST_SUSPEND:
+               atomic_set(&in_suspend, 0);
+               list_for_each_entry(tz, &thermal_tz_list, node) {
+-                      thermal_zone_device_reset(tz);
++                      thermal_zone_device_init(tz);
+                       thermal_zone_device_update(tz,
+                                                  THERMAL_EVENT_UNSPECIFIED);
+               }
+diff --git a/drivers/thermal/thermal_hwmon.h b/drivers/thermal/thermal_hwmon.h
+index c798fdb2ae43..f97f76691bd0 100644
+--- a/drivers/thermal/thermal_hwmon.h
++++ b/drivers/thermal/thermal_hwmon.h
+@@ -34,13 +34,13 @@
+ int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz);
+ void thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz);
+ #else
+-static int
++static inline int
+ thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
+ {
+       return 0;
+ }
+ 
+-static void
++static inline void
+ thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
+ {
+ }
+diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
+index e2ec04904f54..5c471c3481bd 100644
+--- a/drivers/tty/serial/fsl_lpuart.c
++++ b/drivers/tty/serial/fsl_lpuart.c
+@@ -1344,6 +1344,8 @@ lpuart_set_termios(struct uart_port *port, struct 
ktermios *termios,
+                       else
+                               cr1 &= ~UARTCR1_PT;
+               }
++      } else {
++              cr1 &= ~UARTCR1_PE;
+       }
+ 
+       /* ask the core to calculate the divisor */
+@@ -1487,6 +1489,8 @@ lpuart32_set_termios(struct uart_port *port, struct 
ktermios *termios,
+                       else
+                               ctrl &= ~UARTCTRL_PT;
+               }
++      } else {
++              ctrl &= ~UARTCTRL_PE;
+       }
+ 
+       /* ask the core to calculate the divisor */
+diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
+index 5609305b3676..01ff8ec78023 100644
+--- a/drivers/tty/serial/samsung.c
++++ b/drivers/tty/serial/samsung.c
+@@ -1335,11 +1335,14 @@ static void s3c24xx_serial_set_termios(struct 
uart_port *port,
+       wr_regl(port, S3C2410_ULCON, ulcon);
+       wr_regl(port, S3C2410_UBRDIV, quot);
+ 
++      port->status &= ~UPSTAT_AUTOCTS;
++
+       umcon = rd_regl(port, S3C2410_UMCON);
+       if (termios->c_cflag & CRTSCTS) {
+               umcon |= S3C2410_UMCOM_AFC;
+               /* Disable RTS when RX FIFO contains 63 bytes */
+               umcon &= ~S3C2412_UMCON_AFC_8;
++              port->status = UPSTAT_AUTOCTS;
+       } else {
+               umcon &= ~S3C2410_UMCOM_AFC;
+       }
+diff --git a/drivers/tty/serial/serial_core.c 
b/drivers/tty/serial/serial_core.c
+index 95fc7e893fd2..55ed4c66f77f 100644
+--- a/drivers/tty/serial/serial_core.c
++++ b/drivers/tty/serial/serial_core.c
+@@ -141,6 +141,9 @@ static void uart_start(struct tty_struct *tty)
+       struct uart_port *port;
+       unsigned long flags;
+ 
++      if (!state)
++              return;
++
+       port = uart_port_lock(state, flags);
+       __uart_start(tty);
+       uart_port_unlock(port, flags);
+@@ -717,6 +720,9 @@ static void uart_unthrottle(struct tty_struct *tty)
+       struct uart_port *port;
+       upstat_t mask = 0;
+ 
++      if (!state)
++              return;
++
+       port = uart_port_ref(state);
+       if (!port)
+               return;
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index 67679f619c3b..7b6919086539 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -1108,6 +1108,16 @@ static void hub_activate(struct usb_hub *hub, enum 
hub_activation_type type)
+                                                  USB_PORT_FEAT_ENABLE);
+               }
+ 
++              /*
++               * Add debounce if USB3 link is in polling/link training state.
++               * Link will automatically transition to Enabled state after
++               * link training completes.
++               */
++              if (hub_is_superspeed(hdev) &&
++                  ((portstatus & USB_PORT_STAT_LINK_STATE) ==
++                                              USB_SS_PORT_LS_POLLING))
++                      need_debounce_delay = true;
++
+               /* Clear status-change flags; we'll debounce later */
+               if (portchange & USB_PORT_STAT_C_CONNECTION) {
+                       need_debounce_delay = true;
+diff --git a/drivers/usb/gadget/udc/net2272.c 
b/drivers/usb/gadget/udc/net2272.c
+index 7c6113432093..40396a265a3f 100644
+--- a/drivers/usb/gadget/udc/net2272.c
++++ b/drivers/usb/gadget/udc/net2272.c
+@@ -2096,7 +2096,7 @@ static irqreturn_t net2272_irq(int irq, void *_dev)
+ #if defined(PLX_PCI_RDK2)
+       /* see if PCI int for us by checking irqstat */
+       intcsr = readl(dev->rdk2.fpga_base_addr + RDK2_IRQSTAT);
+-      if (!intcsr & (1 << NET2272_PCI_IRQ)) {
++      if (!(intcsr & (1 << NET2272_PCI_IRQ))) {
+               spin_unlock(&dev->lock);
+               return IRQ_NONE;
+       }
+diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
+index f1219f6d58a9..60540a8ac431 100644
+--- a/drivers/usb/musb/musb_gadget.c
++++ b/drivers/usb/musb/musb_gadget.c
+@@ -477,13 +477,10 @@ void musb_g_tx(struct musb *musb, u8 epnum)
+       }
+ 
+       if (request) {
+-              u8      is_dma = 0;
+-              bool    short_packet = false;
+ 
+               trace_musb_req_tx(req);
+ 
+               if (dma && (csr & MUSB_TXCSR_DMAENAB)) {
+-                      is_dma = 1;
+                       csr |= MUSB_TXCSR_P_WZC_BITS;
+                       csr &= ~(MUSB_TXCSR_DMAENAB | MUSB_TXCSR_P_UNDERRUN |
+                                MUSB_TXCSR_TXPKTRDY | MUSB_TXCSR_AUTOSET);
+@@ -501,16 +498,8 @@ void musb_g_tx(struct musb *musb, u8 epnum)
+                */
+               if ((request->zero && request->length)
+                       && (request->length % musb_ep->packet_sz == 0)
+-                      && (request->actual == request->length))
+-                              short_packet = true;
++                      && (request->actual == request->length)) {
+ 
+-              if ((musb_dma_inventra(musb) || musb_dma_ux500(musb)) &&
+-                      (is_dma && (!dma->desired_mode ||
+-                              (request->actual &
+-                                      (musb_ep->packet_sz - 1)))))
+-                              short_packet = true;
+-
+-              if (short_packet) {
+                       /*
+                        * On DMA completion, FIFO may not be
+                        * available yet...
+diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c
+index 3620073da58c..512108e22d2b 100644
+--- a/drivers/usb/musb/musbhsdma.c
++++ b/drivers/usb/musb/musbhsdma.c
+@@ -320,12 +320,10 @@ static irqreturn_t dma_controller_irq(int irq, void 
*private_data)
+                               channel->status = MUSB_DMA_STATUS_FREE;
+ 
+                               /* completed */
+-                              if ((devctl & MUSB_DEVCTL_HM)
+-                                      && (musb_channel->transmit)
+-                                      && ((channel->desired_mode == 0)
+-                                          || (channel->actual_len &
+-                                          (musb_channel->max_packet_sz - 1)))
+-                                  ) {
++                              if (musb_channel->transmit &&
++                                      (!channel->desired_mode ||
++                                      (channel->actual_len %
++                                          musb_channel->max_packet_sz))) {
+                                       u8  epnum  = musb_channel->epnum;
+                                       int offset = musb->io.ep_offset(epnum,
+                                                                   MUSB_TXCSR);
+@@ -337,11 +335,14 @@ static irqreturn_t dma_controller_irq(int irq, void 
*private_data)
+                                        */
+                                       musb_ep_select(mbase, epnum);
+                                       txcsr = musb_readw(mbase, offset);
+-                                      txcsr &= ~(MUSB_TXCSR_DMAENAB
++                                      if (channel->desired_mode == 1) {
++                                              txcsr &= ~(MUSB_TXCSR_DMAENAB
+                                                       | MUSB_TXCSR_AUTOSET);
+-                                      musb_writew(mbase, offset, txcsr);
+-                                      /* Send out the packet */
+-                                      txcsr &= ~MUSB_TXCSR_DMAMODE;
++                                              musb_writew(mbase, offset, 
txcsr);
++                                              /* Send out the packet */
++                                              txcsr &= ~MUSB_TXCSR_DMAMODE;
++                                              txcsr |= MUSB_TXCSR_DMAENAB;
++                                      }
+                                       txcsr |=  MUSB_TXCSR_TXPKTRDY;
+                                       musb_writew(mbase, offset, txcsr);
+                               }
+diff --git a/drivers/usb/phy/phy-am335x.c b/drivers/usb/phy/phy-am335x.c
+index 7e5aece769da..cb1382a52765 100644
+--- a/drivers/usb/phy/phy-am335x.c
++++ b/drivers/usb/phy/phy-am335x.c
+@@ -60,9 +60,6 @@ static int am335x_phy_probe(struct platform_device *pdev)
+       if (ret)
+               return ret;
+ 
+-      ret = usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
+-      if (ret)
+-              return ret;
+       am_phy->usb_phy_gen.phy.init = am335x_init;
+       am_phy->usb_phy_gen.phy.shutdown = am335x_shutdown;
+ 
+@@ -81,7 +78,7 @@ static int am335x_phy_probe(struct platform_device *pdev)
+       device_set_wakeup_enable(dev, false);
+       phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, am_phy->dr_mode, false);
+ 
+-      return 0;
++      return usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
+ }
+ 
+ static int am335x_phy_remove(struct platform_device *pdev)
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 4db10d7990c9..178b507a6fe0 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -3030,7 +3030,7 @@ static int fbcon_fb_unbind(int idx)
+       for (i = first_fb_vc; i <= last_fb_vc; i++) {
+               if (con2fb_map[i] != idx &&
+                   con2fb_map[i] != -1) {
+-                      new_idx = i;
++                      new_idx = con2fb_map[i];
+                       break;
+               }
+       }
+diff --git a/drivers/video/fbdev/clps711x-fb.c 
b/drivers/video/fbdev/clps711x-fb.c
+index ff561073ee4e..42f909618f04 100644
+--- a/drivers/video/fbdev/clps711x-fb.c
++++ b/drivers/video/fbdev/clps711x-fb.c
+@@ -287,14 +287,17 @@ static int clps711x_fb_probe(struct platform_device 
*pdev)
+       }
+ 
+       ret = of_get_fb_videomode(disp, &cfb->mode, OF_USE_NATIVE_MODE);
+-      if (ret)
++      if (ret) {
++              of_node_put(disp);
+               goto out_fb_release;
++      }
+ 
+       of_property_read_u32(disp, "ac-prescale", &cfb->ac_prescale);
+       cfb->cmap_invert = of_property_read_bool(disp, "cmap-invert");
+ 
+       ret = of_property_read_u32(disp, "bits-per-pixel",
+                                  &info->var.bits_per_pixel);
++      of_node_put(disp);
+       if (ret)
+               goto out_fb_release;
+ 
+diff --git a/drivers/video/fbdev/core/fbmem.c 
b/drivers/video/fbdev/core/fbmem.c
+index 74273bc7ca9a..a1d93151c059 100644
+--- a/drivers/video/fbdev/core/fbmem.c
++++ b/drivers/video/fbdev/core/fbmem.c
+@@ -433,7 +433,9 @@ static void fb_do_show_logo(struct fb_info *info, struct 
fb_image *image,
+                       image->dx += image->width + 8;
+               }
+       } else if (rotate == FB_ROTATE_UD) {
+-              for (x = 0; x < num; x++) {
++              u32 dx = image->dx;
++
++              for (x = 0; x < num && image->dx <= dx; x++) {
+                       info->fbops->fb_imageblit(info, image);
+                       image->dx -= image->width + 8;
+               }
+@@ -445,7 +447,9 @@ static void fb_do_show_logo(struct fb_info *info, struct 
fb_image *image,
+                       image->dy += image->height + 8;
+               }
+       } else if (rotate == FB_ROTATE_CCW) {
+-              for (x = 0; x < num; x++) {
++              u32 dy = image->dy;
++
++              for (x = 0; x < num && image->dy <= dy; x++) {
+                       info->fbops->fb_imageblit(info, image);
+                       image->dy -= image->height + 8;
+               }
+diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
+index afdf4e3cafc2..634bdbb23851 100644
+--- a/fs/binfmt_script.c
++++ b/fs/binfmt_script.c
+@@ -43,10 +43,14 @@ static int load_script(struct linux_binprm *bprm)
+       fput(bprm->file);
+       bprm->file = NULL;
+ 
+-      bprm->buf[BINPRM_BUF_SIZE - 1] = '\0';
+-      if ((cp = strchr(bprm->buf, '\n')) == NULL)
+-              cp = bprm->buf+BINPRM_BUF_SIZE-1;
++      for (cp = bprm->buf+2;; cp++) {
++              if (cp >= bprm->buf + BINPRM_BUF_SIZE)
++                      return -ENOEXEC;
++              if (!*cp || (*cp == '\n'))
++                      break;
++      }
+       *cp = '\0';
++
+       while (cp > bprm->buf) {
+               cp--;
+               if ((*cp == ' ') || (*cp == '\t'))
+diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
+index ef24b4527459..68183872bf8b 100644
+--- a/fs/cifs/readdir.c
++++ b/fs/cifs/readdir.c
+@@ -655,7 +655,14 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon 
*tcon, loff_t pos,
+               /* scan and find it */
+               int i;
+               char *cur_ent;
+-              char *end_of_smb = cfile->srch_inf.ntwrk_buf_start +
++              char *end_of_smb;
++
++              if (cfile->srch_inf.ntwrk_buf_start == NULL) {
++                      cifs_dbg(VFS, "ntwrk_buf_start is NULL during 
readdir\n");
++                      return -EIO;
++              }
++
++              end_of_smb = cfile->srch_inf.ntwrk_buf_start +
+                       server->ops->calc_smb_size(
+                                       cfile->srch_inf.ntwrk_buf_start);
+ 
+diff --git a/fs/dlm/ast.c b/fs/dlm/ast.c
+index dcea1e37a1b7..f18619bc2e09 100644
+--- a/fs/dlm/ast.c
++++ b/fs/dlm/ast.c
+@@ -290,6 +290,8 @@ void dlm_callback_suspend(struct dlm_ls *ls)
+               flush_workqueue(ls->ls_callback_wq);
+ }
+ 
++#define MAX_CB_QUEUE 25
++
+ void dlm_callback_resume(struct dlm_ls *ls)
+ {
+       struct dlm_lkb *lkb, *safe;
+@@ -300,15 +302,23 @@ void dlm_callback_resume(struct dlm_ls *ls)
+       if (!ls->ls_callback_wq)
+               return;
+ 
++more:
+       mutex_lock(&ls->ls_cb_mutex);
+       list_for_each_entry_safe(lkb, safe, &ls->ls_cb_delay, lkb_cb_list) {
+               list_del_init(&lkb->lkb_cb_list);
+               queue_work(ls->ls_callback_wq, &lkb->lkb_cb_work);
+               count++;
++              if (count == MAX_CB_QUEUE)
++                      break;
+       }
+       mutex_unlock(&ls->ls_cb_mutex);
+ 
+       if (count)
+               log_rinfo(ls, "dlm_callback_resume %d", count);
++      if (count == MAX_CB_QUEUE) {
++              count = 0;
++              cond_resched();
++              goto more;
++      }
+ }
+ 
+diff --git a/fs/eventpoll.c b/fs/eventpoll.c
+index 3cbc30413add..a9c0bf8782f5 100644
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -1040,7 +1040,7 @@ static int ep_poll_callback(wait_queue_t *wait, unsigned 
mode, int sync, void *k
+        * semantics). All the events that happen during that period of time are
+        * chained in ep->ovflist and requeued later on.
+        */
+-      if (unlikely(ep->ovflist != EP_UNACTIVE_PTR)) {
++      if (ep->ovflist != EP_UNACTIVE_PTR) {
+               if (epi->next == EP_UNACTIVE_PTR) {
+                       epi->next = ep->ovflist;
+                       ep->ovflist = epi;
+diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
+index 55aa29c0c78d..a9894089d9dc 100644
+--- a/fs/f2fs/acl.c
++++ b/fs/f2fs/acl.c
+@@ -348,12 +348,14 @@ static int f2fs_acl_create(struct inode *dir, umode_t 
*mode,
+               return PTR_ERR(p);
+ 
+       clone = f2fs_acl_clone(p, GFP_NOFS);
+-      if (!clone)
+-              goto no_mem;
++      if (!clone) {
++              ret = -ENOMEM;
++              goto release_acl;
++      }
+ 
+       ret = f2fs_acl_create_masq(clone, mode);
+       if (ret < 0)
+-              goto no_mem_clone;
++              goto release_clone;
+ 
+       if (ret == 0)
+               posix_acl_release(clone);
+@@ -367,11 +369,11 @@ static int f2fs_acl_create(struct inode *dir, umode_t 
*mode,
+ 
+       return 0;
+ 
+-no_mem_clone:
++release_clone:
+       posix_acl_release(clone);
+-no_mem:
++release_acl:
+       posix_acl_release(p);
+-      return -ENOMEM;
++      return ret;
+ }
+ 
+ int f2fs_init_acl(struct inode *inode, struct inode *dir, struct page *ipage,
+diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
+index 9c380885b0fc..b16ab4187234 100644
+--- a/fs/f2fs/f2fs.h
++++ b/fs/f2fs/f2fs.h
+@@ -1885,10 +1885,19 @@ static inline bool is_dot_dotdot(const struct qstr 
*str)
+ 
+ static inline bool f2fs_may_extent_tree(struct inode *inode)
+ {
+-      if (!test_opt(F2FS_I_SB(inode), EXTENT_CACHE) ||
++      struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
++
++      if (!test_opt(sbi, EXTENT_CACHE) ||
+                       is_inode_flag_set(inode, FI_NO_EXTENT))
+               return false;
+ 
++      /*
++       * for recovered files during mount do not create extents
++       * if shrinker is not registered.
++       */
++      if (list_empty(&sbi->s_list))
++              return false;
++
+       return S_ISREG(inode->i_mode);
+ }
+ 
+diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
+index b768f495603e..f46ac1651bd5 100644
+--- a/fs/f2fs/file.c
++++ b/fs/f2fs/file.c
+@@ -198,6 +198,9 @@ static int f2fs_do_sync_file(struct file *file, loff_t 
start, loff_t end,
+ 
+       trace_f2fs_sync_file_enter(inode);
+ 
++      if (S_ISDIR(inode->i_mode))
++              goto go_write;
++
+       /* if fdatasync is triggered, let's do in-place-update */
+       if (datasync || get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks)
+               set_inode_flag(inode, FI_NEED_IPU);
+diff --git a/fs/f2fs/shrinker.c b/fs/f2fs/shrinker.c
+index 46c915425923..a40bfa7fafec 100644
+--- a/fs/f2fs/shrinker.c
++++ b/fs/f2fs/shrinker.c
+@@ -136,6 +136,6 @@ void f2fs_leave_shrinker(struct f2fs_sb_info *sbi)
+       f2fs_shrink_extent_tree(sbi, __count_extent_cache(sbi));
+ 
+       spin_lock(&f2fs_list_lock);
+-      list_del(&sbi->s_list);
++      list_del_init(&sbi->s_list);
+       spin_unlock(&f2fs_list_lock);
+ }
+diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
+index b4253181b5d4..411f16101d1a 100644
+--- a/fs/fuse/dev.c
++++ b/fs/fuse/dev.c
+@@ -1685,7 +1685,6 @@ static int fuse_retrieve(struct fuse_conn *fc, struct 
inode *inode,
+       req->in.h.nodeid = outarg->nodeid;
+       req->in.numargs = 2;
+       req->in.argpages = 1;
+-      req->page_descs[0].offset = offset;
+       req->end = fuse_retrieve_end;
+ 
+       index = outarg->offset >> PAGE_SHIFT;
+@@ -1700,6 +1699,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct 
inode *inode,
+ 
+               this_num = min_t(unsigned, num, PAGE_SIZE - offset);
+               req->pages[req->num_pages] = page;
++              req->page_descs[req->num_pages].offset = offset;
+               req->page_descs[req->num_pages].length = this_num;
+               req->num_pages++;
+ 
+@@ -2018,8 +2018,10 @@ static ssize_t fuse_dev_splice_write(struct 
pipe_inode_info *pipe,
+ 
+       ret = fuse_dev_do_write(fud, &cs, len);
+ 
++      pipe_lock(pipe);
+       for (idx = 0; idx < nbuf; idx++)
+               pipe_buf_release(pipe, &bufs[idx]);
++      pipe_unlock(pipe);
+ 
+ out:
+       kfree(bufs);
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index 1cd46e667e3d..30a607473621 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -1772,7 +1772,7 @@ static bool fuse_writepage_in_flight(struct fuse_req 
*new_req,
+               spin_unlock(&fc->lock);
+ 
+               dec_wb_stat(&bdi->wb, WB_WRITEBACK);
+-              dec_node_page_state(page, NR_WRITEBACK_TEMP);
++              dec_node_page_state(new_req->pages[0], NR_WRITEBACK_TEMP);
+               wb_writeout_inc(&bdi->wb);
+               fuse_writepage_free(fc, new_req);
+               fuse_request_free(new_req);
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index 2fdb8f5a7b69..35aef192a13f 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -2403,8 +2403,7 @@ static int nfs_compare_mount_options(const struct 
super_block *s, const struct n
+               goto Ebusy;
+       if (a->acdirmax != b->acdirmax)
+               goto Ebusy;
+-      if (b->auth_info.flavor_len > 0 &&
+-         clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor)
++      if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor)
+               goto Ebusy;
+       return 1;
+ Ebusy:
+diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
+index 36b2af931e06..797a155c9a67 100644
+--- a/fs/nfsd/nfsctl.c
++++ b/fs/nfsd/nfsctl.c
+@@ -1103,6 +1103,8 @@ static ssize_t write_v4_end_grace(struct file *file, 
char *buf, size_t size)
+               case 'Y':
+               case 'y':
+               case '1':
++                      if (nn->nfsd_serv)
++                              return -EBUSY;
+                       nfsd4_end_grace(nn);
+                       break;
+               default:
+diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c
+index 25c8b328c43d..935bac253991 100644
+--- a/fs/ocfs2/buffer_head_io.c
++++ b/fs/ocfs2/buffer_head_io.c
+@@ -151,7 +151,6 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 
block,
+ #endif
+               }
+ 
+-              clear_buffer_uptodate(bh);
+               get_bh(bh); /* for end_buffer_read_sync() */
+               bh->b_end_io = end_buffer_read_sync;
+               submit_bh(REQ_OP_READ, 0, bh);
+@@ -305,7 +304,6 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 
block, int nr,
+                               continue;
+                       }
+ 
+-                      clear_buffer_uptodate(bh);
+                       get_bh(bh); /* for end_buffer_read_sync() */
+                       if (validate)
+                               set_buffer_needs_validate(bh);
+diff --git a/fs/udf/inode.c b/fs/udf/inode.c
+index 035943501b9f..fd817022cb9b 100644
+--- a/fs/udf/inode.c
++++ b/fs/udf/inode.c
+@@ -1372,6 +1372,12 @@ reread:
+ 
+       iinfo->i_alloc_type = le16_to_cpu(fe->icbTag.flags) &
+                                                       ICBTAG_FLAG_AD_MASK;
++      if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_SHORT &&
++          iinfo->i_alloc_type != ICBTAG_FLAG_AD_LONG &&
++          iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
++              ret = -EIO;
++              goto out;
++      }
+       iinfo->i_unique = 0;
+       iinfo->i_lenEAttr = 0;
+       iinfo->i_lenExtents = 0;
+diff --git a/include/linux/genl_magic_struct.h 
b/include/linux/genl_magic_struct.h
+index 6270a56e5edc..d0d6fdc22698 100644
+--- a/include/linux/genl_magic_struct.h
++++ b/include/linux/genl_magic_struct.h
+@@ -190,6 +190,7 @@ static inline void ct_assert_unique_operations(void)
+ {
+       switch (0) {
+ #include GENL_MAGIC_INCLUDE_FILE
++      case 0:
+               ;
+       }
+ }
+@@ -208,6 +209,7 @@ static inline void 
ct_assert_unique_top_level_attributes(void)
+ {
+       switch (0) {
+ #include GENL_MAGIC_INCLUDE_FILE
++      case 0:
+               ;
+       }
+ }
+@@ -217,7 +219,8 @@ static inline void 
ct_assert_unique_top_level_attributes(void)
+ static inline void ct_assert_unique_ ## s_name ## _attributes(void)   \
+ {                                                                     \
+       switch (0) {                                                    \
+-              s_fields                                                \
++      s_fields                                                        \
++      case 0:                                                         \
+                       ;                                               \
+       }                                                               \
+ }
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index f4a551a5482c..ebd0afb35d16 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -527,6 +527,7 @@ static inline int get_dumpable(struct mm_struct *mm)
+ #define MMF_OOM_SKIP          21      /* mm is of no interest for the OOM 
killer */
+ #define MMF_UNSTABLE          22      /* mm is unstable for copy_from_user */
+ #define MMF_HUGE_ZERO_PAGE    23      /* mm has ever used the global huge 
zero page */
++#define MMF_OOM_REAP_QUEUED   26      /* mm was queued for oom_reaper */
+ 
+ #define MMF_INIT_MASK         (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK)
+ 
+diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
+index cee8c00f3d3e..96bc5acdade3 100644
+--- a/include/sound/compress_driver.h
++++ b/include/sound/compress_driver.h
+@@ -185,7 +185,11 @@ static inline void snd_compr_drain_notify(struct 
snd_compr_stream *stream)
+       if (snd_BUG_ON(!stream))
+               return;
+ 
+-      stream->runtime->state = SNDRV_PCM_STATE_SETUP;
++      if (stream->direction == SND_COMPRESS_PLAYBACK)
++              stream->runtime->state = SNDRV_PCM_STATE_SETUP;
++      else
++              stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
++
+       wake_up(&stream->runtime->sleep);
+ }
+ 
+diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
+index 017f7933a37d..f4b5811ebe23 100644
+--- a/kernel/events/ring_buffer.c
++++ b/kernel/events/ring_buffer.c
+@@ -700,6 +700,9 @@ struct ring_buffer *rb_alloc(int nr_pages, long watermark, 
int cpu, int flags)
+       size = sizeof(struct ring_buffer);
+       size += nr_pages * sizeof(void *);
+ 
++      if (order_base_2(size) >= MAX_ORDER)
++              goto fail;
++
+       rb = kzalloc(size, GFP_KERNEL);
+       if (!rb)
+               goto fail;
+diff --git a/kernel/hung_task.c b/kernel/hung_task.c
+index 2b59c82cc3e1..fd781a468f32 100644
+--- a/kernel/hung_task.c
++++ b/kernel/hung_task.c
+@@ -30,7 +30,7 @@ int __read_mostly sysctl_hung_task_check_count = 
PID_MAX_LIMIT;
+  * is disabled during the critical section. It also controls the size of
+  * the RCU grace period. So it needs to be upper-bound.
+  */
+-#define HUNG_TASK_BATCHING 1024
++#define HUNG_TASK_LOCK_BREAK (HZ / 10)
+ 
+ /*
+  * Zero means infinite timeout - no checking done:
+@@ -158,7 +158,7 @@ static bool rcu_lock_break(struct task_struct *g, struct 
task_struct *t)
+ static void check_hung_uninterruptible_tasks(unsigned long timeout)
+ {
+       int max_count = sysctl_hung_task_check_count;
+-      int batch_count = HUNG_TASK_BATCHING;
++      unsigned long last_break = jiffies;
+       struct task_struct *g, *t;
+ 
+       /*
+@@ -172,10 +172,10 @@ static void check_hung_uninterruptible_tasks(unsigned 
long timeout)
+       for_each_process_thread(g, t) {
+               if (!max_count--)
+                       goto unlock;
+-              if (!--batch_count) {
+-                      batch_count = HUNG_TASK_BATCHING;
++              if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) {
+                       if (!rcu_lock_break(g, t))
+                               goto unlock;
++                      last_break = jiffies;
+               }
+               /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */
+               if (t->state == TASK_UNINTERRUPTIBLE)
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 23f658d311c0..93c7b02279b9 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -2503,6 +2503,8 @@ static int __do_proc_doulongvec_minmax(void *data, 
struct ctl_table *table, int
+                       bool neg;
+ 
+                       left -= proc_skip_spaces(&p);
++                      if (!left)
++                              break;
+ 
+                       err = proc_get_long(&p, &left, &val, &neg,
+                                            proc_wspace_sep,
+diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
+index d831827d7ab0..e24e1f0c5690 100644
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -39,7 +39,9 @@
+ static struct {
+       seqcount_t              seq;
+       struct timekeeper       timekeeper;
+-} tk_core ____cacheline_aligned;
++} tk_core ____cacheline_aligned = {
++      .seq = SEQCNT_ZERO(tk_core.seq),
++};
+ 
+ static DEFINE_RAW_SPINLOCK(timekeeper_lock);
+ static struct timekeeper shadow_timekeeper;
+diff --git a/lib/seq_buf.c b/lib/seq_buf.c
+index cb18469e1f49..5954f9fb6675 100644
+--- a/lib/seq_buf.c
++++ b/lib/seq_buf.c
+@@ -143,9 +143,13 @@ int seq_buf_puts(struct seq_buf *s, const char *str)
+ 
+       WARN_ON(s->size == 0);
+ 
++      /* Add 1 to len for the trailing null byte which must be there */
++      len += 1;
++
+       if (seq_buf_can_fit(s, len)) {
+               memcpy(s->buffer + s->len, str, len);
+-              s->len += len;
++              /* Don't count the trailing null byte against the capacity */
++              s->len += len - 1;
+               return 0;
+       }
+       seq_buf_set_overflow(s);
+diff --git a/mm/oom_kill.c b/mm/oom_kill.c
+index 1de3695cb419..d514eebad905 100644
+--- a/mm/oom_kill.c
++++ b/mm/oom_kill.c
+@@ -626,8 +626,8 @@ static void wake_oom_reaper(struct task_struct *tsk)
+       if (!oom_reaper_th)
+               return;
+ 
+-      /* tsk is already queued? */
+-      if (tsk == oom_reaper_list || tsk->oom_reaper_list)
++      /* mm is already queued? */
++      if (test_and_set_bit(MMF_OOM_REAP_QUEUED, &tsk->signal->oom_mm->flags))
+               return;
+ 
+       get_task_struct(tsk);
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
+index d2f9eb169ba8..6f78489fdb13 100644
+--- a/net/bluetooth/hci_event.c
++++ b/net/bluetooth/hci_event.c
+@@ -5212,6 +5212,12 @@ static bool hci_get_cmd_complete(struct hci_dev *hdev, 
u16 opcode,
+               return true;
+       }
+ 
++      /* Check if request ended in Command Status - no way to retreive
++       * any extra parameters in this case.
++       */
++      if (hdr->evt == HCI_EV_CMD_STATUS)
++              return false;
++
+       if (hdr->evt != HCI_EV_CMD_COMPLETE) {
+               BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
+               return false;
+diff --git a/net/dccp/ccid.h b/net/dccp/ccid.h
+index 6eb837a47b5c..baaaeb2b2c42 100644
+--- a/net/dccp/ccid.h
++++ b/net/dccp/ccid.h
+@@ -202,7 +202,7 @@ static inline void ccid_hc_tx_packet_recv(struct ccid 
*ccid, struct sock *sk,
+ static inline int ccid_hc_tx_parse_options(struct ccid *ccid, struct sock *sk,
+                                          u8 pkt, u8 opt, u8 *val, u8 len)
+ {
+-      if (ccid->ccid_ops->ccid_hc_tx_parse_options == NULL)
++      if (!ccid || !ccid->ccid_ops->ccid_hc_tx_parse_options)
+               return 0;
+       return ccid->ccid_ops->ccid_hc_tx_parse_options(sk, pkt, opt, val, len);
+ }
+@@ -214,7 +214,7 @@ static inline int ccid_hc_tx_parse_options(struct ccid 
*ccid, struct sock *sk,
+ static inline int ccid_hc_rx_parse_options(struct ccid *ccid, struct sock *sk,
+                                          u8 pkt, u8 opt, u8 *val, u8 len)
+ {
+-      if (ccid->ccid_ops->ccid_hc_rx_parse_options == NULL)
++      if (!ccid || !ccid->ccid_ops->ccid_hc_rx_parse_options)
+               return 0;
+       return ccid->ccid_ops->ccid_hc_rx_parse_options(sk, pkt, opt, val, len);
+ }
+diff --git a/net/dsa/slave.c b/net/dsa/slave.c
+index 339d9c678d3e..d7883e55fe15 100644
+--- a/net/dsa/slave.c
++++ b/net/dsa/slave.c
+@@ -180,10 +180,14 @@ static void dsa_slave_change_rx_flags(struct net_device 
*dev, int change)
+       struct dsa_slave_priv *p = netdev_priv(dev);
+       struct net_device *master = p->parent->dst->master_netdev;
+ 
+-      if (change & IFF_ALLMULTI)
+-              dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
+-      if (change & IFF_PROMISC)
+-              dev_set_promiscuity(master, dev->flags & IFF_PROMISC ? 1 : -1);
++      if (dev->flags & IFF_UP) {
++              if (change & IFF_ALLMULTI)
++                      dev_set_allmulti(master,
++                                       dev->flags & IFF_ALLMULTI ? 1 : -1);
++              if (change & IFF_PROMISC)
++                      dev_set_promiscuity(master,
++                                          dev->flags & IFF_PROMISC ? 1 : -1);
++      }
+ }
+ 
+ static void dsa_slave_set_rx_mode(struct net_device *dev)
+diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c
+index e1c0bbe7996c..3a2701d42f47 100644
+--- a/net/ipv6/xfrm6_tunnel.c
++++ b/net/ipv6/xfrm6_tunnel.c
+@@ -144,6 +144,9 @@ static u32 __xfrm6_tunnel_alloc_spi(struct net *net, 
xfrm_address_t *saddr)
+               index = __xfrm6_tunnel_spi_check(net, spi);
+               if (index >= 0)
+                       goto alloc_spi;
++
++              if (spi == XFRM6_TUNNEL_SPI_MAX)
++                      break;
+       }
+       for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tn->spi; spi++) {
+               index = __xfrm6_tunnel_spi_check(net, spi);
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
+index 93c332737e86..af02d2136a06 100644
+--- a/net/mac80211/rx.c
++++ b/net/mac80211/rx.c
+@@ -152,6 +152,9 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
+       /* allocate extra bitmaps */
+       if (status->chains)
+               len += 4 * hweight8(status->chains);
++      /* vendor presence bitmap */
++      if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA)
++              len += 4;
+ 
+       if (ieee80211_have_rx_timestamp(status)) {
+               len = ALIGN(len, 8);
+@@ -193,8 +196,6 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
+       if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) {
+               struct ieee80211_vendor_radiotap *rtap = (void *)skb->data;
+ 
+-              /* vendor presence bitmap */
+-              len += 4;
+               /* alignment for fixed 6-byte vendor data header */
+               len = ALIGN(len, 2);
+               /* vendor data header */
+diff --git a/net/rds/bind.c b/net/rds/bind.c
+index cc7e3a138598..438452fb5fbc 100644
+--- a/net/rds/bind.c
++++ b/net/rds/bind.c
+@@ -62,10 +62,10 @@ struct rds_sock *rds_find_bound(__be32 addr, __be16 port)
+ 
+       rcu_read_lock();
+       rs = rhashtable_lookup(&bind_hash_table, &key, ht_parms);
+-      if (rs && !sock_flag(rds_rs_to_sk(rs), SOCK_DEAD))
+-              rds_sock_addref(rs);
+-      else
++      if (rs && (sock_flag(rds_rs_to_sk(rs), SOCK_DEAD) ||
++                 !atomic_inc_not_zero(&rds_rs_to_sk(rs)->sk_refcnt)))
+               rs = NULL;
++
+       rcu_read_unlock();
+ 
+       rdsdebug("returning rs %p for %pI4:%u\n", rs, &addr,
+diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
+index 3e52b7fdc35d..72de69175476 100644
+--- a/net/rxrpc/recvmsg.c
++++ b/net/rxrpc/recvmsg.c
+@@ -552,6 +552,7 @@ error:
+       rxrpc_put_call(call, rxrpc_call_put);
+ error_no_call:
+       release_sock(&rx->sk);
++error_trace:
+       trace_rxrpc_recvmsg(call, rxrpc_recvmsg_return, 0, 0, 0, ret);
+       return ret;
+ 
+@@ -560,7 +561,7 @@ wait_interrupted:
+ wait_error:
+       finish_wait(sk_sleep(&rx->sk), &wait);
+       call = NULL;
+-      goto error_no_call;
++      goto error_trace;
+ }
+ 
+ /**
+diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
+index c332684e1b5a..edde8250195c 100755
+--- a/scripts/decode_stacktrace.sh
++++ b/scripts/decode_stacktrace.sh
+@@ -77,7 +77,7 @@ parse_symbol() {
+       fi
+ 
+       # Strip out the base of the path
+-      code=${code//$basepath/""}
++      code=${code//^$basepath/""}
+ 
+       # In the case of inlines, move everything to same line
+       code=${code//$'\n'/' '}
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index 88b3dc19bbae..fdf5bbfd00cd 100644
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -1198,6 +1198,30 @@ static int secref_whitelist(const struct sectioncheck 
*mismatch,
+       return 1;
+ }
+ 
++static inline int is_arm_mapping_symbol(const char *str)
++{
++      return str[0] == '$' && strchr("axtd", str[1])
++             && (str[2] == '\0' || str[2] == '.');
++}
++
++/*
++ * If there's no name there, ignore it; likewise, ignore it if it's
++ * one of the magic symbols emitted used by current ARM tools.
++ *
++ * Otherwise if find_symbols_between() returns those symbols, they'll
++ * fail the whitelist tests and cause lots of false alarms ... fixable
++ * only by merging __exit and __init sections into __text, bloating
++ * the kernel (which is especially evil on embedded platforms).
++ */
++static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
++{
++      const char *name = elf->strtab + sym->st_name;
++
++      if (!name || !strlen(name))
++              return 0;
++      return !is_arm_mapping_symbol(name);
++}
++
+ /**
+  * Find symbol based on relocation record info.
+  * In some cases the symbol supplied is a valid symbol so
+@@ -1223,6 +1247,8 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, 
Elf64_Sword addr,
+                       continue;
+               if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
+                       continue;
++              if (!is_valid_name(elf, sym))
++                      continue;
+               if (sym->st_value == addr)
+                       return sym;
+               /* Find a symbol nearby - addr are maybe negative */
+@@ -1241,30 +1267,6 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, 
Elf64_Sword addr,
+               return NULL;
+ }
+ 
+-static inline int is_arm_mapping_symbol(const char *str)
+-{
+-      return str[0] == '$' && strchr("axtd", str[1])
+-             && (str[2] == '\0' || str[2] == '.');
+-}
+-
+-/*
+- * If there's no name there, ignore it; likewise, ignore it if it's
+- * one of the magic symbols emitted used by current ARM tools.
+- *
+- * Otherwise if find_symbols_between() returns those symbols, they'll
+- * fail the whitelist tests and cause lots of false alarms ... fixable
+- * only by merging __exit and __init sections into __text, bloating
+- * the kernel (which is especially evil on embedded platforms).
+- */
+-static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
+-{
+-      const char *name = elf->strtab + sym->st_name;
+-
+-      if (!name || !strlen(name))
+-              return 0;
+-      return !is_arm_mapping_symbol(name);
+-}
+-
+ /*
+  * Find symbols before or equal addr and after addr - in the section sec.
+  * If we find two symbols with equal offset prefer one with a valid name.
+diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
+index fb7c534fb57d..aeb3ba70f907 100644
+--- a/security/smack/smack_lsm.c
++++ b/security/smack/smack_lsm.c
+@@ -4362,6 +4362,12 @@ static int smack_key_permission(key_ref_t key_ref,
+       int request = 0;
+       int rc;
+ 
++      /*
++       * Validate requested permissions
++       */
++      if (perm & ~KEY_NEED_ALL)
++              return -EINVAL;
++
+       keyp = key_ref_to_ptr(key_ref);
+       if (keyp == NULL)
+               return -EINVAL;
+@@ -4381,10 +4387,10 @@ static int smack_key_permission(key_ref_t key_ref,
+       ad.a.u.key_struct.key = keyp->serial;
+       ad.a.u.key_struct.key_desc = keyp->description;
+ #endif
+-      if (perm & KEY_NEED_READ)
+-              request = MAY_READ;
++      if (perm & (KEY_NEED_READ | KEY_NEED_SEARCH | KEY_NEED_VIEW))
++              request |= MAY_READ;
+       if (perm & (KEY_NEED_WRITE | KEY_NEED_LINK | KEY_NEED_SETATTR))
+-              request = MAY_WRITE;
++              request |= MAY_WRITE;
+       rc = smk_access(tkp, keyp->security, request, &ad);
+       rc = smk_bu_note("key access", tkp, keyp->security, request, rc);
+       return rc;
+diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c
+index 6efadbfb3fe3..7ea201c05e5d 100644
+--- a/sound/pci/hda/hda_bind.c
++++ b/sound/pci/hda/hda_bind.c
+@@ -109,7 +109,8 @@ static int hda_codec_driver_probe(struct device *dev)
+       err = snd_hda_codec_build_controls(codec);
+       if (err < 0)
+               goto error_module;
+-      if (codec->card->registered) {
++      /* only register after the bus probe finished; otherwise it's racy */
++      if (!codec->bus->bus_probing && codec->card->registered) {
+               err = snd_card_register(codec->card);
+               if (err < 0)
+                       goto error_module;
+diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
+index 776dffa88aee..171e11be938d 100644
+--- a/sound/pci/hda/hda_codec.h
++++ b/sound/pci/hda/hda_codec.h
+@@ -68,6 +68,7 @@ struct hda_bus {
+       unsigned int response_reset:1;  /* controller was reset */
+       unsigned int in_reset:1;        /* during reset operation */
+       unsigned int no_response_fallback:1; /* don't fallback at RIRB error */
++      unsigned int bus_probing :1;    /* during probing process */
+ 
+       int primary_dig_out_type;       /* primary digital out PCM type */
+       unsigned int mixer_assigned;    /* codec addr for mixer name */
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index fcd583efe011..789eca17fc60 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2089,6 +2089,7 @@ static int azx_probe_continue(struct azx *chip)
+       int val;
+       int err;
+ 
++      to_hda_bus(bus)->bus_probing = 1;
+       hda->probe_continued = 1;
+ 
+       /* Request display power well for the HDA controller or codec. For
+@@ -2189,6 +2190,7 @@ i915_power_fail:
+       if (err < 0)
+               hda->init_failed = 1;
+       complete_all(&hda->probe_wait);
++      to_hda_bus(bus)->bus_probing = 0;
+       return err;
+ }
+ 
+diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
+index 19bdcac71775..a732b3a065c9 100644
+--- a/sound/soc/fsl/Kconfig
++++ b/sound/soc/fsl/Kconfig
+@@ -220,7 +220,7 @@ config SND_SOC_PHYCORE_AC97
+ 
+ config SND_SOC_EUKREA_TLV320
+       tristate "Eukrea TLV320"
+-      depends on ARCH_MXC && I2C
++      depends on ARCH_MXC && !ARM64 && I2C
+       select SND_SOC_TLV320AIC23_I2C
+       select SND_SOC_IMX_AUDMUX
+       select SND_SOC_IMX_SSI
+diff --git a/sound/soc/intel/atom/sst/sst_loader.c 
b/sound/soc/intel/atom/sst/sst_loader.c
+index 33917146d9c4..054b1d514e8a 100644
+--- a/sound/soc/intel/atom/sst/sst_loader.c
++++ b/sound/soc/intel/atom/sst/sst_loader.c
+@@ -354,14 +354,14 @@ static int sst_request_fw(struct intel_sst_drv *sst)
+       const struct firmware *fw;
+ 
+       retval = request_firmware(&fw, sst->firmware_name, sst->dev);
+-      if (fw == NULL) {
+-              dev_err(sst->dev, "fw is returning as null\n");
+-              return -EINVAL;
+-      }
+       if (retval) {
+               dev_err(sst->dev, "request fw failed %d\n", retval);
+               return retval;
+       }
++      if (fw == NULL) {
++              dev_err(sst->dev, "fw is returning as null\n");
++              return -EINVAL;
++      }
+       mutex_lock(&sst->sst_lock);
+       retval = sst_cache_and_parse_fw(sst, fw);
+       mutex_unlock(&sst->sst_lock);
+diff --git a/tools/perf/arch/x86/util/kvm-stat.c 
b/tools/perf/arch/x86/util/kvm-stat.c
+index b63d4be655a2..2020e12a856f 100644
+--- a/tools/perf/arch/x86/util/kvm-stat.c
++++ b/tools/perf/arch/x86/util/kvm-stat.c
+@@ -154,7 +154,7 @@ int cpu_isa_init(struct perf_kvm_stat *kvm, const char 
*cpuid)
+       if (strstr(cpuid, "Intel")) {
+               kvm->exit_reasons = vmx_exit_reasons;
+               kvm->exit_reasons_isa = "VMX";
+-      } else if (strstr(cpuid, "AMD")) {
++      } else if (strstr(cpuid, "AMD") || strstr(cpuid, "Hygon")) {
+               kvm->exit_reasons = svm_exit_reasons;
+               kvm->exit_reasons_isa = "SVM";
+       } else
+diff --git a/tools/perf/tests/evsel-tp-sched.c 
b/tools/perf/tests/evsel-tp-sched.c
+index 1984b3bbfe15..66b53f10eb18 100644
+--- a/tools/perf/tests/evsel-tp-sched.c
++++ b/tools/perf/tests/evsel-tp-sched.c
+@@ -16,7 +16,7 @@ static int perf_evsel__test_field(struct perf_evsel *evsel, 
const char *name,
+               return -1;
+       }
+ 
+-      is_signed = !!(field->flags | FIELD_IS_SIGNED);
++      is_signed = !!(field->flags & FIELD_IS_SIGNED);
+       if (should_be_signed && !is_signed) {
+               pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",
+                        evsel->name, name, is_signed, should_be_signed);
+diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
+index ab36aa5585b4..a11f6760cce8 100644
+--- a/tools/perf/util/header.c
++++ b/tools/perf/util/header.c
+@@ -2988,7 +2988,7 @@ perf_event__synthesize_event_update_unit(struct 
perf_tool *tool,
+       if (ev == NULL)
+               return -ENOMEM;
+ 
+-      strncpy(ev->data, evsel->unit, size);
++      strlcpy(ev->data, evsel->unit, size + 1);
+       err = process(tool, (union perf_event *)ev, NULL, NULL);
+       free(ev);
+       return err;
+diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
+index 436b64731f65..b9507a8d0e30 100644
+--- a/tools/perf/util/probe-file.c
++++ b/tools/perf/util/probe-file.c
+@@ -414,7 +414,7 @@ static int probe_cache__open(struct probe_cache *pcache, 
const char *target)
+ 
+       if (target && build_id_cache__cached(target)) {
+               /* This is a cached buildid */
+-              strncpy(sbuildid, target, SBUILD_ID_SIZE);
++              strlcpy(sbuildid, target, SBUILD_ID_SIZE);
+               dir_name = build_id_cache__linkname(sbuildid, NULL, 0);
+               goto found;
+       }
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 4f2a2df85b1f..60de4c337f0a 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -2900,8 +2900,10 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
+       if (ops->init)
+               ops->init(dev);
+ 
++      kvm_get_kvm(kvm);
+       ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | 
O_CLOEXEC);
+       if (ret < 0) {
++              kvm_put_kvm(kvm);
+               mutex_lock(&kvm->lock);
+               list_del(&dev->vm_node);
+               mutex_unlock(&kvm->lock);
+@@ -2909,7 +2911,6 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
+               return ret;
+       }
+ 
+-      kvm_get_kvm(kvm);
+       cd->fd = ret;
+       return 0;
+ }

Reply via email to