commit:     5528487eab626dcd483ea5525e68d37c3a229668
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sat Mar 23 14:18:03 2019 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sat Mar 23 14:18:03 2019 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=5528487e

proj/linux-patches: Linux patch 4.9.165

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

 0000_README              |    4 +
 1164_linux-4.9.165.patch | 3761 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3765 insertions(+)

diff --git a/0000_README b/0000_README
index bd6aaaf..2c4bfc8 100644
--- a/0000_README
+++ b/0000_README
@@ -699,6 +699,10 @@ Patch:  1163_linux-4.9.164.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.164
 
+Patch:  1164_linux-4.9.165.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.165
+
 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/1164_linux-4.9.165.patch b/1164_linux-4.9.165.patch
new file mode 100644
index 0000000..fdd2ea3
--- /dev/null
+++ b/1164_linux-4.9.165.patch
@@ -0,0 +1,3761 @@
+diff --git a/Makefile b/Makefile
+index e1bcc76388dc..9b61da532c42 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 164
++SUBLEVEL = 165
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arc/include/asm/uaccess.h b/arch/arc/include/asm/uaccess.h
+index 0684fd2f42e8..f82393f89215 100644
+--- a/arch/arc/include/asm/uaccess.h
++++ b/arch/arc/include/asm/uaccess.h
+@@ -209,7 +209,7 @@ __arc_copy_from_user(void *to, const void __user *from, 
unsigned long n)
+               */
+                 "=&r" (tmp), "+r" (to), "+r" (from)
+               :
+-              : "lp_count", "lp_start", "lp_end", "memory");
++              : "lp_count", "memory");
+ 
+               return n;
+       }
+@@ -438,7 +438,7 @@ __arc_copy_to_user(void __user *to, const void *from, 
unsigned long n)
+                */
+                 "=&r" (tmp), "+r" (to), "+r" (from)
+               :
+-              : "lp_count", "lp_start", "lp_end", "memory");
++              : "lp_count", "memory");
+ 
+               return n;
+       }
+@@ -658,7 +658,7 @@ static inline unsigned long __arc_clear_user(void __user 
*to, unsigned long n)
+       "       .previous                       \n"
+       : "+r"(d_char), "+r"(res)
+       : "i"(0)
+-      : "lp_count", "lp_start", "lp_end", "memory");
++      : "lp_count", "memory");
+ 
+       return res;
+ }
+@@ -691,7 +691,7 @@ __arc_strncpy_from_user(char *dst, const char __user *src, 
long count)
+       "       .previous                       \n"
+       : "+r"(res), "+r"(dst), "+r"(src), "=r"(val)
+       : "g"(-EFAULT), "r"(count)
+-      : "lp_count", "lp_start", "lp_end", "memory");
++      : "lp_count", "memory");
+ 
+       return res;
+ }
+diff --git a/arch/arc/lib/memcpy-archs.S b/arch/arc/lib/memcpy-archs.S
+index d61044dd8b58..ea14b0bf3116 100644
+--- a/arch/arc/lib/memcpy-archs.S
++++ b/arch/arc/lib/memcpy-archs.S
+@@ -25,15 +25,11 @@
+ #endif
+ 
+ #ifdef CONFIG_ARC_HAS_LL64
+-# define PREFETCH_READ(RX)    prefetch    [RX, 56]
+-# define PREFETCH_WRITE(RX)   prefetchw   [RX, 64]
+ # define LOADX(DST,RX)                ldd.ab  DST, [RX, 8]
+ # define STOREX(SRC,RX)               std.ab  SRC, [RX, 8]
+ # define ZOLSHFT              5
+ # define ZOLAND                       0x1F
+ #else
+-# define PREFETCH_READ(RX)    prefetch    [RX, 28]
+-# define PREFETCH_WRITE(RX)   prefetchw   [RX, 32]
+ # define LOADX(DST,RX)                ld.ab   DST, [RX, 4]
+ # define STOREX(SRC,RX)               st.ab   SRC, [RX, 4]
+ # define ZOLSHFT              4
+@@ -41,8 +37,6 @@
+ #endif
+ 
+ ENTRY_CFI(memcpy)
+-      prefetch [r1]           ; Prefetch the read location
+-      prefetchw [r0]          ; Prefetch the write location
+       mov.f   0, r2
+ ;;; if size is zero
+       jz.d    [blink]
+@@ -72,8 +66,6 @@ ENTRY_CFI(memcpy)
+       lpnz    @.Lcopy32_64bytes
+       ;; LOOP START
+       LOADX (r6, r1)
+-      PREFETCH_READ (r1)
+-      PREFETCH_WRITE (r3)
+       LOADX (r8, r1)
+       LOADX (r10, r1)
+       LOADX (r4, r1)
+@@ -117,9 +109,7 @@ ENTRY_CFI(memcpy)
+       lpnz    @.Lcopy8bytes_1
+       ;; LOOP START
+       ld.ab   r6, [r1, 4]
+-      prefetch [r1, 28]       ;Prefetch the next read location
+       ld.ab   r8, [r1,4]
+-      prefetchw [r3, 32]      ;Prefetch the next write location
+ 
+       SHIFT_1 (r7, r6, 24)
+       or      r7, r7, r5
+@@ -162,9 +152,7 @@ ENTRY_CFI(memcpy)
+       lpnz    @.Lcopy8bytes_2
+       ;; LOOP START
+       ld.ab   r6, [r1, 4]
+-      prefetch [r1, 28]       ;Prefetch the next read location
+       ld.ab   r8, [r1,4]
+-      prefetchw [r3, 32]      ;Prefetch the next write location
+ 
+       SHIFT_1 (r7, r6, 16)
+       or      r7, r7, r5
+@@ -204,9 +192,7 @@ ENTRY_CFI(memcpy)
+       lpnz    @.Lcopy8bytes_3
+       ;; LOOP START
+       ld.ab   r6, [r1, 4]
+-      prefetch [r1, 28]       ;Prefetch the next read location
+       ld.ab   r8, [r1,4]
+-      prefetchw [r3, 32]      ;Prefetch the next write location
+ 
+       SHIFT_1 (r7, r6, 8)
+       or      r7, r7, r5
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
+index b5d529fdffab..74a70f91b01a 100644
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -1457,6 +1457,7 @@ config NR_CPUS
+ config HOTPLUG_CPU
+       bool "Support for hot-pluggable CPUs"
+       depends on SMP
++      select GENERIC_IRQ_MIGRATION
+       help
+         Say Y here to experiment with turning CPUs off and on.  CPUs
+         can be controlled through /sys/devices/system/cpu.
+diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h
+index e53638c8ed8a..61e1d089ce1a 100644
+--- a/arch/arm/include/asm/irq.h
++++ b/arch/arm/include/asm/irq.h
+@@ -24,7 +24,6 @@
+ #ifndef __ASSEMBLY__
+ struct irqaction;
+ struct pt_regs;
+-extern void migrate_irqs(void);
+ 
+ extern void asm_do_IRQ(unsigned int, struct pt_regs *);
+ void handle_IRQ(unsigned int, struct pt_regs *);
+diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c
+index ece04a457486..5b07c7a31c31 100644
+--- a/arch/arm/kernel/irq.c
++++ b/arch/arm/kernel/irq.c
+@@ -31,7 +31,6 @@
+ #include <linux/smp.h>
+ #include <linux/init.h>
+ #include <linux/seq_file.h>
+-#include <linux/ratelimit.h>
+ #include <linux/errno.h>
+ #include <linux/list.h>
+ #include <linux/kallsyms.h>
+@@ -119,64 +118,3 @@ int __init arch_probe_nr_irqs(void)
+       return nr_irqs;
+ }
+ #endif
+-
+-#ifdef CONFIG_HOTPLUG_CPU
+-static bool migrate_one_irq(struct irq_desc *desc)
+-{
+-      struct irq_data *d = irq_desc_get_irq_data(desc);
+-      const struct cpumask *affinity = irq_data_get_affinity_mask(d);
+-      struct irq_chip *c;
+-      bool ret = false;
+-
+-      /*
+-       * If this is a per-CPU interrupt, or the affinity does not
+-       * include this CPU, then we have nothing to do.
+-       */
+-      if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), 
affinity))
+-              return false;
+-
+-      if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
+-              affinity = cpu_online_mask;
+-              ret = true;
+-      }
+-
+-      c = irq_data_get_irq_chip(d);
+-      if (!c->irq_set_affinity)
+-              pr_debug("IRQ%u: unable to set affinity\n", d->irq);
+-      else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && 
ret)
+-              cpumask_copy(irq_data_get_affinity_mask(d), affinity);
+-
+-      return ret;
+-}
+-
+-/*
+- * The current CPU has been marked offline.  Migrate IRQs off this CPU.
+- * If the affinity settings do not allow other CPUs, force them onto any
+- * available CPU.
+- *
+- * Note: we must iterate over all IRQs, whether they have an attached
+- * action structure or not, as we need to get chained interrupts too.
+- */
+-void migrate_irqs(void)
+-{
+-      unsigned int i;
+-      struct irq_desc *desc;
+-      unsigned long flags;
+-
+-      local_irq_save(flags);
+-
+-      for_each_irq_desc(i, desc) {
+-              bool affinity_broken;
+-
+-              raw_spin_lock(&desc->lock);
+-              affinity_broken = migrate_one_irq(desc);
+-              raw_spin_unlock(&desc->lock);
+-
+-              if (affinity_broken)
+-                      pr_warn_ratelimited("IRQ%u no longer affine to CPU%u\n",
+-                              i, smp_processor_id());
+-      }
+-
+-      local_irq_restore(flags);
+-}
+-#endif /* CONFIG_HOTPLUG_CPU */
+diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
+index 8faf869e9fb2..bc83ec7ed53f 100644
+--- a/arch/arm/kernel/smp.c
++++ b/arch/arm/kernel/smp.c
+@@ -253,7 +253,7 @@ int __cpu_disable(void)
+       /*
+        * OK - migrate IRQs away from this CPU
+        */
+-      migrate_irqs();
++      irq_migrate_all_off_this_cpu();
+ 
+       /*
+        * Flush user cache and TLB mappings, and then remove this CPU
+diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c
+index 70b3eaf085e4..5ca7e29ad851 100644
+--- a/arch/arm/mach-omap2/display.c
++++ b/arch/arm/mach-omap2/display.c
+@@ -115,6 +115,7 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
+       u32 enable_mask, enable_shift;
+       u32 pipd_mask, pipd_shift;
+       u32 reg;
++      int ret;
+ 
+       if (dsi_id == 0) {
+               enable_mask = OMAP4_DSI1_LANEENABLE_MASK;
+@@ -130,7 +131,11 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
+               return -ENODEV;
+       }
+ 
+-      regmap_read(omap4_dsi_mux_syscon, OMAP4_DSIPHY_SYSCON_OFFSET, &reg);
++      ret = regmap_read(omap4_dsi_mux_syscon,
++                                        OMAP4_DSIPHY_SYSCON_OFFSET,
++                                        &reg);
++      if (ret)
++              return ret;
+ 
+       reg &= ~enable_mask;
+       reg &= ~pipd_mask;
+diff --git a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c 
b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c
+index 262ab0744748..f4fdfca9439b 100644
+--- a/arch/arm/mach-s3c24xx/mach-osiris-dvs.c
++++ b/arch/arm/mach-s3c24xx/mach-osiris-dvs.c
+@@ -70,16 +70,16 @@ static int osiris_dvs_notify(struct notifier_block *nb,
+ 
+       switch (val) {
+       case CPUFREQ_PRECHANGE:
+-              if (old_dvs & !new_dvs ||
+-                  cur_dvs & !new_dvs) {
++              if ((old_dvs && !new_dvs) ||
++                  (cur_dvs && !new_dvs)) {
+                       pr_debug("%s: exiting dvs\n", __func__);
+                       cur_dvs = false;
+                       gpio_set_value(OSIRIS_GPIO_DVS, 1);
+               }
+               break;
+       case CPUFREQ_POSTCHANGE:
+-              if (!old_dvs & new_dvs ||
+-                  !cur_dvs & new_dvs) {
++              if ((!old_dvs && new_dvs) ||
++                  (!cur_dvs && new_dvs)) {
+                       pr_debug("entering dvs\n");
+                       cur_dvs = true;
+                       gpio_set_value(OSIRIS_GPIO_DVS, 0);
+diff --git a/arch/arm64/crypto/aes-ce-ccm-core.S 
b/arch/arm64/crypto/aes-ce-ccm-core.S
+index 3363560c79b7..7bc459d9235c 100644
+--- a/arch/arm64/crypto/aes-ce-ccm-core.S
++++ b/arch/arm64/crypto/aes-ce-ccm-core.S
+@@ -74,12 +74,13 @@ ENTRY(ce_aes_ccm_auth_data)
+       beq     10f
+       ext     v0.16b, v0.16b, v0.16b, #1      /* rotate out the mac bytes */
+       b       7b
+-8:    mov     w7, w8
++8:    cbz     w8, 91f
++      mov     w7, w8
+       add     w8, w8, #16
+ 9:    ext     v1.16b, v1.16b, v1.16b, #1
+       adds    w7, w7, #1
+       bne     9b
+-      eor     v0.16b, v0.16b, v1.16b
++91:   eor     v0.16b, v0.16b, v1.16b
+       st1     {v0.16b}, [x0]
+ 10:   str     w8, [x3]
+       ret
+diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
+index 3289d1458791..db6ff1944c41 100644
+--- a/arch/arm64/kernel/head.S
++++ b/arch/arm64/kernel/head.S
+@@ -534,8 +534,7 @@ set_hcr:
+       /* GICv3 system register access */
+       mrs     x0, id_aa64pfr0_el1
+       ubfx    x0, x0, #24, #4
+-      cmp     x0, #1
+-      b.ne    3f
++      cbz     x0, 3f
+ 
+       mrs_s   x0, ICC_SRE_EL2
+       orr     x0, x0, #ICC_SRE_EL2_SRE        // Set ICC_SRE_EL2.SRE==1
+diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile
+index f0dd9fc84002..a229d28e14cc 100644
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -58,7 +58,10 @@ cpuflags-$(CONFIG_M5206e)   := $(call 
cc-option,-mcpu=5206e,-m5200)
+ cpuflags-$(CONFIG_M5206)      := $(call cc-option,-mcpu=5206,-m5200)
+ 
+ KBUILD_AFLAGS += $(cpuflags-y)
+-KBUILD_CFLAGS += $(cpuflags-y) -pipe
++KBUILD_CFLAGS += $(cpuflags-y)
++
++KBUILD_CFLAGS += -pipe -ffreestanding
++
+ ifdef CONFIG_MMU
+ # without -fno-strength-reduce the 53c7xx.c driver fails ;-(
+ KBUILD_CFLAGS += -fno-strength-reduce -ffixed-a2
+diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
+index 3841d749a430..370645687cc7 100644
+--- a/arch/powerpc/kernel/entry_32.S
++++ b/arch/powerpc/kernel/entry_32.S
+@@ -698,6 +698,9 @@ fast_exception_return:
+       mtcr    r10
+       lwz     r10,_LINK(r11)
+       mtlr    r10
++      /* Clear the exception_marker on the stack to avoid confusing 
stacktrace */
++      li      r10, 0
++      stw     r10, 8(r11)
+       REST_GPR(10, r11)
+       mtspr   SPRN_SRR1,r9
+       mtspr   SPRN_SRR0,r12
+@@ -932,6 +935,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
+       mtcrf   0xFF,r10
+       mtlr    r11
+ 
++      /* Clear the exception_marker on the stack to avoid confusing 
stacktrace */
++      li      r10, 0
++      stw     r10, 8(r1)
+       /*
+        * Once we put values in SRR0 and SRR1, we are in a state
+        * where exceptions are not recoverable, since taking an
+@@ -969,6 +975,9 @@ exc_exit_restart_end:
+       mtlr    r11
+       lwz     r10,_CCR(r1)
+       mtcrf   0xff,r10
++      /* Clear the exception_marker on the stack to avoid confusing 
stacktrace */
++      li      r10, 0
++      stw     r10, 8(r1)
+       REST_2GPRS(9, r1)
+       .globl exc_exit_restart
+ exc_exit_restart:
+diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
+index 1c141d50fbc6..609f0e87ced7 100644
+--- a/arch/powerpc/kernel/process.c
++++ b/arch/powerpc/kernel/process.c
+@@ -153,7 +153,7 @@ void __giveup_fpu(struct task_struct *tsk)
+ 
+       save_fpu(tsk);
+       msr = tsk->thread.regs->msr;
+-      msr &= ~MSR_FP;
++      msr &= ~(MSR_FP|MSR_FE0|MSR_FE1);
+ #ifdef CONFIG_VSX
+       if (cpu_has_feature(CPU_FTR_VSX))
+               msr &= ~MSR_VSX;
+diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
+index adfa63e7df8c..4f2829634d79 100644
+--- a/arch/powerpc/kernel/ptrace.c
++++ b/arch/powerpc/kernel/ptrace.c
+@@ -547,6 +547,7 @@ static int vr_get(struct task_struct *target, const struct 
user_regset *regset,
+               /*
+                * Copy out only the low-order word of vrsave.
+                */
++              int start, end;
+               union {
+                       elf_vrreg_t reg;
+                       u32 word;
+@@ -555,8 +556,10 @@ static int vr_get(struct task_struct *target, const 
struct user_regset *regset,
+ 
+               vrsave.word = target->thread.vrsave;
+ 
++              start = 33 * sizeof(vector128);
++              end = start + sizeof(vrsave);
+               ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, &vrsave,
+-                                        33 * sizeof(vector128), -1);
++                                        start, end);
+       }
+ 
+       return ret;
+@@ -594,6 +597,7 @@ static int vr_set(struct task_struct *target, const struct 
user_regset *regset,
+               /*
+                * We use only the first word of vrsave.
+                */
++              int start, end;
+               union {
+                       elf_vrreg_t reg;
+                       u32 word;
+@@ -602,8 +606,10 @@ static int vr_set(struct task_struct *target, const 
struct user_regset *regset,
+ 
+               vrsave.word = target->thread.vrsave;
+ 
++              start = 33 * sizeof(vector128);
++              end = start + sizeof(vrsave);
+               ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &vrsave,
+-                                       33 * sizeof(vector128), -1);
++                                       start, end);
+               if (!ret)
+                       target->thread.vrsave = vrsave.word;
+       }
+diff --git a/arch/powerpc/platforms/83xx/suspend-asm.S 
b/arch/powerpc/platforms/83xx/suspend-asm.S
+index 3d1ecd211776..8137f77abad5 100644
+--- a/arch/powerpc/platforms/83xx/suspend-asm.S
++++ b/arch/powerpc/platforms/83xx/suspend-asm.S
+@@ -26,13 +26,13 @@
+ #define SS_MSR                0x74
+ #define SS_SDR1               0x78
+ #define SS_LR         0x7c
+-#define SS_SPRG               0x80 /* 4 SPRGs */
+-#define SS_DBAT               0x90 /* 8 DBATs */
+-#define SS_IBAT               0xd0 /* 8 IBATs */
+-#define SS_TB         0x110
+-#define SS_CR         0x118
+-#define SS_GPREG      0x11c /* r12-r31 */
+-#define STATE_SAVE_SIZE 0x16c
++#define SS_SPRG               0x80 /* 8 SPRGs */
++#define SS_DBAT               0xa0 /* 8 DBATs */
++#define SS_IBAT               0xe0 /* 8 IBATs */
++#define SS_TB         0x120
++#define SS_CR         0x128
++#define SS_GPREG      0x12c /* r12-r31 */
++#define STATE_SAVE_SIZE 0x17c
+ 
+       .section .data
+       .align  5
+@@ -103,6 +103,16 @@ _GLOBAL(mpc83xx_enter_deep_sleep)
+       stw     r7, SS_SPRG+12(r3)
+       stw     r8, SS_SDR1(r3)
+ 
++      mfspr   r4, SPRN_SPRG4
++      mfspr   r5, SPRN_SPRG5
++      mfspr   r6, SPRN_SPRG6
++      mfspr   r7, SPRN_SPRG7
++
++      stw     r4, SS_SPRG+16(r3)
++      stw     r5, SS_SPRG+20(r3)
++      stw     r6, SS_SPRG+24(r3)
++      stw     r7, SS_SPRG+28(r3)
++
+       mfspr   r4, SPRN_DBAT0U
+       mfspr   r5, SPRN_DBAT0L
+       mfspr   r6, SPRN_DBAT1U
+@@ -493,6 +503,16 @@ mpc83xx_deep_resume:
+       mtspr   SPRN_IBAT7U, r6
+       mtspr   SPRN_IBAT7L, r7
+ 
++      lwz     r4, SS_SPRG+16(r3)
++      lwz     r5, SS_SPRG+20(r3)
++      lwz     r6, SS_SPRG+24(r3)
++      lwz     r7, SS_SPRG+28(r3)
++
++      mtspr   SPRN_SPRG4, r4
++      mtspr   SPRN_SPRG5, r5
++      mtspr   SPRN_SPRG6, r6
++      mtspr   SPRN_SPRG7, r7
++
+       lwz     r4, SS_SPRG+0(r3)
+       lwz     r5, SS_SPRG+4(r3)
+       lwz     r6, SS_SPRG+8(r3)
+diff --git a/arch/powerpc/platforms/embedded6xx/wii.c 
b/arch/powerpc/platforms/embedded6xx/wii.c
+index 3fd683e40bc9..2914529c0695 100644
+--- a/arch/powerpc/platforms/embedded6xx/wii.c
++++ b/arch/powerpc/platforms/embedded6xx/wii.c
+@@ -104,6 +104,10 @@ unsigned long __init wii_mmu_mapin_mem2(unsigned long top)
+       /* MEM2 64MB@0x10000000 */
+       delta = wii_hole_start + wii_hole_size;
+       size = top - delta;
++
++      if (__map_without_bats)
++              return delta;
++
+       for (bl = 128<<10; bl < max_size; bl <<= 1) {
+               if (bl * 2 > size)
+                       break;
+diff --git a/arch/powerpc/platforms/powernv/opal-msglog.c 
b/arch/powerpc/platforms/powernv/opal-msglog.c
+index 39d6ff9e5630..d10bad14097b 100644
+--- a/arch/powerpc/platforms/powernv/opal-msglog.c
++++ b/arch/powerpc/platforms/powernv/opal-msglog.c
+@@ -98,7 +98,7 @@ static ssize_t opal_msglog_read(struct file *file, struct 
kobject *kobj,
+ }
+ 
+ static struct bin_attribute opal_msglog_attr = {
+-      .attr = {.name = "msglog", .mode = 0444},
++      .attr = {.name = "msglog", .mode = 0400},
+       .read = opal_msglog_read
+ };
+ 
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 1870fa7387b7..a34fb7284024 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -5965,6 +5965,7 @@ static int handle_external_interrupt(struct kvm_vcpu 
*vcpu)
+ static int handle_triple_fault(struct kvm_vcpu *vcpu)
+ {
+       vcpu->run->exit_reason = KVM_EXIT_SHUTDOWN;
++      vcpu->mmio_needed = 0;
+       return 0;
+ }
+ 
+@@ -7046,6 +7047,10 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu,
+       /* Addr = segment_base + offset */
+       /* offset = base + [index * scale] + displacement */
+       off = exit_qualification; /* holds the displacement */
++      if (addr_size == 1)
++              off = (gva_t)sign_extend64(off, 31);
++      else if (addr_size == 0)
++              off = (gva_t)sign_extend64(off, 15);
+       if (base_is_valid)
+               off += kvm_register_read(vcpu, base_reg);
+       if (index_is_valid)
+@@ -7088,10 +7093,16 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu,
+               /* Protected mode: #GP(0)/#SS(0) if the segment is unusable.
+                */
+               exn = (s.unusable != 0);
+-              /* Protected mode: #GP(0)/#SS(0) if the memory
+-               * operand is outside the segment limit.
++
++              /*
++               * Protected mode: #GP(0)/#SS(0) if the memory operand is
++               * outside the segment limit.  All CPUs that support VMX ignore
++               * limit checks for flat segments, i.e. segments with base==0,
++               * limit==0xffffffff and of type expand-up data or code.
+                */
+-              exn = exn || (off + sizeof(u64) > s.limit);
++              if (!(s.base == 0 && s.limit == 0xffffffff &&
++                   ((s.type & 8) || !(s.type & 4))))
++                      exn = exn || (off + sizeof(u64) > s.limit);
+       }
+       if (exn) {
+               kvm_queue_exception_e(vcpu,
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 5a35fee46620..a29df9ccbfde 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -6769,6 +6769,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
+               }
+               if (kvm_check_request(KVM_REQ_TRIPLE_FAULT, vcpu)) {
+                       vcpu->run->exit_reason = KVM_EXIT_SHUTDOWN;
++                      vcpu->mmio_needed = 0;
+                       r = 0;
+                       goto out;
+               }
+diff --git a/crypto/ahash.c b/crypto/ahash.c
+index 90d73a22f129..9a4e87755a0b 100644
+--- a/crypto/ahash.c
++++ b/crypto/ahash.c
+@@ -85,17 +85,17 @@ static int hash_walk_new_entry(struct crypto_hash_walk 
*walk)
+ int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err)
+ {
+       unsigned int alignmask = walk->alignmask;
+-      unsigned int nbytes = walk->entrylen;
+ 
+       walk->data -= walk->offset;
+ 
+-      if (nbytes && walk->offset & alignmask && !err) {
+-              walk->offset = ALIGN(walk->offset, alignmask + 1);
+-              nbytes = min(nbytes,
+-                           ((unsigned int)(PAGE_SIZE)) - walk->offset);
+-              walk->entrylen -= nbytes;
++      if (walk->entrylen && (walk->offset & alignmask) && !err) {
++              unsigned int nbytes;
+ 
++              walk->offset = ALIGN(walk->offset, alignmask + 1);
++              nbytes = min(walk->entrylen,
++                           (unsigned int)(PAGE_SIZE - walk->offset));
+               if (nbytes) {
++                      walk->entrylen -= nbytes;
+                       walk->data += walk->offset;
+                       return nbytes;
+               }
+@@ -115,7 +115,7 @@ int crypto_hash_walk_done(struct crypto_hash_walk *walk, 
int err)
+       if (err)
+               return err;
+ 
+-      if (nbytes) {
++      if (walk->entrylen) {
+               walk->offset = 0;
+               walk->pg++;
+               return hash_walk_next(walk);
+@@ -189,6 +189,21 @@ static int ahash_setkey_unaligned(struct crypto_ahash 
*tfm, const u8 *key,
+       return ret;
+ }
+ 
++static int ahash_nosetkey(struct crypto_ahash *tfm, const u8 *key,
++                        unsigned int keylen)
++{
++      return -ENOSYS;
++}
++
++static void ahash_set_needkey(struct crypto_ahash *tfm)
++{
++      const struct hash_alg_common *alg = crypto_hash_alg_common(tfm);
++
++      if (tfm->setkey != ahash_nosetkey &&
++          !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
++              crypto_ahash_set_flags(tfm, CRYPTO_TFM_NEED_KEY);
++}
++
+ int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
+                       unsigned int keylen)
+ {
+@@ -200,20 +215,16 @@ int crypto_ahash_setkey(struct crypto_ahash *tfm, const 
u8 *key,
+       else
+               err = tfm->setkey(tfm, key, keylen);
+ 
+-      if (err)
++      if (unlikely(err)) {
++              ahash_set_needkey(tfm);
+               return err;
++      }
+ 
+       crypto_ahash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY);
+       return 0;
+ }
+ EXPORT_SYMBOL_GPL(crypto_ahash_setkey);
+ 
+-static int ahash_nosetkey(struct crypto_ahash *tfm, const u8 *key,
+-                        unsigned int keylen)
+-{
+-      return -ENOSYS;
+-}
+-
+ static inline unsigned int ahash_align_buffer_size(unsigned len,
+                                                  unsigned long mask)
+ {
+@@ -482,8 +493,7 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
+ 
+       if (alg->setkey) {
+               hash->setkey = alg->setkey;
+-              if (!(alg->halg.base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
+-                      crypto_ahash_set_flags(hash, CRYPTO_TFM_NEED_KEY);
++              ahash_set_needkey(hash);
+       }
+       if (alg->export)
+               hash->export = alg->export;
+diff --git a/crypto/pcbc.c b/crypto/pcbc.c
+index f654965f0933..de81f716cf26 100644
+--- a/crypto/pcbc.c
++++ b/crypto/pcbc.c
+@@ -52,7 +52,7 @@ static int crypto_pcbc_encrypt_segment(struct blkcipher_desc 
*desc,
+       unsigned int nbytes = walk->nbytes;
+       u8 *src = walk->src.virt.addr;
+       u8 *dst = walk->dst.virt.addr;
+-      u8 *iv = walk->iv;
++      u8 * const iv = walk->iv;
+ 
+       do {
+               crypto_xor(iv, src, bsize);
+@@ -76,7 +76,7 @@ static int crypto_pcbc_encrypt_inplace(struct blkcipher_desc 
*desc,
+       int bsize = crypto_cipher_blocksize(tfm);
+       unsigned int nbytes = walk->nbytes;
+       u8 *src = walk->src.virt.addr;
+-      u8 *iv = walk->iv;
++      u8 * const iv = walk->iv;
+       u8 tmpbuf[bsize];
+ 
+       do {
+@@ -89,8 +89,6 @@ static int crypto_pcbc_encrypt_inplace(struct blkcipher_desc 
*desc,
+               src += bsize;
+       } while ((nbytes -= bsize) >= bsize);
+ 
+-      memcpy(walk->iv, iv, bsize);
+-
+       return nbytes;
+ }
+ 
+@@ -130,7 +128,7 @@ static int crypto_pcbc_decrypt_segment(struct 
blkcipher_desc *desc,
+       unsigned int nbytes = walk->nbytes;
+       u8 *src = walk->src.virt.addr;
+       u8 *dst = walk->dst.virt.addr;
+-      u8 *iv = walk->iv;
++      u8 * const iv = walk->iv;
+ 
+       do {
+               fn(crypto_cipher_tfm(tfm), dst, src);
+@@ -142,8 +140,6 @@ static int crypto_pcbc_decrypt_segment(struct 
blkcipher_desc *desc,
+               dst += bsize;
+       } while ((nbytes -= bsize) >= bsize);
+ 
+-      memcpy(walk->iv, iv, bsize);
+-
+       return nbytes;
+ }
+ 
+@@ -156,7 +152,7 @@ static int crypto_pcbc_decrypt_inplace(struct 
blkcipher_desc *desc,
+       int bsize = crypto_cipher_blocksize(tfm);
+       unsigned int nbytes = walk->nbytes;
+       u8 *src = walk->src.virt.addr;
+-      u8 *iv = walk->iv;
++      u8 * const iv = walk->iv;
+       u8 tmpbuf[bsize];
+ 
+       do {
+@@ -169,8 +165,6 @@ static int crypto_pcbc_decrypt_inplace(struct 
blkcipher_desc *desc,
+               src += bsize;
+       } while ((nbytes -= bsize) >= bsize);
+ 
+-      memcpy(walk->iv, iv, bsize);
+-
+       return nbytes;
+ }
+ 
+diff --git a/crypto/shash.c b/crypto/shash.c
+index 4f047c7eeca7..a1c7609578ea 100644
+--- a/crypto/shash.c
++++ b/crypto/shash.c
+@@ -52,6 +52,13 @@ static int shash_setkey_unaligned(struct crypto_shash *tfm, 
const u8 *key,
+       return err;
+ }
+ 
++static void shash_set_needkey(struct crypto_shash *tfm, struct shash_alg *alg)
++{
++      if (crypto_shash_alg_has_setkey(alg) &&
++          !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
++              crypto_shash_set_flags(tfm, CRYPTO_TFM_NEED_KEY);
++}
++
+ int crypto_shash_setkey(struct crypto_shash *tfm, const u8 *key,
+                       unsigned int keylen)
+ {
+@@ -64,8 +71,10 @@ int crypto_shash_setkey(struct crypto_shash *tfm, const u8 
*key,
+       else
+               err = shash->setkey(tfm, key, keylen);
+ 
+-      if (err)
++      if (unlikely(err)) {
++              shash_set_needkey(tfm, shash);
+               return err;
++      }
+ 
+       crypto_shash_clear_flags(tfm, CRYPTO_TFM_NEED_KEY);
+       return 0;
+@@ -367,7 +376,8 @@ int crypto_init_shash_ops_async(struct crypto_tfm *tfm)
+       crt->final = shash_async_final;
+       crt->finup = shash_async_finup;
+       crt->digest = shash_async_digest;
+-      crt->setkey = shash_async_setkey;
++      if (crypto_shash_alg_has_setkey(alg))
++              crt->setkey = shash_async_setkey;
+ 
+       crypto_ahash_set_flags(crt, crypto_shash_get_flags(shash) &
+                                   CRYPTO_TFM_NEED_KEY);
+@@ -389,9 +399,7 @@ static int crypto_shash_init_tfm(struct crypto_tfm *tfm)
+ 
+       hash->descsize = alg->descsize;
+ 
+-      if (crypto_shash_alg_has_setkey(alg) &&
+-          !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY))
+-              crypto_shash_set_flags(hash, CRYPTO_TFM_NEED_KEY);
++      shash_set_needkey(hash, alg);
+ 
+       return 0;
+ }
+diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c
+index 201c7ceb7052..98b513d049f6 100644
+--- a/drivers/acpi/device_sysfs.c
++++ b/drivers/acpi/device_sysfs.c
+@@ -202,11 +202,15 @@ static int create_of_modalias(struct acpi_device 
*acpi_dev, char *modalias,
+ {
+       struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
+       const union acpi_object *of_compatible, *obj;
++      acpi_status status;
+       int len, count;
+       int i, nval;
+       char *c;
+ 
+-      acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf);
++      status = acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf);
++      if (ACPI_FAILURE(status))
++              return -ENODEV;
++
+       /* DT strings are all in lower case */
+       for (c = buf.pointer; *c != '\0'; c++)
+               *c = tolower(*c);
+diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
+index 06cf7427d0c4..31a07609f7a2 100644
+--- a/drivers/acpi/nfit/core.c
++++ b/drivers/acpi/nfit/core.c
+@@ -307,6 +307,13 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, 
struct nvdimm *nvdimm,
+               return -EINVAL;
+       }
+ 
++      if (out_obj->type != ACPI_TYPE_BUFFER) {
++              dev_dbg(dev, "%s unexpected output object type cmd: %s type: 
%d\n",
++                              dimm_name, cmd_name, out_obj->type);
++              rc = -EINVAL;
++              goto out;
++      }
++
+       if (call_pkg) {
+               call_pkg->nd_fw_size = out_obj->buffer.length;
+               memcpy(call_pkg->nd_payload + call_pkg->nd_size_in,
+@@ -325,13 +332,6 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, 
struct nvdimm *nvdimm,
+               return 0;
+       }
+ 
+-      if (out_obj->package.type != ACPI_TYPE_BUFFER) {
+-              dev_dbg(dev, "%s:%s unexpected output object type cmd: %s type: 
%d\n",
+-                              __func__, dimm_name, cmd_name, out_obj->type);
+-              rc = -EINVAL;
+-              goto out;
+-      }
+-
+       if (IS_ENABLED(CONFIG_ACPI_NFIT_DEBUG)) {
+               dev_dbg(dev, "%s:%s cmd: %s output length: %d\n", __func__,
+                               dimm_name, cmd_name, out_obj->buffer.length);
+diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
+index f98121f11f7c..9f51a167bf4e 100644
+--- a/drivers/base/power/wakeup.c
++++ b/drivers/base/power/wakeup.c
+@@ -113,7 +113,6 @@ void wakeup_source_drop(struct wakeup_source *ws)
+       if (!ws)
+               return;
+ 
+-      del_timer_sync(&ws->timer);
+       __pm_relax(ws);
+ }
+ EXPORT_SYMBOL_GPL(wakeup_source_drop);
+@@ -201,6 +200,13 @@ void wakeup_source_remove(struct wakeup_source *ws)
+       list_del_rcu(&ws->entry);
+       spin_unlock_irqrestore(&events_lock, flags);
+       synchronize_srcu(&wakeup_srcu);
++
++      del_timer_sync(&ws->timer);
++      /*
++       * Clear timer.function to make wakeup_source_not_registered() treat
++       * this wakeup source as not registered.
++       */
++      ws->timer.function = NULL;
+ }
+ EXPORT_SYMBOL_GPL(wakeup_source_remove);
+ 
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index 326b9ba4518e..6914c6e1e1a8 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -3752,7 +3752,7 @@ static unsigned int floppy_check_events(struct gendisk 
*disk,
+ 
+       if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
+               if (lock_fdc(drive))
+-                      return -EINTR;
++                      return 0;
+               poll_drive(false, 0);
+               process_fd_request();
+       }
+diff --git a/drivers/clk/clk-twl6040.c b/drivers/clk/clk-twl6040.c
+index 7b222a5db931..82d615fe2947 100644
+--- a/drivers/clk/clk-twl6040.c
++++ b/drivers/clk/clk-twl6040.c
+@@ -41,6 +41,43 @@ static int twl6040_pdmclk_is_prepared(struct clk_hw *hw)
+       return pdmclk->enabled;
+ }
+ 
++static int twl6040_pdmclk_reset_one_clock(struct twl6040_pdmclk *pdmclk,
++                                        unsigned int reg)
++{
++      const u8 reset_mask = TWL6040_HPLLRST;  /* Same for HPPLL and LPPLL */
++      int ret;
++
++      ret = twl6040_set_bits(pdmclk->twl6040, reg, reset_mask);
++      if (ret < 0)
++              return ret;
++
++      ret = twl6040_clear_bits(pdmclk->twl6040, reg, reset_mask);
++      if (ret < 0)
++              return ret;
++
++      return 0;
++}
++
++/*
++ * TWL6040A2 Phoenix Audio IC erratum #6: "PDM Clock Generation Issue At
++ * Cold Temperature". This affects cold boot and deeper idle states it
++ * seems. The workaround consists of resetting HPPLL and LPPLL.
++ */
++static int twl6040_pdmclk_quirk_reset_clocks(struct twl6040_pdmclk *pdmclk)
++{
++      int ret;
++
++      ret = twl6040_pdmclk_reset_one_clock(pdmclk, TWL6040_REG_HPPLLCTL);
++      if (ret)
++              return ret;
++
++      ret = twl6040_pdmclk_reset_one_clock(pdmclk, TWL6040_REG_LPPLLCTL);
++      if (ret)
++              return ret;
++
++      return 0;
++}
++
+ static int twl6040_pdmclk_prepare(struct clk_hw *hw)
+ {
+       struct twl6040_pdmclk *pdmclk = container_of(hw, struct twl6040_pdmclk,
+@@ -48,8 +85,20 @@ static int twl6040_pdmclk_prepare(struct clk_hw *hw)
+       int ret;
+ 
+       ret = twl6040_power(pdmclk->twl6040, 1);
+-      if (!ret)
+-              pdmclk->enabled = 1;
++      if (ret)
++              return ret;
++
++      ret = twl6040_pdmclk_quirk_reset_clocks(pdmclk);
++      if (ret)
++              goto out_err;
++
++      pdmclk->enabled = 1;
++
++      return 0;
++
++out_err:
++      dev_err(pdmclk->dev, "%s: error %i\n", __func__, ret);
++      twl6040_power(pdmclk->twl6040, 0);
+ 
+       return ret;
+ }
+diff --git a/drivers/clk/ingenic/cgu.c b/drivers/clk/ingenic/cgu.c
+index e8248f9185f7..4dec9e9ccffe 100644
+--- a/drivers/clk/ingenic/cgu.c
++++ b/drivers/clk/ingenic/cgu.c
+@@ -364,16 +364,16 @@ ingenic_clk_round_rate(struct clk_hw *hw, unsigned long 
req_rate,
+       struct ingenic_clk *ingenic_clk = to_ingenic_clk(hw);
+       struct ingenic_cgu *cgu = ingenic_clk->cgu;
+       const struct ingenic_cgu_clk_info *clk_info;
+-      long rate = *parent_rate;
++      unsigned int div = 1;
+ 
+       clk_info = &cgu->clock_info[ingenic_clk->idx];
+ 
+       if (clk_info->type & CGU_CLK_DIV)
+-              rate /= ingenic_clk_calc_div(clk_info, *parent_rate, req_rate);
++              div = ingenic_clk_calc_div(clk_info, *parent_rate, req_rate);
+       else if (clk_info->type & CGU_CLK_FIXDIV)
+-              rate /= clk_info->fixdiv.div;
++              div = clk_info->fixdiv.div;
+ 
+-      return rate;
++      return DIV_ROUND_UP(*parent_rate, div);
+ }
+ 
+ static int
+@@ -393,7 +393,7 @@ ingenic_clk_set_rate(struct clk_hw *hw, unsigned long 
req_rate,
+ 
+       if (clk_info->type & CGU_CLK_DIV) {
+               div = ingenic_clk_calc_div(clk_info, parent_rate, req_rate);
+-              rate = parent_rate / div;
++              rate = DIV_ROUND_UP(parent_rate, div);
+ 
+               if (rate != req_rate)
+                       return -EINVAL;
+diff --git a/drivers/clk/ingenic/cgu.h b/drivers/clk/ingenic/cgu.h
+index 09700b2c555d..a22f654b2900 100644
+--- a/drivers/clk/ingenic/cgu.h
++++ b/drivers/clk/ingenic/cgu.h
+@@ -78,7 +78,7 @@ struct ingenic_cgu_mux_info {
+  * @reg: offset of the divider control register within the CGU
+  * @shift: number of bits to left shift the divide value by (ie. the index of
+  *         the lowest bit of the divide value within its control register)
+- * @div: number of bits to divide the divider value by (i.e. if the
++ * @div: number to divide the divider value by (i.e. if the
+  *     effective divider value is the value written to the register
+  *     multiplied by some constant)
+  * @bits: the size of the divide value in bits
+diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c 
b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+index 6ea5401e6881..7f1281298651 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
++++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+@@ -252,9 +252,9 @@ static SUNXI_CCU_GATE(ahb1_mmc1_clk,       "ahb1-mmc1",    
"ahb1",
+ static SUNXI_CCU_GATE(ahb1_mmc2_clk,  "ahb1-mmc2",    "ahb1",
+                     0x060, BIT(10), 0);
+ static SUNXI_CCU_GATE(ahb1_mmc3_clk,  "ahb1-mmc3",    "ahb1",
+-                    0x060, BIT(12), 0);
++                    0x060, BIT(11), 0);
+ static SUNXI_CCU_GATE(ahb1_nand1_clk, "ahb1-nand1",   "ahb1",
+-                    0x060, BIT(13), 0);
++                    0x060, BIT(12), 0);
+ static SUNXI_CCU_GATE(ahb1_nand0_clk, "ahb1-nand0",   "ahb1",
+                     0x060, BIT(13), 0);
+ static SUNXI_CCU_GATE(ahb1_sdram_clk, "ahb1-sdram",   "ahb1",
+diff --git a/drivers/clocksource/exynos_mct.c 
b/drivers/clocksource/exynos_mct.c
+index 7f6fed9f0703..fb0cf8b74516 100644
+--- a/drivers/clocksource/exynos_mct.c
++++ b/drivers/clocksource/exynos_mct.c
+@@ -388,6 +388,13 @@ static void exynos4_mct_tick_start(unsigned long cycles,
+       exynos4_mct_write(tmp, mevt->base + MCT_L_TCON_OFFSET);
+ }
+ 
++static void exynos4_mct_tick_clear(struct mct_clock_event_device *mevt)
++{
++      /* Clear the MCT tick interrupt */
++      if (readl_relaxed(reg_base + mevt->base + MCT_L_INT_CSTAT_OFFSET) & 1)
++              exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET);
++}
++
+ static int exynos4_tick_set_next_event(unsigned long cycles,
+                                      struct clock_event_device *evt)
+ {
+@@ -404,6 +411,7 @@ static int set_state_shutdown(struct clock_event_device 
*evt)
+ 
+       mevt = container_of(evt, struct mct_clock_event_device, evt);
+       exynos4_mct_tick_stop(mevt);
++      exynos4_mct_tick_clear(mevt);
+       return 0;
+ }
+ 
+@@ -420,8 +428,11 @@ static int set_state_periodic(struct clock_event_device 
*evt)
+       return 0;
+ }
+ 
+-static void exynos4_mct_tick_clear(struct mct_clock_event_device *mevt)
++static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
+ {
++      struct mct_clock_event_device *mevt = dev_id;
++      struct clock_event_device *evt = &mevt->evt;
++
+       /*
+        * This is for supporting oneshot mode.
+        * Mct would generate interrupt periodically
+@@ -430,16 +441,6 @@ static void exynos4_mct_tick_clear(struct 
mct_clock_event_device *mevt)
+       if (!clockevent_state_periodic(&mevt->evt))
+               exynos4_mct_tick_stop(mevt);
+ 
+-      /* Clear the MCT tick interrupt */
+-      if (readl_relaxed(reg_base + mevt->base + MCT_L_INT_CSTAT_OFFSET) & 1)
+-              exynos4_mct_write(0x1, mevt->base + MCT_L_INT_CSTAT_OFFSET);
+-}
+-
+-static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
+-{
+-      struct mct_clock_event_device *mevt = dev_id;
+-      struct clock_event_device *evt = &mevt->evt;
+-
+       exynos4_mct_tick_clear(mevt);
+ 
+       evt->event_handler(evt);
+diff --git a/drivers/cpufreq/pxa2xx-cpufreq.c 
b/drivers/cpufreq/pxa2xx-cpufreq.c
+index ce345bf34d5d..a24e9f037865 100644
+--- a/drivers/cpufreq/pxa2xx-cpufreq.c
++++ b/drivers/cpufreq/pxa2xx-cpufreq.c
+@@ -192,7 +192,7 @@ static int pxa_cpufreq_change_voltage(const struct 
pxa_freqs *pxa_freq)
+       return ret;
+ }
+ 
+-static void __init pxa_cpufreq_init_voltages(void)
++static void pxa_cpufreq_init_voltages(void)
+ {
+       vcc_core = regulator_get(NULL, "vcc_core");
+       if (IS_ERR(vcc_core)) {
+@@ -208,7 +208,7 @@ static int pxa_cpufreq_change_voltage(const struct 
pxa_freqs *pxa_freq)
+       return 0;
+ }
+ 
+-static void __init pxa_cpufreq_init_voltages(void) { }
++static void pxa_cpufreq_init_voltages(void) { }
+ #endif
+ 
+ static void find_freq_tables(struct cpufreq_frequency_table **freq_table,
+diff --git a/drivers/cpufreq/tegra124-cpufreq.c 
b/drivers/cpufreq/tegra124-cpufreq.c
+index 43530254201a..4bb154f6c54c 100644
+--- a/drivers/cpufreq/tegra124-cpufreq.c
++++ b/drivers/cpufreq/tegra124-cpufreq.c
+@@ -134,6 +134,8 @@ static int tegra124_cpufreq_probe(struct platform_device 
*pdev)
+ 
+       platform_set_drvdata(pdev, priv);
+ 
++      of_node_put(np);
++
+       return 0;
+ 
+ out_switch_to_pllx:
+diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c
+index 0d743c634f25..88caca3370f2 100644
+--- a/drivers/crypto/caam/caamalg.c
++++ b/drivers/crypto/caam/caamalg.c
+@@ -2131,6 +2131,7 @@ static void init_aead_job(struct aead_request *req,
+       if (unlikely(req->src != req->dst)) {
+               if (!edesc->dst_nents) {
+                       dst_dma = sg_dma_address(req->dst);
++                      out_options = 0;
+               } else {
+                       dst_dma = edesc->sec4_sg_dma +
+                                 sec4_sg_index *
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
+index 6509031098d5..26c4befcd234 100644
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -1600,7 +1600,8 @@ __vma_matches(struct vm_area_struct *vma, struct file 
*filp,
+       if (vma->vm_file != filp)
+               return false;
+ 
+-      return vma->vm_start == addr && (vma->vm_end - vma->vm_start) == size;
++      return vma->vm_start == addr &&
++             (vma->vm_end - vma->vm_start) == PAGE_ALIGN(size);
+ }
+ 
+ /**
+diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c 
b/drivers/gpu/drm/radeon/evergreen_cs.c
+index d960d3915408..f09388e00523 100644
+--- a/drivers/gpu/drm/radeon/evergreen_cs.c
++++ b/drivers/gpu/drm/radeon/evergreen_cs.c
+@@ -1299,6 +1299,7 @@ static int evergreen_cs_handle_reg(struct 
radeon_cs_parser *p, u32 reg, u32 idx)
+                       return -EINVAL;
+               }
+               ib[idx] += (u32)((reloc->gpu_offset >> 8) & 0xffffffff);
++              break;
+       case CB_TARGET_MASK:
+               track->cb_target_mask = radeon_get_ib_value(p, idx);
+               track->cb_dirty = true;
+diff --git a/drivers/gpu/ipu-v3/ipu-common.c b/drivers/gpu/ipu-v3/ipu-common.c
+index 99c813a4ec1f..57d22bc963b5 100644
+--- a/drivers/gpu/ipu-v3/ipu-common.c
++++ b/drivers/gpu/ipu-v3/ipu-common.c
+@@ -884,8 +884,8 @@ static struct ipu_devtype ipu_type_imx51 = {
+       .cpmem_ofs = 0x1f000000,
+       .srm_ofs = 0x1f040000,
+       .tpm_ofs = 0x1f060000,
+-      .csi0_ofs = 0x1f030000,
+-      .csi1_ofs = 0x1f038000,
++      .csi0_ofs = 0x1e030000,
++      .csi1_ofs = 0x1e038000,
+       .ic_ofs = 0x1e020000,
+       .disp0_ofs = 0x1e040000,
+       .disp1_ofs = 0x1e048000,
+@@ -900,8 +900,8 @@ static struct ipu_devtype ipu_type_imx53 = {
+       .cpmem_ofs = 0x07000000,
+       .srm_ofs = 0x07040000,
+       .tpm_ofs = 0x07060000,
+-      .csi0_ofs = 0x07030000,
+-      .csi1_ofs = 0x07038000,
++      .csi0_ofs = 0x06030000,
++      .csi1_ofs = 0x06038000,
+       .ic_ofs = 0x06020000,
+       .disp0_ofs = 0x06040000,
+       .disp1_ofs = 0x06048000,
+diff --git a/drivers/hwtracing/intel_th/gth.c 
b/drivers/hwtracing/intel_th/gth.c
+index 33e09369a491..b0502e2782c1 100644
+--- a/drivers/hwtracing/intel_th/gth.c
++++ b/drivers/hwtracing/intel_th/gth.c
+@@ -599,11 +599,15 @@ static void intel_th_gth_unassign(struct intel_th_device 
*thdev,
+ {
+       struct gth_device *gth = dev_get_drvdata(&thdev->dev);
+       int port = othdev->output.port;
++      int master;
+ 
+       spin_lock(&gth->gth_lock);
+       othdev->output.port = -1;
+       othdev->output.active = false;
+       gth->output[port].output = NULL;
++      for (master = 0; master < TH_CONFIGURABLE_MASTERS; master++)
++              if (gth->master[master] == port)
++                      gth->master[master] = -1;
+       spin_unlock(&gth->gth_lock);
+ }
+ 
+diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c
+index c38645106783..3c45c1c15f7e 100644
+--- a/drivers/hwtracing/stm/core.c
++++ b/drivers/hwtracing/stm/core.c
+@@ -252,6 +252,9 @@ static int find_free_channels(unsigned long *bitmap, 
unsigned int start,
+                       ;
+               if (i == width)
+                       return pos;
++
++              /* step over [pos..pos+i) to continue search */
++              pos += i;
+       }
+ 
+       return -1;
+@@ -558,7 +561,7 @@ static int stm_char_policy_set_ioctl(struct stm_file 
*stmf, void __user *arg)
+ {
+       struct stm_device *stm = stmf->stm;
+       struct stp_policy_id *id;
+-      int ret = -EINVAL;
++      int ret = -EINVAL, wlimit = 1;
+       u32 size;
+ 
+       if (stmf->output.nr_chans)
+@@ -586,8 +589,10 @@ static int stm_char_policy_set_ioctl(struct stm_file 
*stmf, void __user *arg)
+       if (id->__reserved_0 || id->__reserved_1)
+               goto err_free;
+ 
+-      if (id->width < 1 ||
+-          id->width > PAGE_SIZE / stm->data->sw_mmiosz)
++      if (stm->data->sw_mmiosz)
++              wlimit = PAGE_SIZE / stm->data->sw_mmiosz;
++
++      if (id->width < 1 || id->width > wlimit)
+               goto err_free;
+ 
+       ret = stm_file_assign(stmf, id->id, id->width);
+diff --git a/drivers/i2c/busses/i2c-cadence.c 
b/drivers/i2c/busses/i2c-cadence.c
+index 45d6771fac8c..59c08d5b75d6 100644
+--- a/drivers/i2c/busses/i2c-cadence.c
++++ b/drivers/i2c/busses/i2c-cadence.c
+@@ -382,8 +382,10 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id)
+        * Check for the message size against FIFO depth and set the
+        * 'hold bus' bit if it is greater than FIFO depth.
+        */
+-      if (id->recv_count > CDNS_I2C_FIFO_DEPTH)
++      if ((id->recv_count > CDNS_I2C_FIFO_DEPTH)  || id->bus_hold_flag)
+               ctrl_reg |= CDNS_I2C_CR_HOLD;
++      else
++              ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD;
+ 
+       cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET);
+ 
+@@ -440,8 +442,11 @@ static void cdns_i2c_msend(struct cdns_i2c *id)
+        * Check for the message size against FIFO depth and set the
+        * 'hold bus' bit if it is greater than FIFO depth.
+        */
+-      if (id->send_count > CDNS_I2C_FIFO_DEPTH)
++      if ((id->send_count > CDNS_I2C_FIFO_DEPTH) || id->bus_hold_flag)
+               ctrl_reg |= CDNS_I2C_CR_HOLD;
++      else
++              ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD;
++
+       cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET);
+ 
+       /* Clear the interrupts in interrupt status register. */
+diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
+index 586e557e113a..36100f453f31 100644
+--- a/drivers/i2c/busses/i2c-tegra.c
++++ b/drivers/i2c/busses/i2c-tegra.c
+@@ -794,7 +794,7 @@ static const struct i2c_algorithm tegra_i2c_algo = {
+ /* payload size is only 12 bit */
+ static struct i2c_adapter_quirks tegra_i2c_quirks = {
+       .max_read_len = 4096,
+-      .max_write_len = 4096,
++      .max_write_len = 4096 - 12,
+ };
+ 
+ static const struct tegra_i2c_hw_feature tegra20_i2c_hw = {
+diff --git a/drivers/iio/adc/exynos_adc.c b/drivers/iio/adc/exynos_adc.c
+index c15756d7bf7f..eb8b735ca12b 100644
+--- a/drivers/iio/adc/exynos_adc.c
++++ b/drivers/iio/adc/exynos_adc.c
+@@ -916,7 +916,7 @@ static int exynos_adc_remove(struct platform_device *pdev)
+       struct iio_dev *indio_dev = platform_get_drvdata(pdev);
+       struct exynos_adc *info = iio_priv(indio_dev);
+ 
+-      if (IS_REACHABLE(CONFIG_INPUT)) {
++      if (IS_REACHABLE(CONFIG_INPUT) && info->input) {
+               free_irq(info->tsirq, info);
+               input_unregister_device(info->input);
+       }
+diff --git a/drivers/input/keyboard/cap11xx.c 
b/drivers/input/keyboard/cap11xx.c
+index 4401be225d64..3c53aa5d5c0c 100644
+--- a/drivers/input/keyboard/cap11xx.c
++++ b/drivers/input/keyboard/cap11xx.c
+@@ -75,9 +75,7 @@
+ struct cap11xx_led {
+       struct cap11xx_priv *priv;
+       struct led_classdev cdev;
+-      struct work_struct work;
+       u32 reg;
+-      enum led_brightness new_brightness;
+ };
+ #endif
+ 
+@@ -233,30 +231,21 @@ static void cap11xx_input_close(struct input_dev *idev)
+ }
+ 
+ #ifdef CONFIG_LEDS_CLASS
+-static void cap11xx_led_work(struct work_struct *work)
++static int cap11xx_led_set(struct led_classdev *cdev,
++                          enum led_brightness value)
+ {
+-      struct cap11xx_led *led = container_of(work, struct cap11xx_led, work);
++      struct cap11xx_led *led = container_of(cdev, struct cap11xx_led, cdev);
+       struct cap11xx_priv *priv = led->priv;
+-      int value = led->new_brightness;
+ 
+       /*
+-       * All LEDs share the same duty cycle as this is a HW limitation.
+-       * Brightness levels per LED are either 0 (OFF) and 1 (ON).
++       * All LEDs share the same duty cycle as this is a HW
++       * limitation. Brightness levels per LED are either
++       * 0 (OFF) and 1 (ON).
+        */
+-      regmap_update_bits(priv->regmap, CAP11XX_REG_LED_OUTPUT_CONTROL,
+-                              BIT(led->reg), value ? BIT(led->reg) : 0);
+-}
+-
+-static void cap11xx_led_set(struct led_classdev *cdev,
+-                         enum led_brightness value)
+-{
+-      struct cap11xx_led *led = container_of(cdev, struct cap11xx_led, cdev);
+-
+-      if (led->new_brightness == value)
+-              return;
+-
+-      led->new_brightness = value;
+-      schedule_work(&led->work);
++      return regmap_update_bits(priv->regmap,
++                                CAP11XX_REG_LED_OUTPUT_CONTROL,
++                                BIT(led->reg),
++                                value ? BIT(led->reg) : 0);
+ }
+ 
+ static int cap11xx_init_leds(struct device *dev,
+@@ -299,7 +288,7 @@ static int cap11xx_init_leds(struct device *dev,
+               led->cdev.default_trigger =
+                       of_get_property(child, "linux,default-trigger", NULL);
+               led->cdev.flags = 0;
+-              led->cdev.brightness_set = cap11xx_led_set;
++              led->cdev.brightness_set_blocking = cap11xx_led_set;
+               led->cdev.max_brightness = 1;
+               led->cdev.brightness = LED_OFF;
+ 
+@@ -312,8 +301,6 @@ static int cap11xx_init_leds(struct device *dev,
+               led->reg = reg;
+               led->priv = priv;
+ 
+-              INIT_WORK(&led->work, cap11xx_led_work);
+-
+               error = devm_led_classdev_register(dev, &led->cdev);
+               if (error) {
+                       of_node_put(child);
+diff --git a/drivers/input/keyboard/matrix_keypad.c 
b/drivers/input/keyboard/matrix_keypad.c
+index c64d87442a62..2e12e31f45c5 100644
+--- a/drivers/input/keyboard/matrix_keypad.c
++++ b/drivers/input/keyboard/matrix_keypad.c
+@@ -220,7 +220,7 @@ static void matrix_keypad_stop(struct input_dev *dev)
+       keypad->stopped = true;
+       spin_unlock_irq(&keypad->lock);
+ 
+-      flush_work(&keypad->work.work);
++      flush_delayed_work(&keypad->work);
+       /*
+        * matrix_keypad_scan() will leave IRQs enabled;
+        * we should disable them now.
+diff --git a/drivers/input/keyboard/st-keyscan.c 
b/drivers/input/keyboard/st-keyscan.c
+index de7be4f03d91..ebf9f643d910 100644
+--- a/drivers/input/keyboard/st-keyscan.c
++++ b/drivers/input/keyboard/st-keyscan.c
+@@ -153,6 +153,8 @@ static int keyscan_probe(struct platform_device *pdev)
+ 
+       input_dev->id.bustype = BUS_HOST;
+ 
++      keypad_data->input_dev = input_dev;
++
+       error = keypad_matrix_key_parse_dt(keypad_data);
+       if (error)
+               return error;
+@@ -168,8 +170,6 @@ static int keyscan_probe(struct platform_device *pdev)
+ 
+       input_set_drvdata(input_dev, keypad_data);
+ 
+-      keypad_data->input_dev = input_dev;
+-
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       keypad_data->base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(keypad_data->base))
+diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h
+index cdf8d253209e..6fb6dd600970 100644
+--- a/drivers/md/bcache/writeback.h
++++ b/drivers/md/bcache/writeback.h
+@@ -68,6 +68,9 @@ static inline bool should_writeback(struct cached_dev *dc, 
struct bio *bio,
+           in_use > CUTOFF_WRITEBACK_SYNC)
+               return false;
+ 
++      if (bio_op(bio) == REQ_OP_DISCARD)
++              return false;
++
+       if (dc->partial_stripes_expensive &&
+           bcache_dev_stripe_dirty(dc, bio->bi_iter.bi_sector,
+                                   bio_sectors(bio)))
+diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
+index 67414616eb35..717787d09e0f 100644
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -3798,6 +3798,8 @@ static int raid10_run(struct mddev *mddev)
+               set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
+               mddev->sync_thread = md_register_thread(md_do_sync, mddev,
+                                                       "reshape");
++              if (!mddev->sync_thread)
++                      goto out_free_conf;
+       }
+ 
+       return 0;
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 4afc419da60f..9ec74dfe94f4 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -6977,6 +6977,8 @@ static int raid5_run(struct mddev *mddev)
+               set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
+               mddev->sync_thread = md_register_thread(md_do_sync, mddev,
+                                                       "reshape");
++              if (!mddev->sync_thread)
++                      goto abort;
+       }
+ 
+       /* Ok, everything is just fine now */
+diff --git a/drivers/media/usb/uvc/uvc_video.c 
b/drivers/media/usb/uvc/uvc_video.c
+index 48503f30b3a2..dcca723f7155 100644
+--- a/drivers/media/usb/uvc/uvc_video.c
++++ b/drivers/media/usb/uvc/uvc_video.c
+@@ -638,6 +638,14 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
+       if (!uvc_hw_timestamps_param)
+               return;
+ 
++      /*
++       * We will get called from __vb2_queue_cancel() if there are buffers
++       * done but not dequeued by the user, but the sample array has already
++       * been released at that time. Just bail out in that case.
++       */
++      if (!clock->samples)
++              return;
++
+       spin_lock_irqsave(&clock->lock, flags);
+ 
+       if (clock->count < clock->size)
+diff --git a/drivers/media/v4l2-core/videobuf2-v4l2.c 
b/drivers/media/v4l2-core/videobuf2-v4l2.c
+index 52ef8833f6b6..7e45da4d52e1 100644
+--- a/drivers/media/v4l2-core/videobuf2-v4l2.c
++++ b/drivers/media/v4l2-core/videobuf2-v4l2.c
+@@ -146,7 +146,6 @@ static void vb2_warn_zero_bytesused(struct vb2_buffer *vb)
+               return;
+ 
+       check_once = true;
+-      WARN_ON(1);
+ 
+       pr_warn("use of bytesused == 0 is deprecated and will be removed in the 
future,\n");
+       if (vb->vb2_queue->allow_zero_bytesused)
+diff --git a/drivers/net/ethernet/atheros/atlx/atl2.c 
b/drivers/net/ethernet/atheros/atlx/atl2.c
+index 2ff465848b65..097a0bf592ab 100644
+--- a/drivers/net/ethernet/atheros/atlx/atl2.c
++++ b/drivers/net/ethernet/atheros/atlx/atl2.c
+@@ -1338,13 +1338,11 @@ static int atl2_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
+ {
+       struct net_device *netdev;
+       struct atl2_adapter *adapter;
+-      static int cards_found;
++      static int cards_found = 0;
+       unsigned long mmio_start;
+       int mmio_len;
+       int err;
+ 
+-      cards_found = 0;
+-
+       err = pci_enable_device(pdev);
+       if (err)
+               return err;
+diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c 
b/drivers/net/ethernet/broadcom/bcmsysport.c
+index 53a506b0d790..95874c10c23b 100644
+--- a/drivers/net/ethernet/broadcom/bcmsysport.c
++++ b/drivers/net/ethernet/broadcom/bcmsysport.c
+@@ -104,6 +104,10 @@ static int bcm_sysport_set_rx_csum(struct net_device *dev,
+ 
+       priv->rx_chk_en = !!(wanted & NETIF_F_RXCSUM);
+       reg = rxchk_readl(priv, RXCHK_CONTROL);
++      /* Clear L2 header checks, which would prevent BPDUs
++       * from being received.
++       */
++      reg &= ~RXCHK_L2_HDR_DIS;
+       if (priv->rx_chk_en)
+               reg |= RXCHK_EN;
+       else
+diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c 
b/drivers/net/ethernet/cavium/thunder/nic_main.c
+index da142f6bd0c3..18ddd243dfa1 100644
+--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
++++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
+@@ -999,7 +999,7 @@ static void nic_handle_mbx_intr(struct nicpf *nic, int vf)
+       case NIC_MBOX_MSG_CFG_DONE:
+               /* Last message of VF config msg sequence */
+               nic_enable_vf(nic, vf, true);
+-              goto unlock;
++              break;
+       case NIC_MBOX_MSG_SHUTDOWN:
+               /* First msg in VF teardown sequence */
+               if (vf >= nic->num_vf_en)
+diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+index c75d4ea9342b..71f228cece03 100644
+--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
++++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+@@ -162,6 +162,17 @@ static int nicvf_check_pf_ready(struct nicvf *nic)
+       return 1;
+ }
+ 
++static void nicvf_send_cfg_done(struct nicvf *nic)
++{
++      union nic_mbx mbx = {};
++
++      mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
++      if (nicvf_send_msg_to_pf(nic, &mbx)) {
++              netdev_err(nic->netdev,
++                         "PF didn't respond to CFG DONE msg\n");
++      }
++}
++
+ static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx)
+ {
+       if (bgx->rx)
+@@ -1178,7 +1189,6 @@ int nicvf_open(struct net_device *netdev)
+       struct nicvf *nic = netdev_priv(netdev);
+       struct queue_set *qs = nic->qs;
+       struct nicvf_cq_poll *cq_poll = NULL;
+-      union nic_mbx mbx = {};
+ 
+       netif_carrier_off(netdev);
+ 
+@@ -1267,8 +1277,7 @@ int nicvf_open(struct net_device *netdev)
+               nicvf_enable_intr(nic, NICVF_INTR_RBDR, qidx);
+ 
+       /* Send VF config done msg to PF */
+-      mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
+-      nicvf_write_to_mbx(nic, &mbx);
++      nicvf_send_cfg_done(nic);
+ 
+       return 0;
+ cleanup:
+diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c 
b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+index 5bb019d49409..551b2a9ebf0f 100644
+--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
++++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+@@ -2820,6 +2820,7 @@ int hns_dsaf_roce_reset(struct fwnode_handle 
*dsaf_fwnode, bool dereset)
+       dsaf_dev = dev_get_drvdata(&pdev->dev);
+       if (!dsaf_dev) {
+               dev_err(&pdev->dev, "dsaf_dev is NULL\n");
++              put_device(&pdev->dev);
+               return -ENODEV;
+       }
+ 
+@@ -2827,6 +2828,7 @@ int hns_dsaf_roce_reset(struct fwnode_handle 
*dsaf_fwnode, bool dereset)
+       if (AE_IS_VER1(dsaf_dev->dsaf_ver)) {
+               dev_err(dsaf_dev->dev, "%s v1 chip doesn't support RoCE!\n",
+                       dsaf_dev->ae_dev.name);
++              put_device(&pdev->dev);
+               return -ENODEV;
+       }
+ 
+diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c 
b/drivers/net/ethernet/marvell/mv643xx_eth.c
+index 5b12022adf1f..526d07e02bbc 100644
+--- a/drivers/net/ethernet/marvell/mv643xx_eth.c
++++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
+@@ -2886,7 +2886,7 @@ static int mv643xx_eth_shared_probe(struct 
platform_device *pdev)
+ 
+       ret = mv643xx_eth_shared_of_probe(pdev);
+       if (ret)
+-              return ret;
++              goto err_put_clk;
+       pd = dev_get_platdata(&pdev->dev);
+ 
+       msp->tx_csum_limit = (pd != NULL && pd->tx_csum_limit) ?
+@@ -2894,6 +2894,11 @@ static int mv643xx_eth_shared_probe(struct 
platform_device *pdev)
+       infer_hw_params(msp);
+ 
+       return 0;
++
++err_put_clk:
++      if (!IS_ERR(msp->clk))
++              clk_disable_unprepare(msp->clk);
++      return ret;
+ }
+ 
+ static int mv643xx_eth_shared_remove(struct platform_device *pdev)
+diff --git a/drivers/net/ethernet/marvell/mvneta.c 
b/drivers/net/ethernet/marvell/mvneta.c
+index c92ffdf91065..d98b874a7238 100644
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -2050,7 +2050,7 @@ err_drop_frame:
+                       if (unlikely(!skb))
+                               goto err_drop_frame_ret_pool;
+ 
+-                      dma_sync_single_range_for_cpu(dev->dev.parent,
++                      dma_sync_single_range_for_cpu(&pp->bm_priv->pdev->dev,
+                                                     rx_desc->buf_phys_addr,
+                                                     MVNETA_MH_SIZE + 
NET_SKB_PAD,
+                                                     rx_bytes,
+diff --git a/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c 
b/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
+index f8df5300f49c..73087770d72f 100644
+--- a/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
++++ b/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
+@@ -756,15 +756,10 @@ wrp_alu64_reg(struct nfp_prog *nfp_prog, struct 
nfp_insn_meta *meta,
+ 
+ static int
+ wrp_alu32_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
+-            enum alu_op alu_op, bool skip)
++            enum alu_op alu_op)
+ {
+       const struct bpf_insn *insn = &meta->insn;
+ 
+-      if (skip) {
+-              meta->skip = true;
+-              return 0;
+-      }
+-
+       wrp_alu_imm(nfp_prog, insn->dst_reg * 2, alu_op, insn->imm);
+       wrp_immed(nfp_prog, reg_both(insn->dst_reg * 2 + 1), 0);
+ 
+@@ -1017,7 +1012,7 @@ static int xor_reg(struct nfp_prog *nfp_prog, struct 
nfp_insn_meta *meta)
+ 
+ static int xor_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+ {
+-      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR, !~meta->insn.imm);
++      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_XOR);
+ }
+ 
+ static int and_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+@@ -1027,7 +1022,7 @@ static int and_reg(struct nfp_prog *nfp_prog, struct 
nfp_insn_meta *meta)
+ 
+ static int and_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+ {
+-      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND, !~meta->insn.imm);
++      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_AND);
+ }
+ 
+ static int or_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+@@ -1037,7 +1032,7 @@ static int or_reg(struct nfp_prog *nfp_prog, struct 
nfp_insn_meta *meta)
+ 
+ static int or_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+ {
+-      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR, !meta->insn.imm);
++      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_OR);
+ }
+ 
+ static int add_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+@@ -1047,7 +1042,7 @@ static int add_reg(struct nfp_prog *nfp_prog, struct 
nfp_insn_meta *meta)
+ 
+ static int add_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+ {
+-      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD, !meta->insn.imm);
++      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_ADD);
+ }
+ 
+ static int sub_reg(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+@@ -1057,7 +1052,7 @@ static int sub_reg(struct nfp_prog *nfp_prog, struct 
nfp_insn_meta *meta)
+ 
+ static int sub_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+ {
+-      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB, !meta->insn.imm);
++      return wrp_alu32_imm(nfp_prog, meta, ALU_OP_SUB);
+ }
+ 
+ static int shl_imm(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 134eb184fa22..16e5c8cd104d 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -895,8 +895,8 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x114f, 0x68a2, 8)},    /* Sierra Wireless MC7750 */
+       {QMI_FIXED_INTF(0x1199, 0x68a2, 8)},    /* Sierra Wireless MC7710 in 
QMI mode */
+       {QMI_FIXED_INTF(0x1199, 0x68a2, 19)},   /* Sierra Wireless MC7710 in 
QMI mode */
+-      {QMI_FIXED_INTF(0x1199, 0x68c0, 8)},    /* Sierra Wireless 
MC7304/MC7354 */
+-      {QMI_FIXED_INTF(0x1199, 0x68c0, 10)},   /* Sierra Wireless 
MC7304/MC7354 */
++      {QMI_QUIRK_SET_DTR(0x1199, 0x68c0, 8)}, /* Sierra Wireless 
MC7304/MC7354, WP76xx */
++      {QMI_QUIRK_SET_DTR(0x1199, 0x68c0, 10)},/* Sierra Wireless 
MC7304/MC7354 */
+       {QMI_FIXED_INTF(0x1199, 0x901c, 8)},    /* Sierra Wireless EM7700 */
+       {QMI_FIXED_INTF(0x1199, 0x901f, 8)},    /* Sierra Wireless EM7355 */
+       {QMI_FIXED_INTF(0x1199, 0x9041, 8)},    /* Sierra Wireless 
MC7305/MC7355 */
+diff --git a/drivers/net/wireless/mac80211_hwsim.c 
b/drivers/net/wireless/mac80211_hwsim.c
+index 780acf23fd19..e9ec1da9935d 100644
+--- a/drivers/net/wireless/mac80211_hwsim.c
++++ b/drivers/net/wireless/mac80211_hwsim.c
+@@ -3167,7 +3167,7 @@ static int hwsim_get_radio_nl(struct sk_buff *msg, 
struct genl_info *info)
+                       goto out_err;
+               }
+ 
+-              genlmsg_reply(skb, info);
++              res = genlmsg_reply(skb, info);
+               break;
+       }
+ 
+diff --git a/drivers/net/wireless/marvell/libertas_tf/if_usb.c 
b/drivers/net/wireless/marvell/libertas_tf/if_usb.c
+index e0ade40d9497..4b539209999b 100644
+--- a/drivers/net/wireless/marvell/libertas_tf/if_usb.c
++++ b/drivers/net/wireless/marvell/libertas_tf/if_usb.c
+@@ -433,8 +433,6 @@ static int __if_usb_submit_rx_urb(struct if_usb_card 
*cardp,
+                         skb_tail_pointer(skb),
+                         MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp);
+ 
+-      cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
+-
+       lbtf_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n",
+               cardp->rx_urb);
+       ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC);
+diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
+index d8d189d14834..66a089d561cf 100644
+--- a/drivers/nvdimm/label.c
++++ b/drivers/nvdimm/label.c
+@@ -492,7 +492,7 @@ static unsigned long nd_label_offset(struct nvdimm_drvdata 
*ndd,
+ 
+ static int __pmem_label_update(struct nd_region *nd_region,
+               struct nd_mapping *nd_mapping, struct nd_namespace_pmem *nspm,
+-              int pos)
++              int pos, unsigned long flags)
+ {
+       u64 cookie = nd_region_interleave_set_cookie(nd_region);
+       struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
+@@ -530,7 +530,7 @@ static int __pmem_label_update(struct nd_region *nd_region,
+       memcpy(nd_label->uuid, nspm->uuid, NSLABEL_UUID_LEN);
+       if (nspm->alt_name)
+               memcpy(nd_label->name, nspm->alt_name, NSLABEL_NAME_LEN);
+-      nd_label->flags = __cpu_to_le32(NSLABEL_FLAG_UPDATING);
++      nd_label->flags = __cpu_to_le32(flags);
+       nd_label->nlabel = __cpu_to_le16(nd_region->ndr_mappings);
+       nd_label->position = __cpu_to_le16(pos);
+       nd_label->isetcookie = __cpu_to_le64(cookie);
+@@ -922,13 +922,13 @@ static int del_labels(struct nd_mapping *nd_mapping, u8 
*uuid)
+ int nd_pmem_namespace_label_update(struct nd_region *nd_region,
+               struct nd_namespace_pmem *nspm, resource_size_t size)
+ {
+-      int i;
++      int i, rc;
+ 
+       for (i = 0; i < nd_region->ndr_mappings; i++) {
+               struct nd_mapping *nd_mapping = &nd_region->mapping[i];
+               struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
+               struct resource *res;
+-              int rc, count = 0;
++              int count = 0;
+ 
+               if (size == 0) {
+                       rc = del_labels(nd_mapping, nspm->uuid);
+@@ -946,7 +946,20 @@ int nd_pmem_namespace_label_update(struct nd_region 
*nd_region,
+               if (rc < 0)
+                       return rc;
+ 
+-              rc = __pmem_label_update(nd_region, nd_mapping, nspm, i);
++              rc = __pmem_label_update(nd_region, nd_mapping, nspm, i,
++                              NSLABEL_FLAG_UPDATING);
++              if (rc)
++                      return rc;
++      }
++
++      if (size == 0)
++              return 0;
++
++      /* Clear the UPDATING flag per UEFI 2.7 expectations */
++      for (i = 0; i < nd_region->ndr_mappings; i++) {
++              struct nd_mapping *nd_mapping = &nd_region->mapping[i];
++
++              rc = __pmem_label_update(nd_region, nd_mapping, nspm, i, 0);
+               if (rc)
+                       return rc;
+       }
+diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
+index 74257ac92490..9bc5f555ee68 100644
+--- a/drivers/nvdimm/namespace_devs.c
++++ b/drivers/nvdimm/namespace_devs.c
+@@ -138,6 +138,7 @@ bool nd_is_uuid_unique(struct device *dev, u8 *uuid)
+ bool pmem_should_map_pages(struct device *dev)
+ {
+       struct nd_region *nd_region = to_nd_region(dev->parent);
++      struct nd_namespace_common *ndns = to_ndns(dev);
+       struct nd_namespace_io *nsio;
+ 
+       if (!IS_ENABLED(CONFIG_ZONE_DEVICE))
+@@ -149,6 +150,9 @@ bool pmem_should_map_pages(struct device *dev)
+       if (is_nd_pfn(dev) || is_nd_btt(dev))
+               return false;
+ 
++      if (ndns->force_raw)
++              return false;
++
+       nsio = to_nd_namespace_io(dev);
+       if (region_intersects(nsio->res.start, resource_size(&nsio->res),
+                               IORESOURCE_SYSTEM_RAM,
+diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c
+index d6aa59ca68b9..ba9aa8475e6d 100644
+--- a/drivers/nvdimm/pfn_devs.c
++++ b/drivers/nvdimm/pfn_devs.c
+@@ -515,7 +515,7 @@ static unsigned long init_altmap_base(resource_size_t base)
+ 
+ static unsigned long init_altmap_reserve(resource_size_t base)
+ {
+-      unsigned long reserve = PHYS_PFN(SZ_8K);
++      unsigned long reserve = PFN_UP(SZ_8K);
+       unsigned long base_pfn = PHYS_PFN(base);
+ 
+       reserve += base_pfn - PFN_SECTION_ALIGN_DOWN(base_pfn);
+diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c
+index bdce0679674c..02e6485c1ed5 100644
+--- a/drivers/parport/parport_pc.c
++++ b/drivers/parport/parport_pc.c
+@@ -1377,7 +1377,7 @@ static struct superio_struct *find_superio(struct 
parport *p)
+ {
+       int i;
+       for (i = 0; i < NR_SUPERIOS; i++)
+-              if (superios[i].io != p->base)
++              if (superios[i].io == p->base)
+                       return &superios[i];
+       return NULL;
+ }
+diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c 
b/drivers/pinctrl/meson/pinctrl-meson8b.c
+index cbe5f5cbddb8..e1b689f840ab 100644
+--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
++++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
+@@ -662,7 +662,7 @@ static const char * const sd_a_groups[] = {
+ 
+ static const char * const sdxc_a_groups[] = {
+       "sdxc_d0_0_a", "sdxc_d13_0_a", "sdxc_d47_a", "sdxc_clk_a",
+-      "sdxc_cmd_a", "sdxc_d0_1_a", "sdxc_d0_13_1_a"
++      "sdxc_cmd_a", "sdxc_d0_1_a", "sdxc_d13_1_a"
+ };
+ 
+ static const char * const pcm_a_groups[] = {
+diff --git a/drivers/regulator/s2mpa01.c b/drivers/regulator/s2mpa01.c
+index 92f88753bfed..2daf751c26c7 100644
+--- a/drivers/regulator/s2mpa01.c
++++ b/drivers/regulator/s2mpa01.c
+@@ -303,13 +303,13 @@ static const struct regulator_desc regulators[] = {
+       regulator_desc_ldo(2, STEP_50_MV),
+       regulator_desc_ldo(3, STEP_50_MV),
+       regulator_desc_ldo(4, STEP_50_MV),
+-      regulator_desc_ldo(5, STEP_50_MV),
++      regulator_desc_ldo(5, STEP_25_MV),
+       regulator_desc_ldo(6, STEP_25_MV),
+       regulator_desc_ldo(7, STEP_50_MV),
+       regulator_desc_ldo(8, STEP_50_MV),
+       regulator_desc_ldo(9, STEP_50_MV),
+       regulator_desc_ldo(10, STEP_50_MV),
+-      regulator_desc_ldo(11, STEP_25_MV),
++      regulator_desc_ldo(11, STEP_50_MV),
+       regulator_desc_ldo(12, STEP_50_MV),
+       regulator_desc_ldo(13, STEP_50_MV),
+       regulator_desc_ldo(14, STEP_50_MV),
+@@ -320,11 +320,11 @@ static const struct regulator_desc regulators[] = {
+       regulator_desc_ldo(19, STEP_50_MV),
+       regulator_desc_ldo(20, STEP_50_MV),
+       regulator_desc_ldo(21, STEP_50_MV),
+-      regulator_desc_ldo(22, STEP_25_MV),
+-      regulator_desc_ldo(23, STEP_25_MV),
++      regulator_desc_ldo(22, STEP_50_MV),
++      regulator_desc_ldo(23, STEP_50_MV),
+       regulator_desc_ldo(24, STEP_50_MV),
+       regulator_desc_ldo(25, STEP_50_MV),
+-      regulator_desc_ldo(26, STEP_50_MV),
++      regulator_desc_ldo(26, STEP_25_MV),
+       regulator_desc_buck1_4(1),
+       regulator_desc_buck1_4(2),
+       regulator_desc_buck1_4(3),
+diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
+index d838e77dd947..1fe1c18cc27b 100644
+--- a/drivers/regulator/s2mps11.c
++++ b/drivers/regulator/s2mps11.c
+@@ -376,7 +376,7 @@ static const struct regulator_desc s2mps11_regulators[] = {
+       regulator_desc_s2mps11_ldo(32, STEP_50_MV),
+       regulator_desc_s2mps11_ldo(33, STEP_50_MV),
+       regulator_desc_s2mps11_ldo(34, STEP_50_MV),
+-      regulator_desc_s2mps11_ldo(35, STEP_50_MV),
++      regulator_desc_s2mps11_ldo(35, STEP_25_MV),
+       regulator_desc_s2mps11_ldo(36, STEP_50_MV),
+       regulator_desc_s2mps11_ldo(37, STEP_50_MV),
+       regulator_desc_s2mps11_ldo(38, STEP_50_MV),
+@@ -386,8 +386,8 @@ static const struct regulator_desc s2mps11_regulators[] = {
+       regulator_desc_s2mps11_buck1_4(4),
+       regulator_desc_s2mps11_buck5,
+       regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV),
+-      regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_6_25_MV),
+-      regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_6_25_MV),
++      regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_12_5_MV),
++      regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_12_5_MV),
+       regulator_desc_s2mps11_buck9,
+       regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV),
+ };
+diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
+index be17de9807b6..11c6335b1951 100644
+--- a/drivers/s390/block/dasd_eckd.c
++++ b/drivers/s390/block/dasd_eckd.c
+@@ -4508,6 +4508,14 @@ static int dasd_symm_io(struct dasd_device *device, 
void __user *argp)
+               usrparm.psf_data &= 0x7fffffffULL;
+               usrparm.rssd_result &= 0x7fffffffULL;
+       }
++      /* at least 2 bytes are accessed and should be allocated */
++      if (usrparm.psf_data_len < 2) {
++              DBF_DEV_EVENT(DBF_WARNING, device,
++                            "Symmetrix ioctl invalid data length %d",
++                            usrparm.psf_data_len);
++              rc = -EINVAL;
++              goto out;
++      }
+       /* alloc I/O data area */
+       psf_data = kzalloc(usrparm.psf_data_len, GFP_KERNEL | GFP_DMA);
+       rssd_result = kzalloc(usrparm.rssd_result_len, GFP_KERNEL | GFP_DMA);
+diff --git a/drivers/s390/virtio/virtio_ccw.c 
b/drivers/s390/virtio/virtio_ccw.c
+index 3493d449911c..d5e510ff5437 100644
+--- a/drivers/s390/virtio/virtio_ccw.c
++++ b/drivers/s390/virtio/virtio_ccw.c
+@@ -283,6 +283,8 @@ static void virtio_ccw_drop_indicators(struct 
virtio_ccw_device *vcdev)
+ {
+       struct virtio_ccw_vq_info *info;
+ 
++      if (!vcdev->airq_info)
++              return;
+       list_for_each_entry(info, &vcdev->virtqueues, node)
+               drop_airq_indicator(info->vq, vcdev->airq_info);
+ }
+@@ -424,7 +426,7 @@ static int virtio_ccw_read_vq_conf(struct 
virtio_ccw_device *vcdev,
+       ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_READ_VQ_CONF);
+       if (ret)
+               return ret;
+-      return vcdev->config_block->num;
++      return vcdev->config_block->num ?: -ENOENT;
+ }
+ 
+ static void virtio_ccw_del_vq(struct virtqueue *vq, struct ccw1 *ccw)
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index c79743de48f9..2ffe10453e30 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1448,7 +1448,13 @@ static int iscsi_xmit_task(struct iscsi_conn *conn)
+       if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx))
+               return -ENODATA;
+ 
++      spin_lock_bh(&conn->session->back_lock);
++      if (conn->task == NULL) {
++              spin_unlock_bh(&conn->session->back_lock);
++              return -ENODATA;
++      }
+       __iscsi_get_task(task);
++      spin_unlock_bh(&conn->session->back_lock);
+       spin_unlock_bh(&conn->session->frwd_lock);
+       rc = conn->session->tt->xmit_task(task);
+       spin_lock_bh(&conn->session->frwd_lock);
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index 867ae76f93f2..3e9cbba41464 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -2834,6 +2834,55 @@ static void sd_read_write_same(struct scsi_disk *sdkp, 
unsigned char *buffer)
+               sdkp->ws10 = 1;
+ }
+ 
++/*
++ * Determine the device's preferred I/O size for reads and writes
++ * unless the reported value is unreasonably small, large, not a
++ * multiple of the physical block size, or simply garbage.
++ */
++static bool sd_validate_opt_xfer_size(struct scsi_disk *sdkp,
++                                    unsigned int dev_max)
++{
++      struct scsi_device *sdp = sdkp->device;
++      unsigned int opt_xfer_bytes =
++              logical_to_bytes(sdp, sdkp->opt_xfer_blocks);
++
++      if (sdkp->opt_xfer_blocks > dev_max) {
++              sd_first_printk(KERN_WARNING, sdkp,
++                              "Optimal transfer size %u logical blocks " \
++                              "> dev_max (%u logical blocks)\n",
++                              sdkp->opt_xfer_blocks, dev_max);
++              return false;
++      }
++
++      if (sdkp->opt_xfer_blocks > SD_DEF_XFER_BLOCKS) {
++              sd_first_printk(KERN_WARNING, sdkp,
++                              "Optimal transfer size %u logical blocks " \
++                              "> sd driver limit (%u logical blocks)\n",
++                              sdkp->opt_xfer_blocks, SD_DEF_XFER_BLOCKS);
++              return false;
++      }
++
++      if (opt_xfer_bytes < PAGE_SIZE) {
++              sd_first_printk(KERN_WARNING, sdkp,
++                              "Optimal transfer size %u bytes < " \
++                              "PAGE_SIZE (%u bytes)\n",
++                              opt_xfer_bytes, (unsigned int)PAGE_SIZE);
++              return false;
++      }
++
++      if (opt_xfer_bytes & (sdkp->physical_block_size - 1)) {
++              sd_first_printk(KERN_WARNING, sdkp,
++                              "Optimal transfer size %u bytes not a " \
++                              "multiple of physical block size (%u bytes)\n",
++                              opt_xfer_bytes, sdkp->physical_block_size);
++              return false;
++      }
++
++      sd_first_printk(KERN_INFO, sdkp, "Optimal transfer size %u bytes\n",
++                      opt_xfer_bytes);
++      return true;
++}
++
+ /**
+  *    sd_revalidate_disk - called the first time a new disk is seen,
+  *    performs disk spin up, read_capacity, etc.
+@@ -2898,15 +2947,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
+       dev_max = min_not_zero(dev_max, sdkp->max_xfer_blocks);
+       q->limits.max_dev_sectors = logical_to_sectors(sdp, dev_max);
+ 
+-      /*
+-       * Determine the device's preferred I/O size for reads and writes
+-       * unless the reported value is unreasonably small, large, or
+-       * garbage.
+-       */
+-      if (sdkp->opt_xfer_blocks &&
+-          sdkp->opt_xfer_blocks <= dev_max &&
+-          sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS &&
+-          logical_to_bytes(sdp, sdkp->opt_xfer_blocks) >= PAGE_SIZE) {
++      if (sd_validate_opt_xfer_size(sdkp, dev_max)) {
+               q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks);
+               rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
+       } else
+diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
+index cbc8e9388268..7ba0031d3a73 100644
+--- a/drivers/scsi/virtio_scsi.c
++++ b/drivers/scsi/virtio_scsi.c
+@@ -693,7 +693,6 @@ static int virtscsi_device_reset(struct scsi_cmnd *sc)
+               return FAILED;
+ 
+       memset(cmd, 0, sizeof(*cmd));
+-      cmd->sc = sc;
+       cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
+               .type = VIRTIO_SCSI_T_TMF,
+               .subtype = cpu_to_virtio32(vscsi->vdev,
+@@ -752,7 +751,6 @@ static int virtscsi_abort(struct scsi_cmnd *sc)
+               return FAILED;
+ 
+       memset(cmd, 0, sizeof(*cmd));
+-      cmd->sc = sc;
+       cmd->req.tmf = (struct virtio_scsi_ctrl_tmf_req){
+               .type = VIRTIO_SCSI_T_TMF,
+               .subtype = VIRTIO_SCSI_T_TMF_ABORT_TASK,
+diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
+index 3f3751e2b521..f2209ec4cb68 100644
+--- a/drivers/spi/spi-pxa2xx.c
++++ b/drivers/spi/spi-pxa2xx.c
+@@ -1668,6 +1668,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
+                       platform_info->enable_dma = false;
+               } else {
+                       master->can_dma = pxa2xx_spi_can_dma;
++                      master->max_dma_len = MAX_DMA_LEN;
+               }
+       }
+ 
+diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c
+index caeac66a3977..4cb72a8e4646 100644
+--- a/drivers/spi/spi-ti-qspi.c
++++ b/drivers/spi/spi-ti-qspi.c
+@@ -457,8 +457,8 @@ static void ti_qspi_enable_memory_map(struct spi_device 
*spi)
+       ti_qspi_write(qspi, MM_SWITCH, QSPI_SPI_SWITCH_REG);
+       if (qspi->ctrl_base) {
+               regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg,
+-                                 MEM_CS_EN(spi->chip_select),
+-                                 MEM_CS_MASK);
++                                 MEM_CS_MASK,
++                                 MEM_CS_EN(spi->chip_select));
+       }
+       qspi->mmap_enabled = true;
+ }
+@@ -470,7 +470,7 @@ static void ti_qspi_disable_memory_map(struct spi_device 
*spi)
+       ti_qspi_write(qspi, 0, QSPI_SPI_SWITCH_REG);
+       if (qspi->ctrl_base)
+               regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg,
+-                                 0, MEM_CS_MASK);
++                                 MEM_CS_MASK, 0);
+       qspi->mmap_enabled = false;
+ }
+ 
+diff --git a/drivers/target/iscsi/iscsi_target.c 
b/drivers/target/iscsi/iscsi_target.c
+index 80205f3362d4..b6c4f55f79e7 100644
+--- a/drivers/target/iscsi/iscsi_target.c
++++ b/drivers/target/iscsi/iscsi_target.c
+@@ -4084,9 +4084,9 @@ static void iscsit_release_commands_from_conn(struct 
iscsi_conn *conn)
+               struct se_cmd *se_cmd = &cmd->se_cmd;
+ 
+               if (se_cmd->se_tfo != NULL) {
+-                      spin_lock(&se_cmd->t_state_lock);
++                      spin_lock_irq(&se_cmd->t_state_lock);
+                       se_cmd->transport_state |= CMD_T_FABRIC_STOP;
+-                      spin_unlock(&se_cmd->t_state_lock);
++                      spin_unlock_irq(&se_cmd->t_state_lock);
+               }
+       }
+       spin_unlock_bh(&conn->cmd_lock);
+diff --git a/drivers/tty/serial/8250/8250_of.c 
b/drivers/tty/serial/8250/8250_of.c
+index 7a8b5fc81a19..f89dfde934a3 100644
+--- a/drivers/tty/serial/8250/8250_of.c
++++ b/drivers/tty/serial/8250/8250_of.c
+@@ -97,6 +97,10 @@ static int of_platform_serial_setup(struct platform_device 
*ofdev,
+       if (of_property_read_u32(np, "reg-offset", &prop) == 0)
+               port->mapbase += prop;
+ 
++      /* Compatibility with the deprecated pxa driver and 8250_pxa drivers. */
++      if (of_device_is_compatible(np, "mrvl,mmp-uart"))
++              port->regshift = 2;
++
+       /* Check for registers offset within the devices address range */
+       if (of_property_read_u32(np, "reg-shift", &prop) == 0)
+               port->regshift = prop;
+diff --git a/drivers/tty/serial/8250/8250_pci.c 
b/drivers/tty/serial/8250/8250_pci.c
+index e82b3473b6b8..2c38b3a1d518 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -1330,6 +1330,30 @@ static int pci_default_setup(struct serial_private 
*priv,
+       return setup_port(priv, port, bar, offset, board->reg_shift);
+ }
+ 
++static int pci_pericom_setup(struct serial_private *priv,
++                const struct pciserial_board *board,
++                struct uart_8250_port *port, int idx)
++{
++      unsigned int bar, offset = board->first_offset, maxnr;
++
++      bar = FL_GET_BASE(board->flags);
++      if (board->flags & FL_BASE_BARS)
++              bar += idx;
++      else
++              offset += idx * board->uart_offset;
++
++      if (idx==3)
++              offset = 0x38;
++
++      maxnr = (pci_resource_len(priv->dev, bar) - board->first_offset) >>
++              (board->reg_shift + 3);
++
++      if (board->flags & FL_REGION_SZ_CAP && idx >= maxnr)
++              return 1;
++
++      return setup_port(priv, port, bar, offset, board->reg_shift);
++}
++
+ static int
+ ce4100_serial_setup(struct serial_private *priv,
+                 const struct pciserial_board *board,
+@@ -2096,6 +2120,16 @@ static struct pci_serial_quirk pci_serial_quirks[] 
__refdata = {
+               .setup          = pci_default_setup,
+               .exit           = pci_plx9050_exit,
+       },
++      /*
++       * Pericom (Only 7954 - It have a offset jump for port 4)
++       */
++      {
++              .vendor         = PCI_VENDOR_ID_PERICOM,
++              .device         = PCI_DEVICE_ID_PERICOM_PI7C9X7954,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .setup          = pci_pericom_setup,
++      },
+       /*
+        * PLX
+        */
+@@ -2126,6 +2160,111 @@ static struct pci_serial_quirk pci_serial_quirks[] 
__refdata = {
+               .setup          = pci_default_setup,
+               .exit           = pci_plx9050_exit,
+       },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
++      {
++              .vendor     = PCI_VENDOR_ID_ACCESIO,
++              .device     = PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,
++              .subvendor  = PCI_ANY_ID,
++              .subdevice  = PCI_ANY_ID,
++              .setup      = pci_pericom_setup,
++      },
+       /*
+        * SBS Technologies, Inc., PMC-OCTALPRO 232
+        */
+@@ -4976,10 +5115,10 @@ static struct pci_device_id serial_pci_tbl[] = {
+        */
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7954 },
+@@ -4988,10 +5127,10 @@ static struct pci_device_id serial_pci_tbl[] = {
+               pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7954 },
+@@ -5000,10 +5139,10 @@ static struct pci_device_id serial_pci_tbl[] = {
+               pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7954 },
+@@ -5012,13 +5151,13 @@ static struct pci_device_id serial_pci_tbl[] = {
+               pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7951 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7954 },
+@@ -5027,16 +5166,16 @@ static struct pci_device_id serial_pci_tbl[] = {
+               pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7954 },
+@@ -5045,13 +5184,13 @@ static struct pci_device_id serial_pci_tbl[] = {
+               pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7954 },
++              pbn_pericom_PI7C9X7952 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7958 },
++              pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7958 },
++              pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7958 },
+@@ -5060,19 +5199,19 @@ static struct pci_device_id serial_pci_tbl[] = {
+               pbn_pericom_PI7C9X7958 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7958 },
++              pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7958 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7958 },
++              pbn_pericom_PI7C9X7954 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pericom_PI7C9X7958 },
+       {       PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_pericom_PI7C9X7958 },
++              pbn_pericom_PI7C9X7954 },
+       /*
+        * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke)
+        */
+diff --git a/drivers/tty/serial/xilinx_uartps.c 
b/drivers/tty/serial/xilinx_uartps.c
+index 7333d64f68f2..ffb474c49f0f 100644
+--- a/drivers/tty/serial/xilinx_uartps.c
++++ b/drivers/tty/serial/xilinx_uartps.c
+@@ -362,7 +362,13 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id)
+               cdns_uart_handle_tx(dev_id);
+               isrstatus &= ~CDNS_UART_IXR_TXEMPTY;
+       }
+-      if (isrstatus & CDNS_UART_IXR_RXMASK)
++
++      /*
++       * Skip RX processing if RX is disabled as RXEMPTY will never be set
++       * as read bytes will not be removed from the FIFO.
++       */
++      if (isrstatus & CDNS_UART_IXR_RXMASK &&
++          !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS))
+               cdns_uart_handle_rx(dev_id, isrstatus);
+ 
+       spin_unlock(&port->lock);
+diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h
+index 5a0db6dec8d1..aaee1e6584e6 100644
+--- a/fs/9p/v9fs_vfs.h
++++ b/fs/9p/v9fs_vfs.h
+@@ -40,6 +40,9 @@
+  */
+ #define P9_LOCK_TIMEOUT (30*HZ)
+ 
++/* flags for v9fs_stat2inode() & v9fs_stat2inode_dotl() */
++#define V9FS_STAT2INODE_KEEP_ISIZE 1
++
+ extern struct file_system_type v9fs_fs_type;
+ extern const struct address_space_operations v9fs_addr_operations;
+ extern const struct file_operations v9fs_file_operations;
+@@ -61,8 +64,10 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses,
+                   struct inode *inode, umode_t mode, dev_t);
+ void v9fs_evict_inode(struct inode *inode);
+ ino_t v9fs_qid2ino(struct p9_qid *qid);
+-void v9fs_stat2inode(struct p9_wstat *, struct inode *, struct super_block *);
+-void v9fs_stat2inode_dotl(struct p9_stat_dotl *, struct inode *);
++void v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
++                    struct super_block *sb, unsigned int flags);
++void v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode,
++                         unsigned int flags);
+ int v9fs_dir_release(struct inode *inode, struct file *filp);
+ int v9fs_file_open(struct inode *inode, struct file *file);
+ void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat);
+@@ -83,4 +88,18 @@ static inline void v9fs_invalidate_inode_attr(struct inode 
*inode)
+ }
+ 
+ int v9fs_open_to_dotl_flags(int flags);
++
++static inline void v9fs_i_size_write(struct inode *inode, loff_t i_size)
++{
++      /*
++       * 32-bit need the lock, concurrent updates could break the
++       * sequences and make i_size_read() loop forever.
++       * 64-bit updates are atomic and can skip the locking.
++       */
++      if (sizeof(i_size) > sizeof(long))
++              spin_lock(&inode->i_lock);
++      i_size_write(inode, i_size);
++      if (sizeof(i_size) > sizeof(long))
++              spin_unlock(&inode->i_lock);
++}
+ #endif
+diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c
+index 398a3eddb2df..2f035b15180e 100644
+--- a/fs/9p/vfs_file.c
++++ b/fs/9p/vfs_file.c
+@@ -442,7 +442,11 @@ v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter 
*from)
+               i_size = i_size_read(inode);
+               if (iocb->ki_pos > i_size) {
+                       inode_add_bytes(inode, iocb->ki_pos - i_size);
+-                      i_size_write(inode, iocb->ki_pos);
++                      /*
++                       * Need to serialize against i_size_write() in
++                       * v9fs_stat2inode()
++                       */
++                      v9fs_i_size_write(inode, iocb->ki_pos);
+               }
+               return retval;
+       }
+diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
+index f8ab4a66acaf..ddd1eb6aedee 100644
+--- a/fs/9p/vfs_inode.c
++++ b/fs/9p/vfs_inode.c
+@@ -538,7 +538,7 @@ static struct inode *v9fs_qid_iget(struct super_block *sb,
+       if (retval)
+               goto error;
+ 
+-      v9fs_stat2inode(st, inode, sb);
++      v9fs_stat2inode(st, inode, sb, 0);
+       v9fs_cache_inode_get_cookie(inode);
+       unlock_new_inode(inode);
+       return inode;
+@@ -1078,7 +1078,7 @@ v9fs_vfs_getattr(struct vfsmount *mnt, struct dentry 
*dentry,
+       if (IS_ERR(st))
+               return PTR_ERR(st);
+ 
+-      v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb);
++      v9fs_stat2inode(st, d_inode(dentry), dentry->d_sb, 0);
+       generic_fillattr(d_inode(dentry), stat);
+ 
+       p9stat_free(st);
+@@ -1156,12 +1156,13 @@ static int v9fs_vfs_setattr(struct dentry *dentry, 
struct iattr *iattr)
+  * @stat: Plan 9 metadata (mistat) structure
+  * @inode: inode to populate
+  * @sb: superblock of filesystem
++ * @flags: control flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE)
+  *
+  */
+ 
+ void
+ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
+-      struct super_block *sb)
++               struct super_block *sb, unsigned int flags)
+ {
+       umode_t mode;
+       char ext[32];
+@@ -1202,10 +1203,11 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode 
*inode,
+       mode = p9mode2perm(v9ses, stat);
+       mode |= inode->i_mode & ~S_IALLUGO;
+       inode->i_mode = mode;
+-      i_size_write(inode, stat->length);
+ 
++      if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE))
++              v9fs_i_size_write(inode, stat->length);
+       /* not real number of blocks, but 512 byte ones ... */
+-      inode->i_blocks = (i_size_read(inode) + 512 - 1) >> 9;
++      inode->i_blocks = (stat->length + 512 - 1) >> 9;
+       v9inode->cache_validity &= ~V9FS_INO_INVALID_ATTR;
+ }
+ 
+@@ -1402,9 +1404,9 @@ int v9fs_refresh_inode(struct p9_fid *fid, struct inode 
*inode)
+ {
+       int umode;
+       dev_t rdev;
+-      loff_t i_size;
+       struct p9_wstat *st;
+       struct v9fs_session_info *v9ses;
++      unsigned int flags;
+ 
+       v9ses = v9fs_inode2v9ses(inode);
+       st = p9_client_stat(fid);
+@@ -1417,16 +1419,13 @@ int v9fs_refresh_inode(struct p9_fid *fid, struct 
inode *inode)
+       if ((inode->i_mode & S_IFMT) != (umode & S_IFMT))
+               goto out;
+ 
+-      spin_lock(&inode->i_lock);
+       /*
+        * We don't want to refresh inode->i_size,
+        * because we may have cached data
+        */
+-      i_size = inode->i_size;
+-      v9fs_stat2inode(st, inode, inode->i_sb);
+-      if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
+-              inode->i_size = i_size;
+-      spin_unlock(&inode->i_lock);
++      flags = (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) ?
++              V9FS_STAT2INODE_KEEP_ISIZE : 0;
++      v9fs_stat2inode(st, inode, inode->i_sb, flags);
+ out:
+       p9stat_free(st);
+       kfree(st);
+diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c
+index c3dd0d42bb3a..425bc1a2b8c1 100644
+--- a/fs/9p/vfs_inode_dotl.c
++++ b/fs/9p/vfs_inode_dotl.c
+@@ -143,7 +143,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block 
*sb,
+       if (retval)
+               goto error;
+ 
+-      v9fs_stat2inode_dotl(st, inode);
++      v9fs_stat2inode_dotl(st, inode, 0);
+       v9fs_cache_inode_get_cookie(inode);
+       retval = v9fs_get_acl(inode, fid);
+       if (retval)
+@@ -496,7 +496,7 @@ v9fs_vfs_getattr_dotl(struct vfsmount *mnt, struct dentry 
*dentry,
+       if (IS_ERR(st))
+               return PTR_ERR(st);
+ 
+-      v9fs_stat2inode_dotl(st, d_inode(dentry));
++      v9fs_stat2inode_dotl(st, d_inode(dentry), 0);
+       generic_fillattr(d_inode(dentry), stat);
+       /* Change block size to what the server returned */
+       stat->blksize = st->st_blksize;
+@@ -607,11 +607,13 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct 
iattr *iattr)
+  * v9fs_stat2inode_dotl - populate an inode structure with stat info
+  * @stat: stat structure
+  * @inode: inode to populate
++ * @flags: ctrl flags (e.g. V9FS_STAT2INODE_KEEP_ISIZE)
+  *
+  */
+ 
+ void
+-v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode)
++v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct inode *inode,
++                    unsigned int flags)
+ {
+       umode_t mode;
+       struct v9fs_inode *v9inode = V9FS_I(inode);
+@@ -631,7 +633,8 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct 
inode *inode)
+               mode |= inode->i_mode & ~S_IALLUGO;
+               inode->i_mode = mode;
+ 
+-              i_size_write(inode, stat->st_size);
++              if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE))
++                      v9fs_i_size_write(inode, stat->st_size);
+               inode->i_blocks = stat->st_blocks;
+       } else {
+               if (stat->st_result_mask & P9_STATS_ATIME) {
+@@ -661,8 +664,9 @@ v9fs_stat2inode_dotl(struct p9_stat_dotl *stat, struct 
inode *inode)
+               }
+               if (stat->st_result_mask & P9_STATS_RDEV)
+                       inode->i_rdev = new_decode_dev(stat->st_rdev);
+-              if (stat->st_result_mask & P9_STATS_SIZE)
+-                      i_size_write(inode, stat->st_size);
++              if (!(flags & V9FS_STAT2INODE_KEEP_ISIZE) &&
++                  stat->st_result_mask & P9_STATS_SIZE)
++                      v9fs_i_size_write(inode, stat->st_size);
+               if (stat->st_result_mask & P9_STATS_BLOCKS)
+                       inode->i_blocks = stat->st_blocks;
+       }
+@@ -928,9 +932,9 @@ v9fs_vfs_get_link_dotl(struct dentry *dentry,
+ 
+ int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode)
+ {
+-      loff_t i_size;
+       struct p9_stat_dotl *st;
+       struct v9fs_session_info *v9ses;
++      unsigned int flags;
+ 
+       v9ses = v9fs_inode2v9ses(inode);
+       st = p9_client_getattr_dotl(fid, P9_STATS_ALL);
+@@ -942,16 +946,13 @@ int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct 
inode *inode)
+       if ((inode->i_mode & S_IFMT) != (st->st_mode & S_IFMT))
+               goto out;
+ 
+-      spin_lock(&inode->i_lock);
+       /*
+        * We don't want to refresh inode->i_size,
+        * because we may have cached data
+        */
+-      i_size = inode->i_size;
+-      v9fs_stat2inode_dotl(st, inode);
+-      if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
+-              inode->i_size = i_size;
+-      spin_unlock(&inode->i_lock);
++      flags = (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) ?
++              V9FS_STAT2INODE_KEEP_ISIZE : 0;
++      v9fs_stat2inode_dotl(st, inode, flags);
+ out:
+       kfree(st);
+       return 0;
+diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
+index de3ed8629196..06ff1a9089e8 100644
+--- a/fs/9p/vfs_super.c
++++ b/fs/9p/vfs_super.c
+@@ -165,7 +165,7 @@ static struct dentry *v9fs_mount(struct file_system_type 
*fs_type, int flags,
+                       goto release_sb;
+               }
+               d_inode(root)->i_ino = v9fs_qid2ino(&st->qid);
+-              v9fs_stat2inode_dotl(st, d_inode(root));
++              v9fs_stat2inode_dotl(st, d_inode(root), 0);
+               kfree(st);
+       } else {
+               struct p9_wstat *st = NULL;
+@@ -176,7 +176,7 @@ static struct dentry *v9fs_mount(struct file_system_type 
*fs_type, int flags,
+               }
+ 
+               d_inode(root)->i_ino = v9fs_qid2ino(&st->qid);
+-              v9fs_stat2inode(st, d_inode(root), sb);
++              v9fs_stat2inode(st, d_inode(root), sb, 0);
+ 
+               p9stat_free(st);
+               kfree(st);
+diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
+index 5c5c389d8fed..4d901200be13 100644
+--- a/fs/btrfs/extent_io.c
++++ b/fs/btrfs/extent_io.c
+@@ -3018,11 +3018,11 @@ static int __do_readpage(struct extent_io_tree *tree,
+                */
+               if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags) &&
+                   prev_em_start && *prev_em_start != (u64)-1 &&
+-                  *prev_em_start != em->orig_start)
++                  *prev_em_start != em->start)
+                       force_bio_submit = true;
+ 
+               if (prev_em_start)
+-                      *prev_em_start = em->orig_start;
++                      *prev_em_start = em->start;
+ 
+               free_extent_map(em);
+               em = NULL;
+diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
+index 5aa2749eaf42..c063ac57c30e 100644
+--- a/fs/btrfs/volumes.c
++++ b/fs/btrfs/volumes.c
+@@ -6439,10 +6439,10 @@ static int btrfs_check_chunk_valid(struct btrfs_root 
*root,
+       }
+ 
+       if ((type & BTRFS_BLOCK_GROUP_RAID10 && sub_stripes != 2) ||
+-          (type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes < 1) ||
++          (type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes != 2) ||
+           (type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 2) ||
+           (type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 3) ||
+-          (type & BTRFS_BLOCK_GROUP_DUP && num_stripes > 2) ||
++          (type & BTRFS_BLOCK_GROUP_DUP && num_stripes != 2) ||
+           ((type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 &&
+            num_stripes != 1)) {
+               btrfs_err(root->fs_info,
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index 8ec296308729..1c5099fffaec 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -2797,14 +2797,16 @@ cifs_strict_writev(struct kiocb *iocb, struct iov_iter 
*from)
+        * these pages but not on the region from pos to ppos+len-1.
+        */
+       written = cifs_user_writev(iocb, from);
+-      if (written > 0 && CIFS_CACHE_READ(cinode)) {
++      if (CIFS_CACHE_READ(cinode)) {
+               /*
+-               * Windows 7 server can delay breaking level2 oplock if a write
+-               * request comes - break it on the client to prevent reading
+-               * an old data.
++               * We have read level caching and we have just sent a write
++               * request to the server thus making data in the cache stale.
++               * Zap the cache and set oplock/lease level to NONE to avoid
++               * reading stale data from the cache. All subsequent read
++               * operations will read new data from the server.
+                */
+               cifs_zap_mapping(inode);
+-              cifs_dbg(FYI, "Set no oplock for inode=%p after a write 
operation\n",
++              cifs_dbg(FYI, "Set Oplock/Lease to NONE for inode=%p after 
write\n",
+                        inode);
+               cinode->oplock = 0;
+       }
+diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c
+index e96a74da756f..244d27bb8fba 100644
+--- a/fs/cifs/smb2misc.c
++++ b/fs/cifs/smb2misc.c
+@@ -474,7 +474,6 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct 
smb2_lease_break *rsp,
+       __u8 lease_state;
+       struct list_head *tmp;
+       struct cifsFileInfo *cfile;
+-      struct TCP_Server_Info *server = tcon->ses->server;
+       struct cifs_pending_open *open;
+       struct cifsInodeInfo *cinode;
+       int ack_req = le32_to_cpu(rsp->Flags &
+@@ -494,13 +493,25 @@ smb2_tcon_has_lease(struct cifs_tcon *tcon, struct 
smb2_lease_break *rsp,
+               cifs_dbg(FYI, "lease key match, lease break 0x%x\n",
+                        le32_to_cpu(rsp->NewLeaseState));
+ 
+-              server->ops->set_oplock_level(cinode, lease_state, 0, NULL);
+-
+               if (ack_req)
+                       cfile->oplock_break_cancelled = false;
+               else
+                       cfile->oplock_break_cancelled = true;
+ 
++              set_bit(CIFS_INODE_PENDING_OPLOCK_BREAK, &cinode->flags);
++
++              /*
++               * Set or clear flags depending on the lease state being READ.
++               * HANDLE caching flag should be added when the client starts
++               * to defer closing remote file handles with HANDLE leases.
++               */
++              if (lease_state & SMB2_LEASE_READ_CACHING_HE)
++                      set_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2,
++                              &cinode->flags);
++              else
++                      clear_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2,
++                                &cinode->flags);
++
+               queue_work(cifsoplockd_wq, &cfile->oplock_break);
+               kfree(lw);
+               return true;
+diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
+index 2db7968febfe..97d8e2a3df9b 100644
+--- a/fs/cifs/smb2ops.c
++++ b/fs/cifs/smb2ops.c
+@@ -1376,6 +1376,15 @@ smb2_downgrade_oplock(struct TCP_Server_Info *server,
+               server->ops->set_oplock_level(cinode, 0, 0, NULL);
+ }
+ 
++static void
++smb21_downgrade_oplock(struct TCP_Server_Info *server,
++                     struct cifsInodeInfo *cinode, bool set_level2)
++{
++      server->ops->set_oplock_level(cinode,
++                                    set_level2 ? SMB2_LEASE_READ_CACHING_HE :
++                                    0, 0, NULL);
++}
++
+ static void
+ smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock,
+                     unsigned int epoch, bool *purge_cache)
+@@ -1681,7 +1690,7 @@ struct smb_version_operations smb21_operations = {
+       .print_stats = smb2_print_stats,
+       .is_oplock_break = smb2_is_valid_oplock_break,
+       .handle_cancelled_mid = smb2_handle_cancelled_mid,
+-      .downgrade_oplock = smb2_downgrade_oplock,
++      .downgrade_oplock = smb21_downgrade_oplock,
+       .need_neg = smb2_need_neg,
+       .negotiate = smb2_negotiate,
+       .negotiate_wsize = smb2_negotiate_wsize,
+@@ -1765,7 +1774,7 @@ struct smb_version_operations smb30_operations = {
+       .dump_share_caps = smb2_dump_share_caps,
+       .is_oplock_break = smb2_is_valid_oplock_break,
+       .handle_cancelled_mid = smb2_handle_cancelled_mid,
+-      .downgrade_oplock = smb2_downgrade_oplock,
++      .downgrade_oplock = smb21_downgrade_oplock,
+       .need_neg = smb2_need_neg,
+       .negotiate = smb2_negotiate,
+       .negotiate_wsize = smb2_negotiate_wsize,
+@@ -1855,7 +1864,7 @@ struct smb_version_operations smb311_operations = {
+       .dump_share_caps = smb2_dump_share_caps,
+       .is_oplock_break = smb2_is_valid_oplock_break,
+       .handle_cancelled_mid = smb2_handle_cancelled_mid,
+-      .downgrade_oplock = smb2_downgrade_oplock,
++      .downgrade_oplock = smb21_downgrade_oplock,
+       .need_neg = smb2_need_neg,
+       .negotiate = smb2_negotiate,
+       .negotiate_wsize = smb2_negotiate_wsize,
+diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
+index 108df2e3602c..81be3ba17cbf 100644
+--- a/fs/devpts/inode.c
++++ b/fs/devpts/inode.c
+@@ -396,6 +396,7 @@ devpts_fill_super(struct super_block *s, void *data, int 
silent)
+       s->s_blocksize_bits = 10;
+       s->s_magic = DEVPTS_SUPER_MAGIC;
+       s->s_op = &devpts_sops;
++      s->s_d_op = &simple_dentry_operations;
+       s->s_time_gran = 1;
+ 
+       error = -ENOMEM;
+diff --git a/fs/ext2/super.c b/fs/ext2/super.c
+index 6cb042b53b5b..6fcb29b393d3 100644
+--- a/fs/ext2/super.c
++++ b/fs/ext2/super.c
+@@ -724,7 +724,8 @@ static loff_t ext2_max_size(int bits)
+ {
+       loff_t res = EXT2_NDIR_BLOCKS;
+       int meta_blocks;
+-      loff_t upper_limit;
++      unsigned int upper_limit;
++      unsigned int ppb = 1 << (bits-2);
+ 
+       /* This is calculated to be the largest file size for a
+        * dense, file such that the total number of
+@@ -738,24 +739,34 @@ static loff_t ext2_max_size(int bits)
+       /* total blocks in file system block size */
+       upper_limit >>= (bits - 9);
+ 
++      /* Compute how many blocks we can address by block tree */
++      res += 1LL << (bits-2);
++      res += 1LL << (2*(bits-2));
++      res += 1LL << (3*(bits-2));
++      /* Does block tree limit file size? */
++      if (res < upper_limit)
++              goto check_lfs;
+ 
++      res = upper_limit;
++      /* How many metadata blocks are needed for addressing upper_limit? */
++      upper_limit -= EXT2_NDIR_BLOCKS;
+       /* indirect blocks */
+       meta_blocks = 1;
++      upper_limit -= ppb;
+       /* double indirect blocks */
+-      meta_blocks += 1 + (1LL << (bits-2));
+-      /* tripple indirect blocks */
+-      meta_blocks += 1 + (1LL << (bits-2)) + (1LL << (2*(bits-2)));
+-
+-      upper_limit -= meta_blocks;
+-      upper_limit <<= bits;
+-
+-      res += 1LL << (bits-2);
+-      res += 1LL << (2*(bits-2));
+-      res += 1LL << (3*(bits-2));
++      if (upper_limit < ppb * ppb) {
++              meta_blocks += 1 + DIV_ROUND_UP(upper_limit, ppb);
++              res -= meta_blocks;
++              goto check_lfs;
++      }
++      meta_blocks += 1 + ppb;
++      upper_limit -= ppb * ppb;
++      /* tripple indirect blocks for the rest */
++      meta_blocks += 1 + DIV_ROUND_UP(upper_limit, ppb) +
++              DIV_ROUND_UP(upper_limit, ppb*ppb);
++      res -= meta_blocks;
++check_lfs:
+       res <<= bits;
+-      if (res > upper_limit)
+-              res = upper_limit;
+-
+       if (res > MAX_LFS_FILESIZE)
+               res = MAX_LFS_FILESIZE;
+ 
+diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
+index 58e6b8a03e90..67b359629a66 100644
+--- a/fs/ext4/resize.c
++++ b/fs/ext4/resize.c
+@@ -1928,7 +1928,8 @@ retry:
+                               le16_to_cpu(es->s_reserved_gdt_blocks);
+                       n_group = n_desc_blocks * EXT4_DESC_PER_BLOCK(sb);
+                       n_blocks_count = (ext4_fsblk_t)n_group *
+-                              EXT4_BLOCKS_PER_GROUP(sb);
++                              EXT4_BLOCKS_PER_GROUP(sb) +
++                              le32_to_cpu(es->s_first_data_block);
+                       n_group--; /* set to last group number */
+               }
+ 
+diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
+index b320c1ba7fdc..799f96c67211 100644
+--- a/fs/jbd2/transaction.c
++++ b/fs/jbd2/transaction.c
+@@ -1211,11 +1211,12 @@ int jbd2_journal_get_undo_access(handle_t *handle, 
struct buffer_head *bh)
+       struct journal_head *jh;
+       char *committed_data = NULL;
+ 
+-      JBUFFER_TRACE(jh, "entry");
+       if (jbd2_write_access_granted(handle, bh, true))
+               return 0;
+ 
+       jh = jbd2_journal_add_journal_head(bh);
++      JBUFFER_TRACE(jh, "entry");
++
+       /*
+        * Do this first --- it can drop the journal lock, so we want to
+        * make sure that obtaining the committed_data is done
+@@ -1326,15 +1327,17 @@ int jbd2_journal_dirty_metadata(handle_t *handle, 
struct buffer_head *bh)
+ 
+       if (is_handle_aborted(handle))
+               return -EROFS;
+-      if (!buffer_jbd(bh)) {
+-              ret = -EUCLEAN;
+-              goto out;
+-      }
++      if (!buffer_jbd(bh))
++              return -EUCLEAN;
++
+       /*
+        * We don't grab jh reference here since the buffer must be part
+        * of the running transaction.
+        */
+       jh = bh2jh(bh);
++      jbd_debug(5, "journal_head %p\n", jh);
++      JBUFFER_TRACE(jh, "entry");
++
+       /*
+        * This and the following assertions are unreliable since we may see jh
+        * in inconsistent state unless we grab bh_state lock. But this is
+@@ -1368,9 +1371,6 @@ int jbd2_journal_dirty_metadata(handle_t *handle, struct 
buffer_head *bh)
+       }
+ 
+       journal = transaction->t_journal;
+-      jbd_debug(5, "journal_head %p\n", jh);
+-      JBUFFER_TRACE(jh, "entry");
+-
+       jbd_lock_bh_state(bh);
+ 
+       if (jh->b_modified == 0) {
+@@ -1568,14 +1568,21 @@ int jbd2_journal_forget (handle_t *handle, struct 
buffer_head *bh)
+               /* However, if the buffer is still owned by a prior
+                * (committing) transaction, we can't drop it yet... */
+               JBUFFER_TRACE(jh, "belongs to older transaction");
+-              /* ... but we CAN drop it from the new transaction if we
+-               * have also modified it since the original commit. */
++              /* ... but we CAN drop it from the new transaction through
++               * marking the buffer as freed and set j_next_transaction to
++               * the new transaction, so that not only the commit code
++               * knows it should clear dirty bits when it is done with the
++               * buffer, but also the buffer can be checkpointed only
++               * after the new transaction commits. */
+ 
+-              if (jh->b_next_transaction) {
+-                      J_ASSERT(jh->b_next_transaction == transaction);
++              set_buffer_freed(bh);
++
++              if (!jh->b_next_transaction) {
+                       spin_lock(&journal->j_list_lock);
+-                      jh->b_next_transaction = NULL;
++                      jh->b_next_transaction = transaction;
+                       spin_unlock(&journal->j_list_lock);
++              } else {
++                      J_ASSERT(jh->b_next_transaction == transaction);
+ 
+                       /*
+                        * only drop a reference if this transaction modified
+diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
+index 892c88542ebd..fad4d5188aaf 100644
+--- a/fs/nfs/pagelist.c
++++ b/fs/nfs/pagelist.c
+@@ -975,6 +975,17 @@ static void nfs_pageio_doio(struct nfs_pageio_descriptor 
*desc)
+       }
+ }
+ 
++static void
++nfs_pageio_cleanup_request(struct nfs_pageio_descriptor *desc,
++              struct nfs_page *req)
++{
++      LIST_HEAD(head);
++
++      nfs_list_remove_request(req);
++      nfs_list_add_request(req, &head);
++      desc->pg_completion_ops->error_cleanup(&head);
++}
++
+ /**
+  * nfs_pageio_add_request - Attempt to coalesce a request into a page list.
+  * @desc: destination io descriptor
+@@ -1012,10 +1023,8 @@ static int __nfs_pageio_add_request(struct 
nfs_pageio_descriptor *desc,
+                       nfs_page_group_unlock(req);
+                       desc->pg_moreio = 1;
+                       nfs_pageio_doio(desc);
+-                      if (desc->pg_error < 0)
+-                              return 0;
+-                      if (mirror->pg_recoalesce)
+-                              return 0;
++                      if (desc->pg_error < 0 || mirror->pg_recoalesce)
++                              goto out_cleanup_subreq;
+                       /* retry add_request for this subreq */
+                       nfs_page_group_lock(req, false);
+                       continue;
+@@ -1048,6 +1057,10 @@ err_ptr:
+       desc->pg_error = PTR_ERR(subreq);
+       nfs_page_group_unlock(req);
+       return 0;
++out_cleanup_subreq:
++      if (req != subreq)
++              nfs_pageio_cleanup_request(desc, subreq);
++      return 0;
+ }
+ 
+ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc)
+@@ -1066,7 +1079,6 @@ static int nfs_do_recoalesce(struct 
nfs_pageio_descriptor *desc)
+                       struct nfs_page *req;
+ 
+                       req = list_first_entry(&head, struct nfs_page, wb_list);
+-                      nfs_list_remove_request(req);
+                       if (__nfs_pageio_add_request(desc, req))
+                               continue;
+                       if (desc->pg_error < 0) {
+@@ -1141,11 +1153,14 @@ int nfs_pageio_add_request(struct 
nfs_pageio_descriptor *desc,
+               if (nfs_pgio_has_mirroring(desc))
+                       desc->pg_mirror_idx = midx;
+               if (!nfs_pageio_add_request_mirror(desc, dupreq))
+-                      goto out_failed;
++                      goto out_cleanup_subreq;
+       }
+ 
+       return 1;
+ 
++out_cleanup_subreq:
++      if (req != dupreq)
++              nfs_pageio_cleanup_request(desc, dupreq);
+ out_failed:
+       /*
+        * We might have failed before sending any reqs over wire.
+@@ -1185,7 +1200,7 @@ static void nfs_pageio_complete_mirror(struct 
nfs_pageio_descriptor *desc,
+               desc->pg_mirror_idx = mirror_idx;
+       for (;;) {
+               nfs_pageio_doio(desc);
+-              if (!mirror->pg_recoalesce)
++              if (desc->pg_error < 0 || !mirror->pg_recoalesce)
+                       break;
+               if (!nfs_do_recoalesce(desc))
+                       break;
+diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
+index d818e4ffd79f..00b472fe77c1 100644
+--- a/fs/nfsd/nfs3proc.c
++++ b/fs/nfsd/nfs3proc.c
+@@ -431,8 +431,19 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp, struct 
nfsd3_readdirargs *argp,
+                                       &resp->common, nfs3svc_encode_entry);
+       memcpy(resp->verf, argp->verf, 8);
+       resp->count = resp->buffer - argp->buffer;
+-      if (resp->offset)
+-              xdr_encode_hyper(resp->offset, argp->cookie);
++      if (resp->offset) {
++              loff_t offset = argp->cookie;
++
++              if (unlikely(resp->offset1)) {
++                      /* we ended up with offset on a page boundary */
++                      *resp->offset = htonl(offset >> 32);
++                      *resp->offset1 = htonl(offset & 0xffffffff);
++                      resp->offset1 = NULL;
++              } else {
++                      xdr_encode_hyper(resp->offset, offset);
++              }
++              resp->offset = NULL;
++      }
+ 
+       RETURN_STATUS(nfserr);
+ }
+@@ -500,6 +511,7 @@ nfsd3_proc_readdirplus(struct svc_rqst *rqstp, struct 
nfsd3_readdirargs *argp,
+               } else {
+                       xdr_encode_hyper(resp->offset, offset);
+               }
++              resp->offset = NULL;
+       }
+ 
+       RETURN_STATUS(nfserr);
+diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
+index 452334694a5d..7e50248ca432 100644
+--- a/fs/nfsd/nfs3xdr.c
++++ b/fs/nfsd/nfs3xdr.c
+@@ -899,6 +899,7 @@ encode_entry(struct readdir_cd *ccd, const char *name, int 
namlen,
+               } else {
+                       xdr_encode_hyper(cd->offset, offset64);
+               }
++              cd->offset = NULL;
+       }
+ 
+       /*
+diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
+index 797a155c9a67..f704f90db36c 100644
+--- a/fs/nfsd/nfsctl.c
++++ b/fs/nfsd/nfsctl.c
+@@ -1103,7 +1103,7 @@ 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)
++                      if (!nn->nfsd_serv)
+                               return -EBUSY;
+                       nfsd4_end_grace(nn);
+                       break;
+diff --git a/fs/pipe.c b/fs/pipe.c
+index 34345535f63d..388e09a689de 100644
+--- a/fs/pipe.c
++++ b/fs/pipe.c
+@@ -238,6 +238,14 @@ static const struct pipe_buf_operations anon_pipe_buf_ops 
= {
+       .get = generic_pipe_buf_get,
+ };
+ 
++static const struct pipe_buf_operations anon_pipe_buf_nomerge_ops = {
++      .can_merge = 0,
++      .confirm = generic_pipe_buf_confirm,
++      .release = anon_pipe_buf_release,
++      .steal = anon_pipe_buf_steal,
++      .get = generic_pipe_buf_get,
++};
++
+ static const struct pipe_buf_operations packet_pipe_buf_ops = {
+       .can_merge = 0,
+       .confirm = generic_pipe_buf_confirm,
+@@ -246,6 +254,12 @@ static const struct pipe_buf_operations 
packet_pipe_buf_ops = {
+       .get = generic_pipe_buf_get,
+ };
+ 
++void pipe_buf_mark_unmergeable(struct pipe_buffer *buf)
++{
++      if (buf->ops == &anon_pipe_buf_ops)
++              buf->ops = &anon_pipe_buf_nomerge_ops;
++}
++
+ static ssize_t
+ pipe_read(struct kiocb *iocb, struct iov_iter *to)
+ {
+diff --git a/fs/splice.c b/fs/splice.c
+index 8dd79ecfd383..01983bea760c 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -1594,6 +1594,8 @@ retry:
+                        */
+                       obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
+ 
++                      pipe_buf_mark_unmergeable(obuf);
++
+                       obuf->len = len;
+                       opipe->nrbufs++;
+                       ibuf->offset += obuf->len;
+@@ -1668,6 +1670,8 @@ static int link_pipe(struct pipe_inode_info *ipipe,
+                */
+               obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
+ 
++              pipe_buf_mark_unmergeable(obuf);
++
+               if (obuf->len > len)
+                       obuf->len = len;
+ 
+diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
+index ef7962e84444..9661bb2fbe22 100644
+--- a/include/linux/device-mapper.h
++++ b/include/linux/device-mapper.h
+@@ -627,7 +627,7 @@ extern struct ratelimit_state dm_ratelimit_state;
+  */
+ #define dm_target_offset(ti, sector) ((sector) - (ti)->begin)
+ 
+-static inline sector_t to_sector(unsigned long n)
++static inline sector_t to_sector(unsigned long long n)
+ {
+       return (n >> SECTOR_SHIFT);
+ }
+diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
+index e7497c9dde7f..4f7129389855 100644
+--- a/include/linux/pipe_fs_i.h
++++ b/include/linux/pipe_fs_i.h
+@@ -182,6 +182,7 @@ void generic_pipe_buf_get(struct pipe_inode_info *, struct 
pipe_buffer *);
+ int generic_pipe_buf_confirm(struct pipe_inode_info *, struct pipe_buffer *);
+ int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *);
+ void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *);
++void pipe_buf_mark_unmergeable(struct pipe_buffer *buf);
+ 
+ extern const struct pipe_buf_operations nosteal_pipe_buf_ops;
+ 
+diff --git a/include/linux/property.h b/include/linux/property.h
+index 459337fb44d0..d5c7ebda4113 100644
+--- a/include/linux/property.h
++++ b/include/linux/property.h
+@@ -233,7 +233,7 @@ struct property_entry {
+ #define PROPERTY_ENTRY_STRING(_name_, _val_)          \
+ (struct property_entry) {                             \
+       .name = _name_,                                 \
+-      .length = sizeof(_val_),                        \
++      .length = sizeof(const char *),                 \
+       .is_string = true,                              \
+       { .value = { .str = _val_ } },                  \
+ }
+diff --git a/include/net/phonet/pep.h b/include/net/phonet/pep.h
+index b669fe6dbc3b..98f31c7ea23d 100644
+--- a/include/net/phonet/pep.h
++++ b/include/net/phonet/pep.h
+@@ -63,10 +63,11 @@ struct pnpipehdr {
+               u8              state_after_reset;      /* reset request */
+               u8              error_code;             /* any response */
+               u8              pep_type;               /* status indication */
+-              u8              data[1];
++              u8              data0;                  /* anything else */
+       };
++      u8                      data[];
+ };
+-#define other_pep_type                data[1]
++#define other_pep_type                data[0]
+ 
+ static inline struct pnpipehdr *pnp_hdr(struct sk_buff *skb)
+ {
+diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
+index d1a02877a42c..d0b113de3316 100644
+--- a/kernel/rcu/tree.c
++++ b/kernel/rcu/tree.c
+@@ -1718,15 +1718,23 @@ static int rcu_future_gp_cleanup(struct rcu_state 
*rsp, struct rcu_node *rnp)
+ }
+ 
+ /*
+- * Awaken the grace-period kthread for the specified flavor of RCU.
+- * Don't do a self-awaken, and don't bother awakening when there is
+- * nothing for the grace-period kthread to do (as in several CPUs
+- * raced to awaken, and we lost), and finally don't try to awaken
+- * a kthread that has not yet been created.
++ * Awaken the grace-period kthread.  Don't do a self-awaken (unless in
++ * an interrupt or softirq handler), and don't bother awakening when there
++ * is nothing for the grace-period kthread to do (as in several CPUs raced
++ * to awaken, and we lost), and finally don't try to awaken a kthread that
++ * has not yet been created.  If all those checks are passed, track some
++ * debug information and awaken.
++ *
++ * So why do the self-wakeup when in an interrupt or softirq handler
++ * in the grace-period kthread's context?  Because the kthread might have
++ * been interrupted just as it was going to sleep, and just after the final
++ * pre-sleep check of the awaken condition.  In this case, a wakeup really
++ * is required, and is therefore supplied.
+  */
+ static void rcu_gp_kthread_wake(struct rcu_state *rsp)
+ {
+-      if (current == rsp->gp_kthread ||
++      if ((current == rsp->gp_kthread &&
++           !in_interrupt() && !in_serving_softirq()) ||
+           !READ_ONCE(rsp->gp_flags) ||
+           !rsp->gp_kthread)
+               return;
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 93c7b02279b9..efd340a510a9 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -2377,7 +2377,16 @@ static int do_proc_dointvec_minmax_conv(bool *negp, 
unsigned long *lvalp,
+ {
+       struct do_proc_dointvec_minmax_conv_param *param = data;
+       if (write) {
+-              int val = *negp ? -*lvalp : *lvalp;
++              int val;
++              if (*negp) {
++                      if (*lvalp > (unsigned long) INT_MAX + 1)
++                              return -EINVAL;
++                      val = -*lvalp;
++              } else {
++                      if (*lvalp > (unsigned long) INT_MAX)
++                              return -EINVAL;
++                      val = *lvalp;
++              }
+               if ((param->min && *param->min > val) ||
+                   (param->max && *param->max < val))
+                       return -EINVAL;
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index 6786c507f1f9..f18dedf9195e 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -5057,7 +5057,6 @@ out:
+       return ret;
+ 
+ fail:
+-      kfree(iter->trace);
+       kfree(iter);
+       __trace_array_put(tr);
+       mutex_unlock(&trace_types_lock);
+diff --git a/kernel/trace/trace_events_hist.c 
b/kernel/trace/trace_events_hist.c
+index 0664044ade06..766e5ccad60a 100644
+--- a/kernel/trace/trace_events_hist.c
++++ b/kernel/trace/trace_events_hist.c
+@@ -871,9 +871,10 @@ static inline void add_to_key(char *compound_key, void 
*key,
+               /* ensure NULL-termination */
+               if (size > key_field->size - 1)
+                       size = key_field->size - 1;
+-      }
+ 
+-      memcpy(compound_key + key_field->offset, key, size);
++              strncpy(compound_key + key_field->offset, (char *)key, size);
++      } else
++              memcpy(compound_key + key_field->offset, key, size);
+ }
+ 
+ static void event_hist_trigger(struct event_trigger_data *data, void *rec)
+diff --git a/lib/assoc_array.c b/lib/assoc_array.c
+index 5cd093589c5a..3b46c5433b7a 100644
+--- a/lib/assoc_array.c
++++ b/lib/assoc_array.c
+@@ -781,9 +781,11 @@ all_leaves_cluster_together:
+               new_s0->index_key[i] =
+                       ops->get_key_chunk(index_key, i * 
ASSOC_ARRAY_KEY_CHUNK_SIZE);
+ 
+-      blank = ULONG_MAX << (level & ASSOC_ARRAY_KEY_CHUNK_MASK);
+-      pr_devel("blank off [%zu] %d: %lx\n", keylen - 1, level, blank);
+-      new_s0->index_key[keylen - 1] &= ~blank;
++      if (level & ASSOC_ARRAY_KEY_CHUNK_MASK) {
++              blank = ULONG_MAX << (level & ASSOC_ARRAY_KEY_CHUNK_MASK);
++              pr_devel("blank off [%zu] %d: %lx\n", keylen - 1, level, blank);
++              new_s0->index_key[keylen - 1] &= ~blank;
++      }
+ 
+       /* This now reduces to a node splitting exercise for which we'll need
+        * to regenerate the disparity table.
+diff --git a/mm/gup.c b/mm/gup.c
+index d71da7216c6e..99c2f10188c0 100644
+--- a/mm/gup.c
++++ b/mm/gup.c
+@@ -1423,7 +1423,8 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, 
unsigned long end,
+               if (pmd_none(pmd))
+                       return 0;
+ 
+-              if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd))) {
++              if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd) ||
++                           pmd_devmap(pmd))) {
+                       /*
+                        * NUMA hinting faults need to be handled in the GUP
+                        * slowpath for accounting purposes and so that they
+diff --git a/mm/memory-failure.c b/mm/memory-failure.c
+index 4f1f5fd12042..d6524dce43b2 100644
+--- a/mm/memory-failure.c
++++ b/mm/memory-failure.c
+@@ -1705,19 +1705,17 @@ static int soft_offline_in_use_page(struct page *page, 
int flags)
+       struct page *hpage = compound_head(page);
+ 
+       if (!PageHuge(page) && PageTransHuge(hpage)) {
+-              lock_page(hpage);
+-              if (!PageAnon(hpage) || unlikely(split_huge_page(hpage))) {
+-                      unlock_page(hpage);
+-                      if (!PageAnon(hpage))
++              lock_page(page);
++              if (!PageAnon(page) || unlikely(split_huge_page(page))) {
++                      unlock_page(page);
++                      if (!PageAnon(page))
+                               pr_info("soft offline: %#lx: non anonymous 
thp\n", page_to_pfn(page));
+                       else
+                               pr_info("soft offline: %#lx: thp split 
failed\n", page_to_pfn(page));
+-                      put_hwpoison_page(hpage);
++                      put_hwpoison_page(page);
+                       return -EBUSY;
+               }
+-              unlock_page(hpage);
+-              get_hwpoison_page(page);
+-              put_hwpoison_page(hpage);
++              unlock_page(page);
+       }
+ 
+       if (PageHuge(page))
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 3af727d95c17..05f141e39ac1 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -3955,11 +3955,11 @@ refill:
+               /* Even if we own the page, we do not use atomic_set().
+                * This would break get_page_unless_zero() users.
+                */
+-              page_ref_add(page, size - 1);
++              page_ref_add(page, size);
+ 
+               /* reset page count bias and offset to start of new frag */
+               nc->pfmemalloc = page_is_pfmemalloc(page);
+-              nc->pagecnt_bias = size;
++              nc->pagecnt_bias = size + 1;
+               nc->offset = size;
+       }
+ 
+@@ -3975,10 +3975,10 @@ refill:
+               size = nc->size;
+ #endif
+               /* OK, page count is 0, we can safely set it */
+-              set_page_count(page, size);
++              set_page_count(page, size + 1);
+ 
+               /* reset page count bias and offset to start of new frag */
+-              nc->pagecnt_bias = size;
++              nc->pagecnt_bias = size + 1;
+               offset = size - fragsz;
+       }
+ 
+diff --git a/mm/shmem.c b/mm/shmem.c
+index 9b17bd4cbc5e..944242491059 100644
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -2896,16 +2896,20 @@ static int shmem_create(struct inode *dir, struct 
dentry *dentry, umode_t mode,
+ static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct 
dentry *dentry)
+ {
+       struct inode *inode = d_inode(old_dentry);
+-      int ret;
++      int ret = 0;
+ 
+       /*
+        * No ordinary (disk based) filesystem counts links as inodes;
+        * but each new link needs a new dentry, pinning lowmem, and
+        * tmpfs dentries cannot be pruned until they are unlinked.
++       * But if an O_TMPFILE file is linked into the tmpfs, the
++       * first link must skip that, to get the accounting right.
+        */
+-      ret = shmem_reserve_inode(inode->i_sb);
+-      if (ret)
+-              goto out;
++      if (inode->i_nlink) {
++              ret = shmem_reserve_inode(inode->i_sb);
++              if (ret)
++                      goto out;
++      }
+ 
+       dir->i_size += BOGO_DIRENT_SIZE;
+       inode->i_ctime = dir->i_ctime = dir->i_mtime = current_time(inode);
+diff --git a/mm/vmalloc.c b/mm/vmalloc.c
+index fa598162dbf0..e6aa073f01df 100644
+--- a/mm/vmalloc.c
++++ b/mm/vmalloc.c
+@@ -2191,7 +2191,7 @@ int remap_vmalloc_range_partial(struct vm_area_struct 
*vma, unsigned long uaddr,
+       if (!(area->flags & VM_USERMAP))
+               return -EINVAL;
+ 
+-      if (kaddr + size > area->addr + area->size)
++      if (kaddr + size > area->addr + get_vm_area_size(area))
+               return -EINVAL;
+ 
+       do {
+diff --git a/net/9p/client.c b/net/9p/client.c
+index 142afe70edb9..f1517ca8aba3 100644
+--- a/net/9p/client.c
++++ b/net/9p/client.c
+@@ -1058,7 +1058,7 @@ struct p9_client *p9_client_create(const char *dev_name, 
char *options)
+               p9_debug(P9_DEBUG_ERROR,
+                        "Please specify a msize of at least 4k\n");
+               err = -EINVAL;
+-              goto free_client;
++              goto close_trans;
+       }
+ 
+       err = p9_client_version(clnt);
+diff --git a/net/phonet/pep.c b/net/phonet/pep.c
+index 850a86cde0b3..f6aa532bcbf6 100644
+--- a/net/phonet/pep.c
++++ b/net/phonet/pep.c
+@@ -131,7 +131,7 @@ static int pep_indicate(struct sock *sk, u8 id, u8 code,
+       ph->utid = 0;
+       ph->message_id = id;
+       ph->pipe_handle = pn->pipe_handle;
+-      ph->data[0] = code;
++      ph->error_code = code;
+       return pn_skb_send(sk, skb, NULL);
+ }
+ 
+@@ -152,7 +152,7 @@ static int pipe_handler_request(struct sock *sk, u8 id, u8 
code,
+       ph->utid = id; /* whatever */
+       ph->message_id = id;
+       ph->pipe_handle = pn->pipe_handle;
+-      ph->data[0] = code;
++      ph->error_code = code;
+       return pn_skb_send(sk, skb, NULL);
+ }
+ 
+@@ -207,7 +207,7 @@ static int pep_ctrlreq_error(struct sock *sk, struct 
sk_buff *oskb, u8 code,
+       struct pnpipehdr *ph;
+       struct sockaddr_pn dst;
+       u8 data[4] = {
+-              oph->data[0], /* PEP type */
++              oph->pep_type, /* PEP type */
+               code, /* error code, at an unusual offset */
+               PAD, PAD,
+       };
+@@ -220,7 +220,7 @@ static int pep_ctrlreq_error(struct sock *sk, struct 
sk_buff *oskb, u8 code,
+       ph->utid = oph->utid;
+       ph->message_id = PNS_PEP_CTRL_RESP;
+       ph->pipe_handle = oph->pipe_handle;
+-      ph->data[0] = oph->data[1]; /* CTRL id */
++      ph->data0 = oph->data[0]; /* CTRL id */
+ 
+       pn_skb_get_src_sockaddr(oskb, &dst);
+       return pn_skb_send(sk, skb, &dst);
+@@ -271,17 +271,17 @@ static int pipe_rcv_status(struct sock *sk, struct 
sk_buff *skb)
+               return -EINVAL;
+ 
+       hdr = pnp_hdr(skb);
+-      if (hdr->data[0] != PN_PEP_TYPE_COMMON) {
++      if (hdr->pep_type != PN_PEP_TYPE_COMMON) {
+               net_dbg_ratelimited("Phonet unknown PEP type: %u\n",
+-                                  (unsigned int)hdr->data[0]);
++                                  (unsigned int)hdr->pep_type);
+               return -EOPNOTSUPP;
+       }
+ 
+-      switch (hdr->data[1]) {
++      switch (hdr->data[0]) {
+       case PN_PEP_IND_FLOW_CONTROL:
+               switch (pn->tx_fc) {
+               case PN_LEGACY_FLOW_CONTROL:
+-                      switch (hdr->data[4]) {
++                      switch (hdr->data[3]) {
+                       case PEP_IND_BUSY:
+                               atomic_set(&pn->tx_credits, 0);
+                               break;
+@@ -291,7 +291,7 @@ static int pipe_rcv_status(struct sock *sk, struct sk_buff 
*skb)
+                       }
+                       break;
+               case PN_ONE_CREDIT_FLOW_CONTROL:
+-                      if (hdr->data[4] == PEP_IND_READY)
++                      if (hdr->data[3] == PEP_IND_READY)
+                               atomic_set(&pn->tx_credits, wake = 1);
+                       break;
+               }
+@@ -300,12 +300,12 @@ static int pipe_rcv_status(struct sock *sk, struct 
sk_buff *skb)
+       case PN_PEP_IND_ID_MCFC_GRANT_CREDITS:
+               if (pn->tx_fc != PN_MULTI_CREDIT_FLOW_CONTROL)
+                       break;
+-              atomic_add(wake = hdr->data[4], &pn->tx_credits);
++              atomic_add(wake = hdr->data[3], &pn->tx_credits);
+               break;
+ 
+       default:
+               net_dbg_ratelimited("Phonet unknown PEP indication: %u\n",
+-                                  (unsigned int)hdr->data[1]);
++                                  (unsigned int)hdr->data[0]);
+               return -EOPNOTSUPP;
+       }
+       if (wake)
+@@ -317,7 +317,7 @@ static int pipe_rcv_created(struct sock *sk, struct 
sk_buff *skb)
+ {
+       struct pep_sock *pn = pep_sk(sk);
+       struct pnpipehdr *hdr = pnp_hdr(skb);
+-      u8 n_sb = hdr->data[0];
++      u8 n_sb = hdr->data0;
+ 
+       pn->rx_fc = pn->tx_fc = PN_LEGACY_FLOW_CONTROL;
+       __skb_pull(skb, sizeof(*hdr));
+@@ -505,7 +505,7 @@ static int pep_connresp_rcv(struct sock *sk, struct 
sk_buff *skb)
+               return -ECONNREFUSED;
+ 
+       /* Parse sub-blocks */
+-      n_sb = hdr->data[4];
++      n_sb = hdr->data[3];
+       while (n_sb > 0) {
+               u8 type, buf[6], len = sizeof(buf);
+               const u8 *data = pep_get_sb(skb, &type, &len, buf);
+@@ -738,7 +738,7 @@ static int pipe_do_remove(struct sock *sk)
+       ph->utid = 0;
+       ph->message_id = PNS_PIPE_REMOVE_REQ;
+       ph->pipe_handle = pn->pipe_handle;
+-      ph->data[0] = PAD;
++      ph->data0 = PAD;
+       return pn_skb_send(sk, skb, NULL);
+ }
+ 
+@@ -815,7 +815,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int 
flags, int *errp)
+       peer_type = hdr->other_pep_type << 8;
+ 
+       /* Parse sub-blocks (options) */
+-      n_sb = hdr->data[4];
++      n_sb = hdr->data[3];
+       while (n_sb > 0) {
+               u8 type, buf[1], len = sizeof(buf);
+               const u8 *data = pep_get_sb(skb, &type, &len, buf);
+@@ -1106,7 +1106,7 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff 
*skb)
+       ph->utid = 0;
+       if (pn->aligned) {
+               ph->message_id = PNS_PIPE_ALIGNED_DATA;
+-              ph->data[0] = 0; /* padding */
++              ph->data0 = 0; /* padding */
+       } else
+               ph->message_id = PNS_PIPE_DATA;
+       ph->pipe_handle = pn->pipe_handle;
+diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
+index 3ef174531344..23ab0d169c11 100644
+--- a/sound/soc/fsl/fsl_esai.c
++++ b/sound/soc/fsl/fsl_esai.c
+@@ -396,7 +396,8 @@ static int fsl_esai_set_dai_fmt(struct snd_soc_dai *dai, 
unsigned int fmt)
+               break;
+       case SND_SOC_DAIFMT_RIGHT_J:
+               /* Data on rising edge of bclk, frame high, right aligned */
+-              xccr |= ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP | ESAI_xCR_xWA;
++              xccr |= ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP;
++              xcr  |= ESAI_xCR_xWA;
+               break;
+       case SND_SOC_DAIFMT_DSP_A:
+               /* Data on rising edge of bclk, frame high, 1clk before data */
+@@ -453,12 +454,12 @@ static int fsl_esai_set_dai_fmt(struct snd_soc_dai *dai, 
unsigned int fmt)
+               return -EINVAL;
+       }
+ 
+-      mask = ESAI_xCR_xFSL | ESAI_xCR_xFSR;
++      mask = ESAI_xCR_xFSL | ESAI_xCR_xFSR | ESAI_xCR_xWA;
+       regmap_update_bits(esai_priv->regmap, REG_ESAI_TCR, mask, xcr);
+       regmap_update_bits(esai_priv->regmap, REG_ESAI_RCR, mask, xcr);
+ 
+       mask = ESAI_xCCR_xCKP | ESAI_xCCR_xHCKP | ESAI_xCCR_xFSP |
+-              ESAI_xCCR_xFSD | ESAI_xCCR_xCKD | ESAI_xCR_xWA;
++              ESAI_xCCR_xFSD | ESAI_xCCR_xCKD;
+       regmap_update_bits(esai_priv->regmap, REG_ESAI_TCCR, mask, xccr);
+       regmap_update_bits(esai_priv->regmap, REG_ESAI_RCCR, mask, xccr);
+ 
+diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
+index d6b48c796bfc..086fe4d27f60 100644
+--- a/sound/soc/soc-topology.c
++++ b/sound/soc/soc-topology.c
+@@ -1989,6 +1989,7 @@ int snd_soc_tplg_component_load(struct snd_soc_component 
*comp,
+       struct snd_soc_tplg_ops *ops, const struct firmware *fw, u32 id)
+ {
+       struct soc_tplg tplg;
++      int ret;
+ 
+       /* setup parsing context */
+       memset(&tplg, 0, sizeof(tplg));
+@@ -2002,7 +2003,12 @@ int snd_soc_tplg_component_load(struct 
snd_soc_component *comp,
+       tplg.bytes_ext_ops = ops->bytes_ext_ops;
+       tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count;
+ 
+-      return soc_tplg_load(&tplg);
++      ret = soc_tplg_load(&tplg);
++      /* free the created components if fail to load topology */
++      if (ret)
++              snd_soc_tplg_component_remove(comp, SND_SOC_TPLG_INDEX_ALL);
++
++      return ret;
+ }
+ EXPORT_SYMBOL_GPL(snd_soc_tplg_component_load);
+ 
+diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
+index 29d015e2d900..b87221efdf7e 100644
+--- a/tools/perf/util/auxtrace.c
++++ b/tools/perf/util/auxtrace.c
+@@ -1244,9 +1244,9 @@ static int __auxtrace_mmap__read(struct auxtrace_mmap 
*mm,
+       }
+ 
+       /* padding must be written by fn() e.g. record__process_auxtrace() */
+-      padding = size & 7;
++      padding = size & (PERF_AUXTRACE_RECORD_ALIGNMENT - 1);
+       if (padding)
+-              padding = 8 - padding;
++              padding = PERF_AUXTRACE_RECORD_ALIGNMENT - padding;
+ 
+       memset(&ev, 0, sizeof(ev));
+       ev.auxtrace.header.type = PERF_RECORD_AUXTRACE;
+diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h
+index 26fb1ee5746a..1b6963e09934 100644
+--- a/tools/perf/util/auxtrace.h
++++ b/tools/perf/util/auxtrace.h
+@@ -37,6 +37,9 @@ struct record_opts;
+ struct auxtrace_info_event;
+ struct events_stats;
+ 
++/* Auxtrace records must have the same alignment as perf event records */
++#define PERF_AUXTRACE_RECORD_ALIGNMENT 8
++
+ enum auxtrace_type {
+       PERF_AUXTRACE_UNKNOWN,
+       PERF_AUXTRACE_INTEL_PT,
+diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c 
b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+index d27715ff9a5f..94764efb0a6a 100644
+--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+@@ -26,6 +26,7 @@
+ 
+ #include "../cache.h"
+ #include "../util.h"
++#include "../auxtrace.h"
+ 
+ #include "intel-pt-insn-decoder.h"
+ #include "intel-pt-pkt-decoder.h"
+@@ -1311,7 +1312,6 @@ static int intel_pt_overflow(struct intel_pt_decoder 
*decoder)
+ {
+       intel_pt_log("ERROR: Buffer overflow\n");
+       intel_pt_clear_tx_flags(decoder);
+-      decoder->cbr = 0;
+       decoder->timestamp_insn_cnt = 0;
+       decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC;
+       decoder->overflow = true;
+@@ -2351,6 +2351,34 @@ static int intel_pt_tsc_cmp(uint64_t tsc1, uint64_t 
tsc2)
+       }
+ }
+ 
++#define MAX_PADDING (PERF_AUXTRACE_RECORD_ALIGNMENT - 1)
++
++/**
++ * adj_for_padding - adjust overlap to account for padding.
++ * @buf_b: second buffer
++ * @buf_a: first buffer
++ * @len_a: size of first buffer
++ *
++ * @buf_a might have up to 7 bytes of padding appended. Adjust the overlap
++ * accordingly.
++ *
++ * Return: A pointer into @buf_b from where non-overlapped data starts
++ */
++static unsigned char *adj_for_padding(unsigned char *buf_b,
++                                    unsigned char *buf_a, size_t len_a)
++{
++      unsigned char *p = buf_b - MAX_PADDING;
++      unsigned char *q = buf_a + len_a - MAX_PADDING;
++      int i;
++
++      for (i = MAX_PADDING; i; i--, p++, q++) {
++              if (*p != *q)
++                      break;
++      }
++
++      return p;
++}
++
+ /**
+  * intel_pt_find_overlap_tsc - determine start of non-overlapped trace data
+  *                             using TSC.
+@@ -2401,8 +2429,11 @@ static unsigned char 
*intel_pt_find_overlap_tsc(unsigned char *buf_a,
+ 
+                       /* Same TSC, so buffers are consecutive */
+                       if (!cmp && rem_b >= rem_a) {
++                              unsigned char *start;
++
+                               *consecutive = true;
+-                              return buf_b + len_b - (rem_b - rem_a);
++                              start = buf_b + len_b - (rem_b - rem_a);
++                              return adj_for_padding(start, buf_a, len_a);
+                       }
+                       if (cmp < 0)
+                               return buf_b; /* tsc_a < tsc_b => no overlap */
+@@ -2465,7 +2496,7 @@ unsigned char *intel_pt_find_overlap(unsigned char 
*buf_a, size_t len_a,
+               found = memmem(buf_a, len_a, buf_b, len_a);
+               if (found) {
+                       *consecutive = true;
+-                      return buf_b + len_a;
++                      return adj_for_padding(buf_b + len_a, buf_a, len_a);
+               }
+ 
+               /* Try again at next PSB in buffer 'a' */
+diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c
+index d40ab4cf8932..24c6621e2d95 100644
+--- a/tools/perf/util/intel-pt.c
++++ b/tools/perf/util/intel-pt.c
+@@ -2259,6 +2259,8 @@ int intel_pt_process_auxtrace_info(union perf_event 
*event,
+       }
+ 
+       pt->timeless_decoding = intel_pt_timeless_decoding(pt);
++      if (pt->timeless_decoding && !pt->tc.time_mult)
++              pt->tc.time_mult = 1;
+       pt->have_tsc = intel_pt_have_tsc(pt);
+       pt->sampling_mode = false;
+       pt->est_tsc = !pt->timeless_decoding;

Reply via email to