diff --git a/Makefile b/Makefile
index a872ece51ee5..d9397a912c31 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 9
-SUBLEVEL = 39
+SUBLEVEL = 40
 EXTRAVERSION =
 NAME = Roaring Lionus
 
@@ -629,6 +629,9 @@ include arch/$(SRCARCH)/Makefile
 
 KBUILD_CFLAGS  += $(call cc-option,-fno-delete-null-pointer-checks,)
 KBUILD_CFLAGS  += $(call cc-disable-warning,frame-address,)
+KBUILD_CFLAGS  += $(call cc-disable-warning, format-truncation)
+KBUILD_CFLAGS  += $(call cc-disable-warning, format-overflow)
+KBUILD_CFLAGS  += $(call cc-disable-warning, int-in-bool-context)
 
 ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
 KBUILD_CFLAGS  += $(call cc-option,-ffunction-sections,)
diff --git a/arch/mips/include/asm/branch.h b/arch/mips/include/asm/branch.h
index de781cf54bc7..da80878f2c0d 100644
--- a/arch/mips/include/asm/branch.h
+++ b/arch/mips/include/asm/branch.h
@@ -74,10 +74,7 @@ static inline int compute_return_epc(struct pt_regs *regs)
                        return __microMIPS_compute_return_epc(regs);
                if (cpu_has_mips16)
                        return __MIPS16e_compute_return_epc(regs);
-               return regs->cp0_epc;
-       }
-
-       if (!delay_slot(regs)) {
+       } else if (!delay_slot(regs)) {
                regs->cp0_epc += 4;
                return 0;
        }
diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c
index c86b66b57fc6..c3f2fb34751e 100644
--- a/arch/mips/kernel/branch.c
+++ b/arch/mips/kernel/branch.c
@@ -399,7 +399,7 @@ int __MIPS16e_compute_return_epc(struct pt_regs *regs)
  *
  * @regs:      Pointer to pt_regs
  * @insn:      branch instruction to decode
- * @returns:   -EFAULT on error and forces SIGBUS, and on success
+ * @returns:   -EFAULT on error and forces SIGILL, and on success
  *             returns 0 or BRANCH_LIKELY_TAKEN as appropriate after
  *             evaluating the branch.
  *
@@ -431,7 +431,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
                        /* Fall through */
                case jr_op:
                        if (NO_R6EMU && insn.r_format.func == jr_op)
-                               goto sigill_r6;
+                               goto sigill_r2r6;
                        regs->cp0_epc = regs->regs[insn.r_format.rs];
                        break;
                }
@@ -446,7 +446,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
                switch (insn.i_format.rt) {
                case bltzl_op:
                        if (NO_R6EMU)
-                               goto sigill_r6;
+                               goto sigill_r2r6;
                case bltz_op:
                        if ((long)regs->regs[insn.i_format.rs] < 0) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
@@ -459,7 +459,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
 
                case bgezl_op:
                        if (NO_R6EMU)
-                               goto sigill_r6;
+                               goto sigill_r2r6;
                case bgez_op:
                        if ((long)regs->regs[insn.i_format.rs] >= 0) {
                                epc = epc + 4 + (insn.i_format.simmediate << 2);
@@ -473,10 +473,8 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
                case bltzal_op:
                case bltzall_op:
                        if (NO_R6EMU && (insn.i_format.rs ||
-                           insn.i_format.rt == bltzall_op)) {
-                               ret = -SIGILL;
-                               break;
-                       }
+                           insn.i_format.rt == bltzall_op))
+                               goto sigill_r2r6;
                        regs->regs[31] = epc + 8;
                        /*
                         * OK we are here either because we hit a NAL
@@ -507,10 +505,8 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
                case bgezal_op:
                case bgezall_op:
                        if (NO_R6EMU && (insn.i_format.rs ||
-                           insn.i_format.rt == bgezall_op)) {
-                               ret = -SIGILL;
-                               break;
-                       }
+                           insn.i_format.rt == bgezall_op))
+                               goto sigill_r2r6;
                        regs->regs[31] = epc + 8;
                        /*
                         * OK we are here either because we hit a BAL
@@ -556,6 +552,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
        /*
         * These are unconditional and in j_format.
         */
+       case jalx_op:
        case jal_op:
                regs->regs[31] = regs->cp0_epc + 8;
        case j_op:
@@ -573,7 +570,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
         */
        case beql_op:
                if (NO_R6EMU)
-                       goto sigill_r6;
+                       goto sigill_r2r6;
        case beq_op:
                if (regs->regs[insn.i_format.rs] ==
                    regs->regs[insn.i_format.rt]) {
@@ -587,7 +584,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
 
        case bnel_op:
                if (NO_R6EMU)
-                       goto sigill_r6;
+                       goto sigill_r2r6;
        case bne_op:
                if (regs->regs[insn.i_format.rs] !=
                    regs->regs[insn.i_format.rt]) {
@@ -601,7 +598,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
 
        case blezl_op: /* not really i_format */
                if (!insn.i_format.rt && NO_R6EMU)
-                       goto sigill_r6;
+                       goto sigill_r2r6;
        case blez_op:
                /*
                 * Compact branches for R6 for the
@@ -636,7 +633,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
 
        case bgtzl_op:
                if (!insn.i_format.rt && NO_R6EMU)
-                       goto sigill_r6;
+                       goto sigill_r2r6;
        case bgtz_op:
                /*
                 * Compact branches for R6 for the
@@ -774,35 +771,27 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
 #else
        case bc6_op:
                /* Only valid for MIPS R6 */
-               if (!cpu_has_mips_r6) {
-                       ret = -SIGILL;
-                       break;
-               }
+               if (!cpu_has_mips_r6)
+                       goto sigill_r6;
                regs->cp0_epc += 8;
                break;
        case balc6_op:
-               if (!cpu_has_mips_r6) {
-                       ret = -SIGILL;
-                       break;
-               }
+               if (!cpu_has_mips_r6)
+                       goto sigill_r6;
                /* Compact branch: BALC */
                regs->regs[31] = epc + 4;
                epc += 4 + (insn.i_format.simmediate << 2);
                regs->cp0_epc = epc;
                break;
        case pop66_op:
-               if (!cpu_has_mips_r6) {
-                       ret = -SIGILL;
-                       break;
-               }
+               if (!cpu_has_mips_r6)
+                       goto sigill_r6;
                /* Compact branch: BEQZC || JIC */
                regs->cp0_epc += 8;
                break;
        case pop76_op:
-               if (!cpu_has_mips_r6) {
-                       ret = -SIGILL;
-                       break;
-               }
+               if (!cpu_has_mips_r6)
+                       goto sigill_r6;
                /* Compact branch: BNEZC || JIALC */
                if (!insn.i_format.rs) {
                        /* JIALC: set $31/ra */
@@ -814,10 +803,8 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
        case pop10_op:
        case pop30_op:
                /* Only valid for MIPS R6 */
-               if (!cpu_has_mips_r6) {
-                       ret = -SIGILL;
-                       break;
-               }
+               if (!cpu_has_mips_r6)
+                       goto sigill_r6;
                /*
                 * Compact branches:
                 * bovc, beqc, beqzalc, bnvc, bnec, bnezlac
@@ -831,11 +818,17 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
        return ret;
 
 sigill_dsp:
-       printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", 
current->comm);
-       force_sig(SIGBUS, current);
+       pr_info("%s: DSP branch but not DSP ASE - sending SIGILL.\n",
+               current->comm);
+       force_sig(SIGILL, current);
+       return -EFAULT;
+sigill_r2r6:
+       pr_info("%s: R2 branch but r2-to-r6 emulator is not present - sending 
SIGILL.\n",
+               current->comm);
+       force_sig(SIGILL, current);
        return -EFAULT;
 sigill_r6:
-       pr_info("%s: R2 branch but r2-to-r6 emulator is not preset - sending 
SIGILL.\n",
+       pr_info("%s: R6 branch but no MIPSr6 ISA support - sending SIGILL.\n",
                current->comm);
        force_sig(SIGILL, current);
        return -EFAULT;
diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c
index 4eff2aed7360..4c01ee5b88c9 100644
--- a/arch/mips/kernel/proc.c
+++ b/arch/mips/kernel/proc.c
@@ -83,7 +83,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
        }
 
        seq_printf(m, "isa\t\t\t:"); 
-       if (cpu_has_mips_r1)
+       if (cpu_has_mips_1)
                seq_printf(m, " mips1");
        if (cpu_has_mips_2)
                seq_printf(m, "%s", " mips2");
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c
index bf83dc1eecfb..3de026034c35 100644
--- a/arch/mips/kernel/ptrace.c
+++ b/arch/mips/kernel/ptrace.c
@@ -924,7 +924,7 @@ asmlinkage void syscall_trace_leave(struct pt_regs *regs)
        audit_syscall_exit(regs);
 
        if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
-               trace_sys_exit(regs, regs->regs[2]);
+               trace_sys_exit(regs, regs_return_value(regs));
 
        if (test_thread_flag(TIF_SYSCALL_TRACE))
                tracehook_report_syscall_exit(regs, 0);
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
index c29d397eee86..e6be1f6210ba 100644
--- a/arch/mips/kernel/scall32-o32.S
+++ b/arch/mips/kernel/scall32-o32.S
@@ -371,7 +371,7 @@ EXPORT(sys_call_table)
        PTR     sys_writev
        PTR     sys_cacheflush
        PTR     sys_cachectl
-       PTR     sys_sysmips
+       PTR     __sys_sysmips
        PTR     sys_ni_syscall                  /* 4150 */
        PTR     sys_getsid
        PTR     sys_fdatasync
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S
index 0687f96ee912..aa27dafa1c78 100644
--- a/arch/mips/kernel/scall64-64.S
+++ b/arch/mips/kernel/scall64-64.S
@@ -311,7 +311,7 @@ EXPORT(sys_call_table)
        PTR     sys_sched_getaffinity
        PTR     sys_cacheflush
        PTR     sys_cachectl
-       PTR     sys_sysmips
+       PTR     __sys_sysmips
        PTR     sys_io_setup                    /* 5200 */
        PTR     sys_io_destroy
        PTR     sys_io_getevents
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
index 0331ba39a065..37f608f2a76f 100644
--- a/arch/mips/kernel/scall64-n32.S
+++ b/arch/mips/kernel/scall64-n32.S
@@ -302,7 +302,7 @@ EXPORT(sysn32_call_table)
        PTR     compat_sys_sched_getaffinity
        PTR     sys_cacheflush
        PTR     sys_cachectl
-       PTR     sys_sysmips
+       PTR     __sys_sysmips
        PTR     compat_sys_io_setup                     /* 6200 */
        PTR     sys_io_destroy
        PTR     compat_sys_io_getevents
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
index 5a47042dd25f..7913a5cf6806 100644
--- a/arch/mips/kernel/scall64-o32.S
+++ b/arch/mips/kernel/scall64-o32.S
@@ -371,7 +371,7 @@ EXPORT(sys32_call_table)
        PTR     compat_sys_writev
        PTR     sys_cacheflush
        PTR     sys_cachectl
-       PTR     sys_sysmips
+       PTR     __sys_sysmips
        PTR     sys_ni_syscall                  /* 4150 */
        PTR     sys_getsid
        PTR     sys_fdatasync
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c
index 53a7ef9a8f32..4234b2d726c5 100644
--- a/arch/mips/kernel/syscall.c
+++ b/arch/mips/kernel/syscall.c
@@ -28,6 +28,7 @@
 #include <linux/elf.h>
 
 #include <asm/asm.h>
+#include <asm/asm-eva.h>
 #include <asm/branch.h>
 #include <asm/cachectl.h>
 #include <asm/cacheflush.h>
@@ -138,10 +139,12 @@ static inline int mips_atomic_set(unsigned long addr, 
unsigned long new)
                __asm__ __volatile__ (
                "       .set    "MIPS_ISA_ARCH_LEVEL"                   \n"
                "       li      %[err], 0                               \n"
-               "1:     ll      %[old], (%[addr])                       \n"
+               "1:                                                     \n"
+               user_ll("%[old]", "(%[addr])")
                "       move    %[tmp], %[new]                          \n"
-               "2:     sc      %[tmp], (%[addr])                       \n"
-               "       bnez    %[tmp], 4f                              \n"
+               "2:                                                     \n"
+               user_sc("%[tmp]", "(%[addr])")
+               "       beqz    %[tmp], 4f                              \n"
                "3:                                                     \n"
                "       .insn                                           \n"
                "       .subsection 2                                   \n"
@@ -199,6 +202,12 @@ static inline int mips_atomic_set(unsigned long addr, 
unsigned long new)
        unreachable();
 }
 
+/*
+ * mips_atomic_set() normally returns directly via syscall_exit potentially
+ * clobbering static registers, so be sure to preserve them.
+ */
+save_static_function(sys_sysmips);
+
 SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2)
 {
        switch (cmd) {
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
index f8b7bf836437..e9385bcd9723 100644
--- a/arch/mips/math-emu/cp1emu.c
+++ b/arch/mips/math-emu/cp1emu.c
@@ -2522,6 +2522,35 @@ static int fpu_emu(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
        return 0;
 }
 
+/*
+ * Emulate FPU instructions.
+ *
+ * If we use FPU hardware, then we have been typically called to handle
+ * an unimplemented operation, such as where an operand is a NaN or
+ * denormalized.  In that case exit the emulation loop after a single
+ * iteration so as to let hardware execute any subsequent instructions.
+ *
+ * If we have no FPU hardware or it has been disabled, then continue
+ * emulating floating-point instructions until one of these conditions
+ * has occurred:
+ *
+ * - a non-FPU instruction has been encountered,
+ *
+ * - an attempt to emulate has ended with a signal,
+ *
+ * - the ISA mode has been switched.
+ *
+ * We need to terminate the emulation loop if we got switched to the
+ * MIPS16 mode, whether supported or not, so that we do not attempt
+ * to emulate a MIPS16 instruction as a regular MIPS FPU instruction.
+ * Similarly if we got switched to the microMIPS mode and only the
+ * regular MIPS mode is supported, so that we do not attempt to emulate
+ * a microMIPS instruction as a regular MIPS FPU instruction.  Or if
+ * we got switched to the regular MIPS mode and only the microMIPS mode
+ * is supported, so that we do not attempt to emulate a regular MIPS
+ * instruction that should cause an Address Error exception instead.
+ * For simplicity we always terminate upon an ISA mode switch.
+ */
 int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
        int has_fpu, void *__user *fault_addr)
 {
@@ -2607,6 +2636,15 @@ int fpu_emulator_cop1Handler(struct pt_regs *xcp, struct 
mips_fpu_struct *ctx,
                        break;
                if (sig)
                        break;
+               /*
+                * We have to check for the ISA bit explicitly here,
+                * because `get_isa16_mode' may return 0 if support
+                * for code compression has been globally disabled,
+                * or otherwise we may produce the wrong signal or
+                * even proceed successfully where we must not.
+                */
+               if ((xcp->cp0_epc ^ prevepc) & 0x1)
+                       break;
 
                cond_resched();
        } while (xcp->cp0_epc > prevepc);
diff --git a/arch/powerpc/include/asm/atomic.h 
b/arch/powerpc/include/asm/atomic.h
index 2b90335194a7..a2cc8010cd72 100644
--- a/arch/powerpc/include/asm/atomic.h
+++ b/arch/powerpc/include/asm/atomic.h
@@ -560,7 +560,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, 
long a, long u)
  * Atomically increments @v by 1, so long as @v is non-zero.
  * Returns non-zero if @v was non-zero, and zero otherwise.
  */
-static __inline__ long atomic64_inc_not_zero(atomic64_t *v)
+static __inline__ int atomic64_inc_not_zero(atomic64_t *v)
 {
        long t1, t2;
 
@@ -579,7 +579,7 @@ static __inline__ long atomic64_inc_not_zero(atomic64_t *v)
        : "r" (&v->counter)
        : "cc", "xer", "memory");
 
-       return t1;
+       return t1 != 0;
 }
 
 #endif /* __powerpc64__ */
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index e7d9eca53af3..ceb168cd3b81 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -1283,7 +1283,7 @@ static inline void msr_check_and_clear(unsigned long bits)
                                "       .llong 0\n"                     \
                                ".previous"                             \
                        : "=r" (rval) \
-                       : "i" (CPU_FTR_CELL_TB_BUG), "i" (SPRN_TBRL)); \
+                       : "i" (CPU_FTR_CELL_TB_BUG), "i" (SPRN_TBRL) : "cr0"); \
                        rval;})
 #else
 #define mftb()         ({unsigned long rval;   \
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
index 6ca3b902f7b9..776c1a1f9bc2 100644
--- a/arch/powerpc/lib/sstep.c
+++ b/arch/powerpc/lib/sstep.c
@@ -687,8 +687,10 @@ int __kprobes analyse_instr(struct instruction_op *op, 
struct pt_regs *regs,
        case 19:
                switch ((instr >> 1) & 0x3ff) {
                case 0:         /* mcrf */
-                       rd = (instr >> 21) & 0x1c;
-                       ra = (instr >> 16) & 0x1c;
+                       rd = 7 - ((instr >> 23) & 0x7);
+                       ra = 7 - ((instr >> 18) & 0x7);
+                       rd *= 4;
+                       ra *= 4;
                        val = (regs->ccr >> ra) & 0xf;
                        regs->ccr = (regs->ccr & ~(0xfUL << rd)) | (val << rd);
                        goto instr_done;
@@ -968,6 +970,19 @@ int __kprobes analyse_instr(struct instruction_op *op, 
struct pt_regs *regs,
 #endif
 
                case 19:        /* mfcr */
+                       if ((instr >> 20) & 1) {
+                               imm = 0xf0000000UL;
+                               for (sh = 0; sh < 8; ++sh) {
+                                       if (instr & (0x80000 >> sh)) {
+                                               regs->gpr[rd] = regs->ccr & imm;
+                                               break;
+                                       }
+                                       imm >>= 4;
+                               }
+
+                               goto instr_done;
+                       }
+
                        regs->gpr[rd] = regs->ccr;
                        regs->gpr[rd] &= 0xffffffffUL;
                        goto instr_done;
diff --git a/arch/powerpc/mm/mmu_context_book3s64.c 
b/arch/powerpc/mm/mmu_context_book3s64.c
index 73bf6e14c3aa..a006f822b154 100644
--- a/arch/powerpc/mm/mmu_context_book3s64.c
+++ b/arch/powerpc/mm/mmu_context_book3s64.c
@@ -167,9 +167,15 @@ void destroy_context(struct mm_struct *mm)
        mm->context.cop_lockp = NULL;
 #endif /* CONFIG_PPC_ICSWX */
 
-       if (radix_enabled())
-               process_tb[mm->context.id].prtb1 = 0;
-       else
+       if (radix_enabled()) {
+               /*
+                * Radix doesn't have a valid bit in the process table
+                * entries. However we know that at least P9 implementation
+                * will avoid caching an entry with an invalid RTS field,
+                * and 0 is invalid. So this will do.
+                */
+               process_tb[mm->context.id].prtb0 = 0;
+       } else
                subpage_prot_free(mm);
        destroy_pagetable_page(mm);
        __destroy_context(mm->context.id);
diff --git a/arch/powerpc/platforms/pseries/lpar.c 
b/arch/powerpc/platforms/pseries/lpar.c
index f2c98f6c1c9c..a7bb872a0dc4 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -279,7 +279,7 @@ static long pSeries_lpar_hpte_updatepp(unsigned long slot,
                                       int ssize, unsigned long inv_flags)
 {
        unsigned long lpar_rc;
-       unsigned long flags = (newpp & 7) | H_AVPN;
+       unsigned long flags;
        unsigned long want_v;
 
        want_v = hpte_encode_avpn(vpn, psize, ssize);
@@ -287,6 +287,11 @@ static long pSeries_lpar_hpte_updatepp(unsigned long slot,
        pr_devel("    update: avpnv=%016lx, hash=%016lx, f=%lx, psize: %d ...",
                 want_v, slot, flags, psize);
 
+       flags = (newpp & 7) | H_AVPN;
+       if (mmu_has_feature(MMU_FTR_KERNEL_RO))
+               /* Move pp0 into bit 8 (IBM 55) */
+               flags |= (newpp & HPTE_R_PP0) >> 55;
+
        lpar_rc = plpar_pte_protect(flags, slot, want_v);
 
        if (lpar_rc == H_NOT_FOUND) {
@@ -358,6 +363,10 @@ static void pSeries_lpar_hpte_updateboltedpp(unsigned long 
newpp,
        BUG_ON(slot == -1);
 
        flags = newpp & 7;
+       if (mmu_has_feature(MMU_FTR_KERNEL_RO))
+               /* Move pp0 into bit 8 (IBM 55) */
+               flags |= (newpp & HPTE_R_PP0) >> 55;
+
        lpar_rc = plpar_pte_protect(flags, slot, 0);
 
        BUG_ON(lpar_rc != H_SUCCESS);
diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h
index 6ba0bf928909..6bc941be6921 100644
--- a/arch/s390/include/asm/syscall.h
+++ b/arch/s390/include/asm/syscall.h
@@ -64,6 +64,12 @@ static inline void syscall_get_arguments(struct task_struct 
*task,
 {
        unsigned long mask = -1UL;
 
+       /*
+        * No arguments for this syscall, there's nothing to do.
+        */
+       if (!n)
+               return;
+
        BUG_ON(i + n > 6);
 #ifdef CONFIG_COMPAT
        if (test_tsk_thread_flag(task, TIF_31BIT))
diff --git a/arch/x86/include/asm/xen/hypercall.h 
b/arch/x86/include/asm/xen/hypercall.h
index a12a047184ee..8b678af866f7 100644
--- a/arch/x86/include/asm/xen/hypercall.h
+++ b/arch/x86/include/asm/xen/hypercall.h
@@ -43,6 +43,7 @@
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
+#include <asm/smap.h>
 
 #include <xen/interface/xen.h>
 #include <xen/interface/sched.h>
@@ -214,10 +215,12 @@ privcmd_call(unsigned call,
        __HYPERCALL_DECLS;
        __HYPERCALL_5ARG(a1, a2, a3, a4, a5);
 
+       stac();
        asm volatile("call *%[call]"
                     : __HYPERCALL_5PARAM
                     : [call] "a" (&hypercall_page[call])
                     : __HYPERCALL_CLOBBER5);
+       clac();
 
        return (long)__res;
 }
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 931ced8ca345..d3e0d049a0c2 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -338,6 +338,14 @@ static void __init mp_override_legacy_irq(u8 bus_irq, u8 
polarity, u8 trigger,
        struct mpc_intsrc mp_irq;
 
        /*
+        * Check bus_irq boundary.
+        */
+       if (bus_irq >= NR_IRQS_LEGACY) {
+               pr_warn("Invalid bus_irq %u for legacy override\n", bus_irq);
+               return;
+       }
+
+       /*
         * Convert 'gsi' to 'ioapic.pin'.
         */
        ioapic = mp_find_ioapic(gsi);
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 7249f1500bcb..cf89928dbd46 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -2116,7 +2116,7 @@ static inline void __init check_timer(void)
                        int idx;
                        idx = find_irq_entry(apic1, pin1, mp_INT);
                        if (idx != -1 && irq_trigger(idx))
-                               unmask_ioapic_irq(irq_get_chip_data(0));
+                               unmask_ioapic_irq(irq_get_irq_data(0));
                }
                irq_domain_deactivate_irq(irq_data);
                irq_domain_activate_irq(irq_data);
diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index 6d52b94f4bb9..20fa7c84109d 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -571,3 +571,35 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2fc0, 
pci_invalid_bar);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6f60, pci_invalid_bar);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fa0, pci_invalid_bar);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, pci_invalid_bar);
+
+/*
+ * Apple MacBook Pro: Avoid [mem 0x7fa00000-0x7fbfffff]
+ *
+ * Using the [mem 0x7fa00000-0x7fbfffff] region, e.g., by assigning it to
+ * the 00:1c.0 Root Port, causes a conflict with [io 0x1804], which is used
+ * for soft poweroff and suspend-to-RAM.
+ *
+ * As far as we know, this is related to the address space, not to the Root
+ * Port itself.  Attaching the quirk to the Root Port is a convenience, but
+ * it could probably also be a standalone DMI quirk.
+ *
+ * https://bugzilla.kernel.org/show_bug.cgi?id=103211
+ */
+static void quirk_apple_mbp_poweroff(struct pci_dev *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct resource *res;
+
+       if ((!dmi_match(DMI_PRODUCT_NAME, "MacBookPro11,4") &&
+            !dmi_match(DMI_PRODUCT_NAME, "MacBookPro11,5")) ||
+           pdev->bus->number != 0 || pdev->devfn != PCI_DEVFN(0x1c, 0))
+               return;
+
+       res = request_mem_region(0x7fa00000, 0x200000,
+                                "MacBook Pro poweroff workaround");
+       if (res)
+               dev_info(dev, "claimed %s %pR\n", res->name, res);
+       else
+               dev_info(dev, "can't work around MacBook Pro poweroff issue\n");
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x8c10, 
quirk_apple_mbp_poweroff);
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 22ca89242518..79152dbc5528 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -147,7 +147,7 @@ static unsigned int ec_storm_threshold  __read_mostly = 8;
 module_param(ec_storm_threshold, uint, 0644);
 MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered 
as GPE storm");
 
-static bool ec_freeze_events __read_mostly = true;
+static bool ec_freeze_events __read_mostly = false;
 module_param(ec_freeze_events, bool, 0644);
 MODULE_PARM_DESC(ec_freeze_events, "Disabling event handling during 
suspend/resume");
 
@@ -1865,24 +1865,6 @@ int __init acpi_ec_ecdt_probe(void)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int acpi_ec_suspend_noirq(struct device *dev)
-{
-       struct acpi_ec *ec =
-               acpi_driver_data(to_acpi_device(dev));
-
-       acpi_ec_enter_noirq(ec);
-       return 0;
-}
-
-static int acpi_ec_resume_noirq(struct device *dev)
-{
-       struct acpi_ec *ec =
-               acpi_driver_data(to_acpi_device(dev));
-
-       acpi_ec_leave_noirq(ec);
-       return 0;
-}
-
 static int acpi_ec_suspend(struct device *dev)
 {
        struct acpi_ec *ec =
@@ -1904,7 +1886,6 @@ static int acpi_ec_resume(struct device *dev)
 #endif
 
 static const struct dev_pm_ops acpi_ec_pm = {
-       SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend_noirq, 
acpi_ec_resume_noirq)
        SET_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend, acpi_ec_resume)
 };
 
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 9ef3941eeff0..f3bc901ac930 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -2945,6 +2945,8 @@ static struct acpi_driver acpi_nfit_driver = {
 
 static __init int nfit_init(void)
 {
+       int ret;
+
        BUILD_BUG_ON(sizeof(struct acpi_table_nfit) != 40);
        BUILD_BUG_ON(sizeof(struct acpi_nfit_system_address) != 56);
        BUILD_BUG_ON(sizeof(struct acpi_nfit_memory_map) != 48);
@@ -2972,8 +2974,14 @@ static __init int nfit_init(void)
                return -ENOMEM;
 
        nfit_mce_register();
+       ret = acpi_bus_register_driver(&acpi_nfit_driver);
+       if (ret) {
+               nfit_mce_unregister();
+               destroy_workqueue(nfit_wq);
+       }
+
+       return ret;
 
-       return acpi_bus_register_driver(&acpi_nfit_driver);
 }
 
 static __exit void nfit_exit(void)
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index e023066e4215..8c7d0f33bd53 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -1029,8 +1029,6 @@ static struct generic_pm_domain_data 
*genpd_alloc_dev_data(struct device *dev,
 
        spin_unlock_irq(&dev->power.lock);
 
-       dev_pm_domain_set(dev, &genpd->domain);
-
        return gpd_data;
 
  err_free:
@@ -1044,8 +1042,6 @@ static struct generic_pm_domain_data 
*genpd_alloc_dev_data(struct device *dev,
 static void genpd_free_dev_data(struct device *dev,
                                struct generic_pm_domain_data *gpd_data)
 {
-       dev_pm_domain_set(dev, NULL);
-
        spin_lock_irq(&dev->power.lock);
 
        dev->power.subsys_data->domain_data = NULL;
@@ -1082,6 +1078,8 @@ static int genpd_add_device(struct generic_pm_domain 
*genpd, struct device *dev,
        if (ret)
                goto out;
 
+       dev_pm_domain_set(dev, &genpd->domain);
+
        genpd->device_count++;
        genpd->max_off_time_changed = true;
 
@@ -1143,6 +1141,8 @@ static int genpd_remove_device(struct generic_pm_domain 
*genpd,
        if (genpd->detach_dev)
                genpd->detach_dev(genpd, dev);
 
+       dev_pm_domain_set(dev, NULL);
+
        list_del_init(&pdd->list_node);
 
        mutex_unlock(&genpd->lock);
@@ -1244,7 +1244,7 @@ EXPORT_SYMBOL_GPL(pm_genpd_add_subdomain);
 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
                              struct generic_pm_domain *subdomain)
 {
-       struct gpd_link *link;
+       struct gpd_link *l, *link;
        int ret = -EINVAL;
 
        if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain))
@@ -1260,7 +1260,7 @@ int pm_genpd_remove_subdomain(struct generic_pm_domain 
*genpd,
                goto out;
        }
 
-       list_for_each_entry(link, &genpd->master_links, master_node) {
+       list_for_each_entry_safe(link, l, &genpd->master_links, master_node) {
                if (link->slave != subdomain)
                        continue;
 
@@ -1607,12 +1607,12 @@ EXPORT_SYMBOL_GPL(of_genpd_add_provider_onecell);
  */
 void of_genpd_del_provider(struct device_node *np)
 {
-       struct of_genpd_provider *cp;
+       struct of_genpd_provider *cp, *tmp;
        struct generic_pm_domain *gpd;
 
        mutex_lock(&gpd_list_lock);
        mutex_lock(&of_genpd_mutex);
-       list_for_each_entry(cp, &of_genpd_providers, link) {
+       list_for_each_entry_safe(cp, tmp, &of_genpd_providers, link) {
                if (cp->node == np) {
                        /*
                         * For each PM domain associated with the
@@ -1752,14 +1752,14 @@ EXPORT_SYMBOL_GPL(of_genpd_add_subdomain);
  */
 struct generic_pm_domain *of_genpd_remove_last(struct device_node *np)
 {
-       struct generic_pm_domain *gpd, *genpd = ERR_PTR(-ENOENT);
+       struct generic_pm_domain *gpd, *tmp, *genpd = ERR_PTR(-ENOENT);
        int ret;
 
        if (IS_ERR_OR_NULL(np))
                return ERR_PTR(-EINVAL);
 
        mutex_lock(&gpd_list_lock);
-       list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
+       list_for_each_entry_safe(gpd, tmp, &gpd_list, gpd_list_node) {
                if (gpd->provider == &np->fwnode) {
                        ret = genpd_remove(gpd);
                        genpd = ret ? ERR_PTR(ret) : gpd;
diff --git a/drivers/char/ipmi/ipmi_msghandler.c 
b/drivers/char/ipmi/ipmi_msghandler.c
index fcdd886819f5..172a9dc06ec9 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -3877,6 +3877,9 @@ static void smi_recv_tasklet(unsigned long val)
         * because the lower layer is allowed to hold locks while calling
         * message delivery.
         */
+
+       rcu_read_lock();
+
        if (!run_to_completion)
                spin_lock_irqsave(&intf->xmit_msgs_lock, flags);
        if (intf->curr_msg == NULL && !intf->in_shutdown) {
@@ -3899,6 +3902,8 @@ static void smi_recv_tasklet(unsigned long val)
        if (newmsg)
                intf->handlers->sender(intf->send_info, newmsg);
 
+       rcu_read_unlock();
+
        handle_new_recv_msgs(intf);
 }
 
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c
index 6958b5ce9145..510fc104bcdc 100644
--- a/drivers/char/ipmi/ipmi_ssif.c
+++ b/drivers/char/ipmi/ipmi_ssif.c
@@ -762,6 +762,11 @@ static void msg_done_handler(struct ssif_info *ssif_info, 
int result,
                               result, len, data[2]);
                } else if (data[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2
                           || data[1] != IPMI_GET_MSG_FLAGS_CMD) {
+                       /*
+                        * Don't abort here, maybe it was a queued
+                        * response to a previous command.
+                        */
+                       ipmi_ssif_unlock_cond(ssif_info, flags);
                        pr_warn(PFX "Invalid response getting flags: %x %x\n",
                                data[0], data[1]);
                } else {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index dcaf691f56b5..264899df9bfc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -1419,6 +1419,9 @@ static ssize_t amdgpu_ttm_vram_read(struct file *f, char 
__user *buf,
        if (size & 0x3 || *pos & 0x3)
                return -EINVAL;
 
+       if (*pos >= adev->mc.mc_vram_size)
+               return -ENXIO;
+
        while (size) {
                unsigned long flags;
                uint32_t value;
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index f59771da52ee..db7890cb254e 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -330,6 +330,13 @@ static bool drm_dp_sideband_msg_build(struct 
drm_dp_sideband_msg_rx *msg,
                        return false;
                }
 
+               /*
+                * ignore out-of-order messages or messages that are part of a
+                * failed transaction
+                */
+               if (!recv_hdr.somt && !msg->have_somt)
+                       return false;
+
                /* get length contained in this portion */
                msg->curchunk_len = recv_hdr.msg_len;
                msg->curchunk_hdrlen = hdrlen;
@@ -2168,7 +2175,7 @@ int drm_dp_mst_topology_mgr_resume(struct 
drm_dp_mst_topology_mgr *mgr)
 }
 EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume);
 
-static void drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up)
+static bool drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up)
 {
        int len;
        u8 replyblock[32];
@@ -2183,12 +2190,12 @@ static void drm_dp_get_one_sb_msg(struct 
drm_dp_mst_topology_mgr *mgr, bool up)
                               replyblock, len);
        if (ret != len) {
                DRM_DEBUG_KMS("failed to read DPCD down rep %d %d\n", len, ret);
-               return;
+               return false;
        }
        ret = drm_dp_sideband_msg_build(msg, replyblock, len, true);
        if (!ret) {
                DRM_DEBUG_KMS("sideband msg build failed %d\n", replyblock[0]);
-               return;
+               return false;
        }
        replylen = msg->curchunk_len + msg->curchunk_hdrlen;
 
@@ -2200,21 +2207,32 @@ static void drm_dp_get_one_sb_msg(struct 
drm_dp_mst_topology_mgr *mgr, bool up)
                ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply,
                                    replyblock, len);
                if (ret != len) {
-                       DRM_DEBUG_KMS("failed to read a chunk\n");
+                       DRM_DEBUG_KMS("failed to read a chunk (len %d, ret 
%d)\n",
+                                     len, ret);
+                       return false;
                }
+
                ret = drm_dp_sideband_msg_build(msg, replyblock, len, false);
-               if (ret == false)
+               if (!ret) {
                        DRM_DEBUG_KMS("failed to build sideband msg\n");
+                       return false;
+               }
+
                curreply += len;
                replylen -= len;
        }
+       return true;
 }
 
 static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)
 {
        int ret = 0;
 
-       drm_dp_get_one_sb_msg(mgr, false);
+       if (!drm_dp_get_one_sb_msg(mgr, false)) {
+               memset(&mgr->down_rep_recv, 0,
+                      sizeof(struct drm_dp_sideband_msg_rx));
+               return 0;
+       }
 
        if (mgr->down_rep_recv.have_eomt) {
                struct drm_dp_sideband_msg_tx *txmsg;
@@ -2270,7 +2288,12 @@ static int drm_dp_mst_handle_down_rep(struct 
drm_dp_mst_topology_mgr *mgr)
 static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
 {
        int ret = 0;
-       drm_dp_get_one_sb_msg(mgr, true);
+
+       if (!drm_dp_get_one_sb_msg(mgr, true)) {
+               memset(&mgr->up_req_recv, 0,
+                      sizeof(struct drm_dp_sideband_msg_rx));
+               return 0;
+       }
 
        if (mgr->up_req_recv.have_eomt) {
                struct drm_dp_sideband_msg_req_body msg;
@@ -2322,7 +2345,9 @@ static int drm_dp_mst_handle_up_req(struct 
drm_dp_mst_topology_mgr *mgr)
                        DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", 
msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn);
                }
 
-               drm_dp_put_mst_branch_device(mstb);
+               if (mstb)
+                       drm_dp_put_mst_branch_device(mstb);
+
                memset(&mgr->up_req_recv, 0, sizeof(struct 
drm_dp_sideband_msg_rx));
        }
        return ret;
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
index 56bb758f4e33..7bb1e531325b 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -30,6 +30,7 @@
 #include "radeon_audio.h"
 #include "atom.h"
 #include <linux/backlight.h>
+#include <linux/dmi.h>
 
 extern int atom_debug;
 
@@ -2183,9 +2184,17 @@ int radeon_atom_pick_dig_encoder(struct drm_encoder 
*encoder, int fe_idx)
                goto assigned;
        }
 
-       /* on DCE32 and encoder can driver any block so just crtc id */
+       /*
+        * On DCE32 any encoder can drive any block so usually just use crtc id,
+        * but Apple thinks different at least on iMac10,1, so there use linkb,
+        * otherwise the internal eDP panel will stay dark.
+        */
        if (ASIC_IS_DCE32(rdev)) {
-               enc_idx = radeon_crtc->crtc_id;
+               if (dmi_match(DMI_PRODUCT_NAME, "iMac10,1"))
+                       enc_idx = (dig->linkb) ? 1 : 0;
+               else
+                       enc_idx = radeon_crtc->crtc_id;
+
                goto assigned;
        }
 
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c
index ea36dc4dd5d2..24810492d2c1 100644
--- a/drivers/gpu/drm/radeon/ci_dpm.c
+++ b/drivers/gpu/drm/radeon/ci_dpm.c
@@ -782,6 +782,12 @@ bool ci_dpm_vblank_too_short(struct radeon_device *rdev)
        if (r600_dpm_get_vrefresh(rdev) > 120)
                return true;
 
+       /* disable mclk switching if the refresh is >120Hz, even if the
+        * blanking period would allow it
+        */
+       if (r600_dpm_get_vrefresh(rdev) > 120)
+               return true;
+
        if (vblank_time < switch_limit)
                return true;
        else
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 35cc16f9fec9..d09276ec7e90 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1343,7 +1343,6 @@ int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned 
mem_type)
                       mem_type);
                return ret;
        }
-       fence_put(man->move);
 
        man->use_type = false;
        man->has_type = false;
@@ -1355,6 +1354,9 @@ int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned 
mem_type)
                ret = (*man->func->takedown)(man);
        }
 
+       fence_put(man->move);
+       man->move = NULL;
+
        return ret;
 }
 EXPORT_SYMBOL(ttm_bo_clean_mm);
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index 8fd108d89527..63e82f8e8308 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -518,6 +518,11 @@ static int addr_resolve(struct sockaddr *src_in,
        struct dst_entry *dst;
        int ret;
 
+       if (!addr->net) {
+               pr_warn_ratelimited("%s: missing namespace\n", __func__);
+               return -EINVAL;
+       }
+
        if (src_in->sa_family == AF_INET) {
                struct rtable *rt = NULL;
                const struct sockaddr_in *dst_in4 =
@@ -555,7 +560,6 @@ static int addr_resolve(struct sockaddr *src_in,
        }
 
        addr->bound_dev_if = ndev->ifindex;
-       addr->net = dev_net(ndev);
        dev_put(ndev);
 
        return ret;
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index f2d40c05ef9e..809a02800102 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -976,6 +976,8 @@ int rdma_init_qp_attr(struct rdma_cm_id *id, struct 
ib_qp_attr *qp_attr,
                } else
                        ret = iw_cm_init_qp_attr(id_priv->cm_id.iw, qp_attr,
                                                 qp_attr_mask);
+               qp_attr->port_num = id_priv->id.port_num;
+               *qp_attr_mask |= IB_QP_PORT;
        } else
                ret = -ENOSYS;
 
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index 1fb31a47966d..0a260a06876d 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -1823,7 +1823,7 @@ mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr,
        mr->ndescs = sg_nents;
 
        for_each_sg(sgl, sg, sg_nents, i) {
-               if (unlikely(i > mr->max_descs))
+               if (unlikely(i >= mr->max_descs))
                        break;
                klms[i].va = cpu_to_be64(sg_dma_address(sg) + sg_offset);
                klms[i].bcount = cpu_to_be32(sg_dma_len(sg) - sg_offset);
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c 
b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 140f3f354cf3..e46e2b095c18 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -83,6 +83,7 @@ static struct scsi_host_template iscsi_iser_sht;
 static struct iscsi_transport iscsi_iser_transport;
 static struct scsi_transport_template *iscsi_iser_scsi_transport;
 static struct workqueue_struct *release_wq;
+static DEFINE_MUTEX(unbind_iser_conn_mutex);
 struct iser_global ig;
 
 int iser_debug_level = 0;
@@ -550,12 +551,14 @@ iscsi_iser_conn_stop(struct iscsi_cls_conn *cls_conn, int 
flag)
         */
        if (iser_conn) {
                mutex_lock(&iser_conn->state_mutex);
+               mutex_lock(&unbind_iser_conn_mutex);
                iser_conn_terminate(iser_conn);
                iscsi_conn_stop(cls_conn, flag);
 
                /* unbind */
                iser_conn->iscsi_conn = NULL;
                conn->dd_data = NULL;
+               mutex_unlock(&unbind_iser_conn_mutex);
 
                complete(&iser_conn->stop_completion);
                mutex_unlock(&iser_conn->state_mutex);
@@ -973,13 +976,21 @@ static int iscsi_iser_slave_alloc(struct scsi_device 
*sdev)
        struct iser_conn *iser_conn;
        struct ib_device *ib_dev;
 
+       mutex_lock(&unbind_iser_conn_mutex);
+
        session = starget_to_session(scsi_target(sdev))->dd_data;
        iser_conn = session->leadconn->dd_data;
+       if (!iser_conn) {
+               mutex_unlock(&unbind_iser_conn_mutex);
+               return -ENOTCONN;
+       }
        ib_dev = iser_conn->ib_conn.device->ib_device;
 
        if (!(ib_dev->attrs.device_cap_flags & IB_DEVICE_SG_GAPS_REG))
                blk_queue_virt_boundary(sdev->request_queue, ~MASK_4K);
 
+       mutex_unlock(&unbind_iser_conn_mutex);
+
        return 0;
 }
 
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c 
b/drivers/infiniband/ulp/isert/ib_isert.c
index 6dd43f63238e..39d28375aa37 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -1447,7 +1447,7 @@ static void
 isert_login_recv_done(struct ib_cq *cq, struct ib_wc *wc)
 {
        struct isert_conn *isert_conn = wc->qp->qp_context;
-       struct ib_device *ib_dev = isert_conn->cm_id->device;
+       struct ib_device *ib_dev = isert_conn->device->ib_device;
 
        if (unlikely(wc->status != IB_WC_SUCCESS)) {
                isert_print_wc(wc, "login recv");
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index 89abfdb539ac..c84c685056b9 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -434,8 +434,10 @@ static int i8042_start(struct serio *serio)
 {
        struct i8042_port *port = serio->port_data;
 
+       spin_lock_irq(&i8042_lock);
        port->exists = true;
-       mb();
+       spin_unlock_irq(&i8042_lock);
+
        return 0;
 }
 
@@ -448,16 +450,20 @@ static void i8042_stop(struct serio *serio)
 {
        struct i8042_port *port = serio->port_data;
 
+       spin_lock_irq(&i8042_lock);
        port->exists = false;
+       port->serio = NULL;
+       spin_unlock_irq(&i8042_lock);
 
        /*
+        * We need to make sure that interrupt handler finishes using
+        * our serio port before we return from this function.
         * We synchronize with both AUX and KBD IRQs because there is
         * a (very unlikely) chance that AUX IRQ is raised for KBD port
         * and vice versa.
         */
        synchronize_irq(I8042_AUX_IRQ);
        synchronize_irq(I8042_KBD_IRQ);
-       port->serio = NULL;
 }
 
 /*
@@ -574,7 +580,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
 
        spin_unlock_irqrestore(&i8042_lock, flags);
 
-       if (likely(port->exists && !filtered))
+       if (likely(serio && !filtered))
                serio_interrupt(serio, data, dfl);
 
  out:
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index ac8235bda61b..0d437c98ab08 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -431,7 +431,7 @@ static struct pgpath *choose_pgpath(struct multipath *m, 
size_t nr_bytes)
        unsigned long flags;
        struct priority_group *pg;
        struct pgpath *pgpath;
-       bool bypassed = true;
+       unsigned bypassed = 1;
 
        if (!atomic_read(&m->nr_valid_paths)) {
                clear_bit(MPATHF_QUEUE_IO, &m->flags);
@@ -470,7 +470,7 @@ static struct pgpath *choose_pgpath(struct multipath *m, 
size_t nr_bytes)
         */
        do {
                list_for_each_entry(pg, &m->priority_groups, list) {
-                       if (pg->bypassed == bypassed)
+                       if (pg->bypassed == !!bypassed)
                                continue;
                        pgpath = choose_path_in_pg(m, pg, nr_bytes);
                        if (!IS_ERR_OR_NULL(pgpath)) {
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 29e2df5cd77b..81a78757bc78 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1073,7 +1073,7 @@ static void raid1_make_request(struct mddev *mddev, 
struct bio * bio)
                 */
                DEFINE_WAIT(w);
                for (;;) {
-                       flush_signals(current);
+                       sigset_t full, old;
                        prepare_to_wait(&conf->wait_barrier,
                                        &w, TASK_INTERRUPTIBLE);
                        if (bio_end_sector(bio) <= mddev->suspend_lo ||
@@ -1082,7 +1082,10 @@ static void raid1_make_request(struct mddev *mddev, 
struct bio * bio)
                             !md_cluster_ops->area_resyncing(mddev, WRITE,
                                     bio->bi_iter.bi_sector, 
bio_end_sector(bio))))
                                break;
+                       sigfillset(&full);
+                       sigprocmask(SIG_BLOCK, &full, &old);
                        schedule();
+                       sigprocmask(SIG_SETMASK, &old, NULL);
                }
                finish_wait(&conf->wait_barrier, &w);
        }
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index f34ad2be66a1..8f117d6372c9 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5300,12 +5300,15 @@ static void raid5_make_request(struct mddev *mddev, 
struct bio * bi)
                                 * userspace, we want an interruptible
                                 * wait.
                                 */
-                               flush_signals(current);
                                prepare_to_wait(&conf->wait_for_overlap,
                                                &w, TASK_INTERRUPTIBLE);
                                if (logical_sector >= mddev->suspend_lo &&
                                    logical_sector < mddev->suspend_hi) {
+                                       sigset_t full, old;
+                                       sigfillset(&full);
+                                       sigprocmask(SIG_BLOCK, &full, &old);
                                        schedule();
+                                       sigprocmask(SIG_SETMASK, &old, NULL);
                                        do_prepare = true;
                                }
                                goto retry;
@@ -7557,12 +7560,10 @@ static void end_reshape(struct r5conf *conf)
 {
 
        if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
-               struct md_rdev *rdev;
 
                spin_lock_irq(&conf->device_lock);
                conf->previous_raid_disks = conf->raid_disks;
-               rdev_for_each(rdev, conf->mddev)
-                       rdev->data_offset = rdev->new_data_offset;
+               md_finish_reshape(conf->mddev);
                smp_wmb();
                conf->reshape_progress = MaxSector;
                conf->mddev->reshape_position = MaxSector;
diff --git a/drivers/media/pci/cx88/cx88-cards.c 
b/drivers/media/pci/cx88/cx88-cards.c
index 8f2556ec3971..61611d1682d1 100644
--- a/drivers/media/pci/cx88/cx88-cards.c
+++ b/drivers/media/pci/cx88/cx88-cards.c
@@ -3691,7 +3691,14 @@ struct cx88_core *cx88_core_create(struct pci_dev *pci, 
int nr)
        core->nr = nr;
        sprintf(core->name, "cx88[%d]", core->nr);
 
-       core->tvnorm = V4L2_STD_NTSC_M;
+       /*
+        * Note: Setting initial standard here would cause first call to
+        * cx88_set_tvnorm() to return without programming any registers.  Leave
+        * it blank for at this point and it will get set later in
+        * cx8800_initdev()
+        */
+       core->tvnorm  = 0;
+
        core->width   = 320;
        core->height  = 240;
        core->field   = V4L2_FIELD_INTERLACED;
diff --git a/drivers/media/pci/cx88/cx88-video.c 
b/drivers/media/pci/cx88/cx88-video.c
index d83eb3b10f54..3b140ad598de 100644
--- a/drivers/media/pci/cx88/cx88-video.c
+++ b/drivers/media/pci/cx88/cx88-video.c
@@ -1422,7 +1422,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
 
        /* initial device configuration */
        mutex_lock(&core->lock);
-       cx88_set_tvnorm(core, core->tvnorm);
+       cx88_set_tvnorm(core, V4L2_STD_NTSC_M);
        v4l2_ctrl_handler_setup(&core->video_hdl);
        v4l2_ctrl_handler_setup(&core->audio_hdl);
        cx88_video_mux(core, 0);
diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c 
b/drivers/media/platform/s5p-jpeg/jpeg-core.c
index 52dc7941db65..1da2c94e1dca 100644
--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c
+++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c
@@ -1099,10 +1099,10 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data 
*result,
                               struct s5p_jpeg_ctx *ctx)
 {
        int c, components = 0, notfound, n_dht = 0, n_dqt = 0;
-       unsigned int height, width, word, subsampling = 0, sos = 0, sof = 0,
-                    sof_len = 0;
-       unsigned int dht[S5P_JPEG_MAX_MARKER], dht_len[S5P_JPEG_MAX_MARKER],
-                    dqt[S5P_JPEG_MAX_MARKER], dqt_len[S5P_JPEG_MAX_MARKER];
+       unsigned int height = 0, width = 0, word, subsampling = 0;
+       unsigned int sos = 0, sof = 0, sof_len = 0;
+       unsigned int dht[S5P_JPEG_MAX_MARKER], dht_len[S5P_JPEG_MAX_MARKER];
+       unsigned int dqt[S5P_JPEG_MAX_MARKER], dqt_len[S5P_JPEG_MAX_MARKER];
        long length;
        struct s5p_jpeg_buffer jpeg_buffer;
 
diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c
index 86cc70fe2534..2d4b83635018 100644
--- a/drivers/media/rc/imon.c
+++ b/drivers/media/rc/imon.c
@@ -1629,7 +1629,7 @@ static void imon_incoming_packet(struct imon_context 
*ictx,
        if (kc == KEY_KEYBOARD && !ictx->release_code) {
                ictx->last_keycode = kc;
                if (!nomouse) {
-                       ictx->pad_mouse = ~(ictx->pad_mouse) & 0x1;
+                       ictx->pad_mouse = !ictx->pad_mouse;
                        dev_dbg(dev, "toggling to %s mode\n",
                                ictx->pad_mouse ? "mouse" : "keyboard");
                        spin_unlock_irqrestore(&ictx->kc_lock, flags);
diff --git a/drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c 
b/drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c
index 283495c84ba3..aab8eeec601f 100644
--- a/drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c
+++ b/drivers/media/usb/dvb-usb-v2/mxl111sf-i2c.c
@@ -320,7 +320,7 @@ static int mxl111sf_i2c_sw_xfer_msg(struct mxl111sf_state 
*state,
 static int mxl111sf_i2c_send_data(struct mxl111sf_state *state,
                                  u8 index, u8 *wdata)
 {
-       int ret = mxl111sf_ctrl_msg(state->d, wdata[0],
+       int ret = mxl111sf_ctrl_msg(state, wdata[0],
                                    &wdata[1], 25, NULL, 0);
        mxl_fail(ret);
 
@@ -330,7 +330,7 @@ static int mxl111sf_i2c_send_data(struct mxl111sf_state 
*state,
 static int mxl111sf_i2c_get_data(struct mxl111sf_state *state,
                                 u8 index, u8 *wdata, u8 *rdata)
 {
-       int ret = mxl111sf_ctrl_msg(state->d, wdata[0],
+       int ret = mxl111sf_ctrl_msg(state, wdata[0],
                                    &wdata[1], 25, rdata, 24);
        mxl_fail(ret);
 
diff --git a/drivers/media/usb/dvb-usb-v2/mxl111sf.c 
b/drivers/media/usb/dvb-usb-v2/mxl111sf.c
index 5d676b533a3a..f1f448650e6f 100644
--- a/drivers/media/usb/dvb-usb-v2/mxl111sf.c
+++ b/drivers/media/usb/dvb-usb-v2/mxl111sf.c
@@ -24,9 +24,6 @@
 #include "lgdt3305.h"
 #include "lg2160.h"
 
-/* Max transfer size done by I2C transfer functions */
-#define MAX_XFER_SIZE  64
-
 int dvb_usb_mxl111sf_debug;
 module_param_named(debug, dvb_usb_mxl111sf_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debugging level "
@@ -56,27 +53,34 @@ MODULE_PARM_DESC(rfswitch, "force rf switch position 
(0=auto, 1=ext, 2=int).");
 
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
-int mxl111sf_ctrl_msg(struct dvb_usb_device *d,
+int mxl111sf_ctrl_msg(struct mxl111sf_state *state,
                      u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
 {
+       struct dvb_usb_device *d = state->d;
        int wo = (rbuf == NULL || rlen == 0); /* write-only */
        int ret;
-       u8 sndbuf[MAX_XFER_SIZE];
 
-       if (1 + wlen > sizeof(sndbuf)) {
+       if (1 + wlen > MXL_MAX_XFER_SIZE) {
                pr_warn("%s: len=%d is too big!\n", __func__, wlen);
                return -EOPNOTSUPP;
        }
 
        pr_debug("%s(wlen = %d, rlen = %d)\n", __func__, wlen, rlen);
 
-       memset(sndbuf, 0, 1+wlen);
+       mutex_lock(&state->msg_lock);
+       memset(state->sndbuf, 0, 1+wlen);
+       memset(state->rcvbuf, 0, rlen);
+
+       state->sndbuf[0] = cmd;
+       memcpy(&state->sndbuf[1], wbuf, wlen);
 
-       sndbuf[0] = cmd;
-       memcpy(&sndbuf[1], wbuf, wlen);
+       ret = (wo) ? dvb_usbv2_generic_write(d, state->sndbuf, 1+wlen) :
+               dvb_usbv2_generic_rw(d, state->sndbuf, 1+wlen, state->rcvbuf,
+                                    rlen);
+
+       memcpy(rbuf, state->rcvbuf, rlen);
+       mutex_unlock(&state->msg_lock);
 
-       ret = (wo) ? dvb_usbv2_generic_write(d, sndbuf, 1+wlen) :
-               dvb_usbv2_generic_rw(d, sndbuf, 1+wlen, rbuf, rlen);
        mxl_fail(ret);
 
        return ret;
@@ -92,7 +96,7 @@ int mxl111sf_read_reg(struct mxl111sf_state *state, u8 addr, 
u8 *data)
        u8 buf[2];
        int ret;
 
-       ret = mxl111sf_ctrl_msg(state->d, MXL_CMD_REG_READ, &addr, 1, buf, 2);
+       ret = mxl111sf_ctrl_msg(state, MXL_CMD_REG_READ, &addr, 1, buf, 2);
        if (mxl_fail(ret)) {
                mxl_debug("error reading reg: 0x%02x", addr);
                goto fail;
@@ -118,7 +122,7 @@ int mxl111sf_write_reg(struct mxl111sf_state *state, u8 
addr, u8 data)
 
        pr_debug("W: (0x%02x, 0x%02x)\n", addr, data);
 
-       ret = mxl111sf_ctrl_msg(state->d, MXL_CMD_REG_WRITE, buf, 2, NULL, 0);
+       ret = mxl111sf_ctrl_msg(state, MXL_CMD_REG_WRITE, buf, 2, NULL, 0);
        if (mxl_fail(ret))
                pr_err("error writing reg: 0x%02x, val: 0x%02x", addr, data);
        return ret;
@@ -922,6 +926,8 @@ static int mxl111sf_init(struct dvb_usb_device *d)
        static u8 eeprom[256];
        struct i2c_client c;
 
+       mutex_init(&state->msg_lock);
+
        ret = get_chip_info(state);
        if (mxl_fail(ret))
                pr_err("failed to get chip info during probe");
diff --git a/drivers/media/usb/dvb-usb-v2/mxl111sf.h 
b/drivers/media/usb/dvb-usb-v2/mxl111sf.h
index 846260e0eec0..3e6f5880bd1e 100644
--- a/drivers/media/usb/dvb-usb-v2/mxl111sf.h
+++ b/drivers/media/usb/dvb-usb-v2/mxl111sf.h
@@ -19,6 +19,9 @@
 #include <media/tveeprom.h>
 #include <media/media-entity.h>
 
+/* Max transfer size done by I2C transfer functions */
+#define MXL_MAX_XFER_SIZE  64
+
 #define MXL_EP1_REG_READ     1
 #define MXL_EP2_REG_WRITE    2
 #define MXL_EP3_INTERRUPT    3
@@ -86,6 +89,9 @@ struct mxl111sf_state {
        struct mutex fe_lock;
        u8 num_frontends;
        struct mxl111sf_adap_state adap_state[3];
+       u8 sndbuf[MXL_MAX_XFER_SIZE];
+       u8 rcvbuf[MXL_MAX_XFER_SIZE];
+       struct mutex msg_lock;
 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
        struct media_entity tuner;
        struct media_pad tuner_pads[2];
@@ -108,7 +114,7 @@ int mxl111sf_ctrl_program_regs(struct mxl111sf_state *state,
 
 /* needed for hardware i2c functions in mxl111sf-i2c.c:
  * mxl111sf_i2c_send_data / mxl111sf_i2c_get_data */
-int mxl111sf_ctrl_msg(struct dvb_usb_device *d,
+int mxl111sf_ctrl_msg(struct mxl111sf_state *state,
                      u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen);
 
 #define mxl_printk(kern, fmt, arg...) \
diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c
index 65fed7146e9b..cc91f7b3d90c 100644
--- a/drivers/misc/enclosure.c
+++ b/drivers/misc/enclosure.c
@@ -375,6 +375,7 @@ int enclosure_add_device(struct enclosure_device *edev, int 
component,
                         struct device *dev)
 {
        struct enclosure_component *cdev;
+       int err;
 
        if (!edev || component >= edev->components)
                return -EINVAL;
@@ -384,12 +385,17 @@ int enclosure_add_device(struct enclosure_device *edev, 
int component,
        if (cdev->dev == dev)
                return -EEXIST;
 
-       if (cdev->dev)
+       if (cdev->dev) {
                enclosure_remove_links(cdev);
-
-       put_device(cdev->dev);
+               put_device(cdev->dev);
+       }
        cdev->dev = get_device(dev);
-       return enclosure_add_links(cdev);
+       err = enclosure_add_links(cdev);
+       if (err) {
+               put_device(cdev->dev);
+               cdev->dev = NULL;
+       }
+       return err;
 }
 EXPORT_SYMBOL_GPL(enclosure_add_device);
 
diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c 
b/drivers/net/ethernet/intel/igb/e1000_82575.c
index a61447fd778e..1264a3616acf 100644
--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
@@ -246,6 +246,7 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw)
                        E1000_STATUS_FUNC_SHIFT;
 
        /* Set phy->phy_addr and phy->id. */
+       igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, 0);
        ret_val = igb_get_phy_id_82575(hw);
        if (ret_val)
                return ret_val;
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 
b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
index ae3043559b6d..fe5102ca5010 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
@@ -1821,8 +1821,6 @@ static void ar9003_hw_spectral_scan_wait(struct ath_hw 
*ah)
 static void ar9003_hw_tx99_start(struct ath_hw *ah, u32 qnum)
 {
        REG_SET_BIT(ah, AR_PHY_TEST, PHY_AGC_CLR);
-       REG_SET_BIT(ah, 0x9864, 0x7f000);
-       REG_SET_BIT(ah, 0x9924, 0x7f00fe);
        REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS);
        REG_WRITE(ah, AR_CR, AR_CR_RXD);
        REG_WRITE(ah, AR_DLCL_IFS(qnum), 0);
diff --git a/drivers/net/wireless/ath/ath9k/rng.c 
b/drivers/net/wireless/ath/ath9k/rng.c
index d38e50f96db7..e0374ebe7bdc 100644
--- a/drivers/net/wireless/ath/ath9k/rng.c
+++ b/drivers/net/wireless/ath/ath9k/rng.c
@@ -120,6 +120,8 @@ void ath9k_rng_start(struct ath_softc *sc)
 
 void ath9k_rng_stop(struct ath_softc *sc)
 {
-       if (sc->rng_task)
+       if (sc->rng_task) {
                kthread_stop(sc->rng_task);
+               sc->rng_task = NULL;
+       }
 }
diff --git a/drivers/net/wireless/ath/ath9k/tx99.c 
b/drivers/net/wireless/ath/ath9k/tx99.c
index 16aca9e28b77..1fa7f844b5da 100644
--- a/drivers/net/wireless/ath/ath9k/tx99.c
+++ b/drivers/net/wireless/ath/ath9k/tx99.c
@@ -189,22 +189,27 @@ static ssize_t write_file_tx99(struct file *file, const 
char __user *user_buf,
        if (strtobool(buf, &start))
                return -EINVAL;
 
+       mutex_lock(&sc->mutex);
+
        if (start == sc->tx99_state) {
                if (!start)
-                       return count;
+                       goto out;
                ath_dbg(common, XMIT, "Resetting TX99\n");
                ath9k_tx99_deinit(sc);
        }
 
        if (!start) {
                ath9k_tx99_deinit(sc);
-               return count;
+               goto out;
        }
 
        r = ath9k_tx99_init(sc);
-       if (r)
+       if (r) {
+               mutex_unlock(&sc->mutex);
                return r;
-
+       }
+out:
+       mutex_unlock(&sc->mutex);
        return count;
 }
 
diff --git a/drivers/net/wireless/ti/wlcore/spi.c 
b/drivers/net/wireless/ti/wlcore/spi.c
index f949ad2bd898..fa3547e06424 100644
--- a/drivers/net/wireless/ti/wlcore/spi.c
+++ b/drivers/net/wireless/ti/wlcore/spi.c
@@ -70,10 +70,10 @@
 #define WSPI_MAX_CHUNK_SIZE    4092
 
 /*
- * wl18xx driver aggregation buffer size is (13 * PAGE_SIZE) compared to
- * (4 * PAGE_SIZE) for wl12xx, so use the larger buffer needed for wl18xx
+ * wl18xx driver aggregation buffer size is (13 * 4K) compared to
+ * (4 * 4K) for wl12xx, so use the larger buffer needed for wl18xx
  */
-#define SPI_AGGR_BUFFER_SIZE (13 * PAGE_SIZE)
+#define SPI_AGGR_BUFFER_SIZE (13 * SZ_4K)
 
 /* Maximum number of SPI write chunks */
 #define WSPI_MAX_NUM_OF_CHUNKS \
diff --git a/drivers/nfc/nfcmrvl/fw_dnld.c b/drivers/nfc/nfcmrvl/fw_dnld.c
index f8dcdf4b24f6..af62c4c854f3 100644
--- a/drivers/nfc/nfcmrvl/fw_dnld.c
+++ b/drivers/nfc/nfcmrvl/fw_dnld.c
@@ -459,7 +459,7 @@ int nfcmrvl_fw_dnld_init(struct nfcmrvl_private *priv)
 
        INIT_WORK(&priv->fw_dnld.rx_work, fw_dnld_rx_work);
        snprintf(name, sizeof(name), "%s_nfcmrvl_fw_dnld_rx_wq",
-                dev_name(priv->dev));
+                dev_name(&priv->ndev->nfc_dev->dev));
        priv->fw_dnld.rx_wq = create_singlethread_workqueue(name);
        if (!priv->fw_dnld.rx_wq)
                return -ENOMEM;
@@ -496,6 +496,7 @@ int nfcmrvl_fw_dnld_start(struct nci_dev *ndev, const char 
*firmware_name)
 {
        struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
        struct nfcmrvl_fw_dnld *fw_dnld = &priv->fw_dnld;
+       int res;
 
        if (!priv->support_fw_dnld)
                return -ENOTSUPP;
@@ -511,7 +512,9 @@ int nfcmrvl_fw_dnld_start(struct nci_dev *ndev, const char 
*firmware_name)
         */
 
        /* Retrieve FW binary */
-       if (request_firmware(&fw_dnld->fw, firmware_name, priv->dev) < 0) {
+       res = request_firmware(&fw_dnld->fw, firmware_name,
+                              &ndev->nfc_dev->dev);
+       if (res < 0) {
                nfc_err(priv->dev, "failed to retrieve FW %s", firmware_name);
                return -ENOENT;
        }
diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c
index 51c8240a1672..a446590a71ca 100644
--- a/drivers/nfc/nfcmrvl/main.c
+++ b/drivers/nfc/nfcmrvl/main.c
@@ -124,12 +124,13 @@ struct nfcmrvl_private *nfcmrvl_nci_register_dev(enum 
nfcmrvl_phy phy,
        memcpy(&priv->config, pdata, sizeof(*pdata));
 
        if (priv->config.reset_n_io) {
-               rc = devm_gpio_request_one(dev,
-                                          priv->config.reset_n_io,
-                                          GPIOF_OUT_INIT_LOW,
-                                          "nfcmrvl_reset_n");
-               if (rc < 0)
+               rc = gpio_request_one(priv->config.reset_n_io,
+                                     GPIOF_OUT_INIT_LOW,
+                                     "nfcmrvl_reset_n");
+               if (rc < 0) {
+                       priv->config.reset_n_io = 0;
                        nfc_err(dev, "failed to request reset_n io\n");
+               }
        }
 
        if (phy == NFCMRVL_PHY_SPI) {
@@ -154,7 +155,13 @@ struct nfcmrvl_private *nfcmrvl_nci_register_dev(enum 
nfcmrvl_phy phy,
        if (!priv->ndev) {
                nfc_err(dev, "nci_allocate_device failed\n");
                rc = -ENOMEM;
-               goto error;
+               goto error_free_gpio;
+       }
+
+       rc = nfcmrvl_fw_dnld_init(priv);
+       if (rc) {
+               nfc_err(dev, "failed to initialize FW download %d\n", rc);
+               goto error_free_dev;
        }
 
        nci_set_drvdata(priv->ndev, priv);
@@ -162,24 +169,22 @@ struct nfcmrvl_private *nfcmrvl_nci_register_dev(enum 
nfcmrvl_phy phy,
        rc = nci_register_device(priv->ndev);
        if (rc) {
                nfc_err(dev, "nci_register_device failed %d\n", rc);
-               goto error_free_dev;
+               goto error_fw_dnld_deinit;
        }
 
        /* Ensure that controller is powered off */
        nfcmrvl_chip_halt(priv);
 
-       rc = nfcmrvl_fw_dnld_init(priv);
-       if (rc) {
-               nfc_err(dev, "failed to initialize FW download %d\n", rc);
-               goto error_free_dev;
-       }
-
        nfc_info(dev, "registered with nci successfully\n");
        return priv;
 
+error_fw_dnld_deinit:
+       nfcmrvl_fw_dnld_deinit(priv);
 error_free_dev:
        nci_free_device(priv->ndev);
-error:
+error_free_gpio:
+       if (priv->config.reset_n_io)
+               gpio_free(priv->config.reset_n_io);
        kfree(priv);
        return ERR_PTR(rc);
 }
@@ -195,7 +200,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private 
*priv)
        nfcmrvl_fw_dnld_deinit(priv);
 
        if (priv->config.reset_n_io)
-               devm_gpio_free(priv->dev, priv->config.reset_n_io);
+               gpio_free(priv->config.reset_n_io);
 
        nci_unregister_device(ndev);
        nci_free_device(ndev);
diff --git a/drivers/nfc/nfcmrvl/uart.c b/drivers/nfc/nfcmrvl/uart.c
index 83a99e38e7bd..6c0c301611c4 100644
--- a/drivers/nfc/nfcmrvl/uart.c
+++ b/drivers/nfc/nfcmrvl/uart.c
@@ -109,6 +109,7 @@ static int nfcmrvl_nci_uart_open(struct nci_uart *nu)
        struct nfcmrvl_private *priv;
        struct nfcmrvl_platform_data *pdata = NULL;
        struct nfcmrvl_platform_data config;
+       struct device *dev = nu->tty->dev;
 
        /*
         * Platform data cannot be used here since usually it is already used
@@ -116,9 +117,8 @@ static int nfcmrvl_nci_uart_open(struct nci_uart *nu)
         * and check if DT entries were added.
         */
 
-       if (nu->tty->dev->parent && nu->tty->dev->parent->of_node)
-               if (nfcmrvl_uart_parse_dt(nu->tty->dev->parent->of_node,
-                                         &config) == 0)
+       if (dev && dev->parent && dev->parent->of_node)
+               if (nfcmrvl_uart_parse_dt(dev->parent->of_node, &config) == 0)
                        pdata = &config;
 
        if (!pdata) {
@@ -131,7 +131,7 @@ static int nfcmrvl_nci_uart_open(struct nci_uart *nu)
        }
 
        priv = nfcmrvl_nci_register_dev(NFCMRVL_PHY_UART, nu, &uart_ops,
-                                       nu->tty->dev, pdata);
+                                       dev, pdata);
        if (IS_ERR(priv))
                return PTR_ERR(priv);
 
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index 368795aad5c9..94733f73d37f 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1203,10 +1203,13 @@ static int btt_rw_page(struct block_device *bdev, 
sector_t sector,
                struct page *page, bool is_write)
 {
        struct btt *btt = bdev->bd_disk->private_data;
+       int rc;
 
-       btt_do_bvec(btt, NULL, page, PAGE_SIZE, 0, is_write, sector);
-       page_endio(page, is_write, 0);
-       return 0;
+       rc = btt_do_bvec(btt, NULL, page, PAGE_SIZE, 0, is_write, sector);
+       if (rc == 0)
+               page_endio(page, is_write, 0);
+
+       return rc;
 }
 
 
diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c
index 7ceba08774b6..18a0bea115df 100644
--- a/drivers/nvdimm/core.c
+++ b/drivers/nvdimm/core.c
@@ -450,14 +450,15 @@ static void set_badblock(struct badblocks *bb, sector_t 
s, int num)
 static void __add_badblock_range(struct badblocks *bb, u64 ns_offset, u64 len)
 {
        const unsigned int sector_size = 512;
-       sector_t start_sector;
+       sector_t start_sector, end_sector;
        u64 num_sectors;
        u32 rem;
 
        start_sector = div_u64(ns_offset, sector_size);
-       num_sectors = div_u64_rem(len, sector_size, &rem);
+       end_sector = div_u64_rem(ns_offset + len, sector_size, &rem);
        if (rem)
-               num_sectors++;
+               end_sector++;
+       num_sectors = end_sector - start_sector;
 
        if (unlikely(num_sectors > (u64)INT_MAX)) {
                u64 remaining = num_sectors;
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 3222f3e987eb..286fda4ee100 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -88,7 +88,7 @@ enum nvme_rdma_queue_flags {
 
 struct nvme_rdma_queue {
        struct nvme_rdma_qe     *rsp_ring;
-       u8                      sig_count;
+       atomic_t                sig_count;
        int                     queue_size;
        size_t                  cmnd_capsule_len;
        struct nvme_rdma_ctrl   *ctrl;
@@ -555,6 +555,7 @@ static int nvme_rdma_init_queue(struct nvme_rdma_ctrl *ctrl,
                queue->cmnd_capsule_len = sizeof(struct nvme_command);
 
        queue->queue_size = queue_size;
+       atomic_set(&queue->sig_count, 0);
 
        queue->cm_id = rdma_create_id(&init_net, nvme_rdma_cm_handler, queue,
                        RDMA_PS_TCP, IB_QPT_RC);
@@ -1011,17 +1012,16 @@ static void nvme_rdma_send_done(struct ib_cq *cq, 
struct ib_wc *wc)
                nvme_rdma_wr_error(cq, wc, "SEND");
 }
 
-static inline int nvme_rdma_queue_sig_limit(struct nvme_rdma_queue *queue)
+/*
+ * We want to signal completion at least every queue depth/2.  This returns the
+ * largest power of two that is not above half of (queue size + 1) to optimize
+ * (avoid divisions).
+ */
+static inline bool nvme_rdma_queue_sig_limit(struct nvme_rdma_queue *queue)
 {
-       int sig_limit;
+       int limit = 1 << ilog2((queue->queue_size + 1) / 2);
 
-       /*
-        * We signal completion every queue depth/2 and also handle the
-        * degenerated case of a  device with queue_depth=1, where we
-        * would need to signal every message.
-        */
-       sig_limit = max(queue->queue_size / 2, 1);
-       return (++queue->sig_count % sig_limit) == 0;
+       return (atomic_inc_return(&queue->sig_count) & (limit - 1)) == 0;
 }
 
 static int nvme_rdma_post_send(struct nvme_rdma_queue *queue,
diff --git a/drivers/of/device.c b/drivers/of/device.c
index fd5cfad7c403..f7a970120055 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -225,6 +225,7 @@ ssize_t of_device_get_modalias(struct device *dev, char 
*str, ssize_t len)
 
        return tsize;
 }
+EXPORT_SYMBOL_GPL(of_device_get_modalias);
 
 /**
  * of_device_uevent - Display OF related uevent information
@@ -287,3 +288,4 @@ int of_device_uevent_modalias(struct device *dev, struct 
kobj_uevent_env *env)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(of_device_uevent_modalias);
diff --git a/drivers/pci/host/pcie-rockchip.c b/drivers/pci/host/pcie-rockchip.c
index 3452983d3569..03ebfd574735 100644
--- a/drivers/pci/host/pcie-rockchip.c
+++ b/drivers/pci/host/pcie-rockchip.c
@@ -131,6 +131,7 @@
                 PCIE_CORE_INT_CT | PCIE_CORE_INT_UTC | \
                 PCIE_CORE_INT_MMVC)
 
+#define PCIE_RC_CONFIG_NORMAL_BASE     0x800000
 #define PCIE_RC_CONFIG_BASE            0xa00000
 #define PCIE_RC_CONFIG_VENDOR          (PCIE_RC_CONFIG_BASE + 0x00)
 #define PCIE_RC_CONFIG_RID_CCR         (PCIE_RC_CONFIG_BASE + 0x08)
@@ -267,7 +268,9 @@ static int rockchip_pcie_valid_device(struct rockchip_pcie 
*rockchip,
 static int rockchip_pcie_rd_own_conf(struct rockchip_pcie *rockchip,
                                     int where, int size, u32 *val)
 {
-       void __iomem *addr = rockchip->apb_base + PCIE_RC_CONFIG_BASE + where;
+       void __iomem *addr;
+
+       addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where;
 
        if (!IS_ALIGNED((uintptr_t)addr, size)) {
                *val = 0;
@@ -291,11 +294,13 @@ static int rockchip_pcie_wr_own_conf(struct rockchip_pcie 
*rockchip,
                                     int where, int size, u32 val)
 {
        u32 mask, tmp, offset;
+       void __iomem *addr;
 
        offset = where & ~0x3;
+       addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset;
 
        if (size == 4) {
-               writel(val, rockchip->apb_base + PCIE_RC_CONFIG_BASE + offset);
+               writel(val, addr);
                return PCIBIOS_SUCCESSFUL;
        }
 
@@ -306,9 +311,9 @@ static int rockchip_pcie_wr_own_conf(struct rockchip_pcie 
*rockchip,
         * corrupt RW1C bits in adjacent registers.  But the hardware
         * doesn't support smaller writes.
         */
-       tmp = readl(rockchip->apb_base + PCIE_RC_CONFIG_BASE + offset) & mask;
+       tmp = readl(addr) & mask;
        tmp |= val << ((where & 0x3) * 8);
-       writel(tmp, rockchip->apb_base + PCIE_RC_CONFIG_BASE + offset);
+       writel(tmp, addr);
 
        return PCIBIOS_SUCCESSFUL;
 }
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 1ccce1cd6aca..8a68e2b554e1 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -954,6 +954,7 @@ static int pci_pm_thaw_noirq(struct device *dev)
                return pci_legacy_resume_early(dev);
 
        pci_update_current_state(pci_dev, PCI_D0);
+       pci_restore_state(pci_dev);
 
        if (drv && drv->pm && drv->pm->thaw_noirq)
                error = drv->pm->thaw_noirq(dev);
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 6f7128f49c30..27a6d3c6cb7c 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -384,11 +384,12 @@ static void scsi_target_reap_ref_release(struct kref 
*kref)
                = container_of(kref, struct scsi_target, reap_ref);
 
        /*
-        * if we get here and the target is still in the CREATED state that
+        * if we get here and the target is still in a CREATED state that
         * means it was allocated but never made visible (because a scan
         * turned up no LUNs), so don't call device_del() on it.
         */
-       if (starget->state != STARGET_CREATED) {
+       if ((starget->state != STARGET_CREATED) &&
+           (starget->state != STARGET_CREATED_REMOVE)) {
                transport_remove_device(&starget->dev);
                device_del(&starget->dev);
        }
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 82dfe07b1d47..3a6f557ec128 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -1370,11 +1370,15 @@ void scsi_remove_target(struct device *dev)
        spin_lock_irqsave(shost->host_lock, flags);
        list_for_each_entry(starget, &shost->__targets, siblings) {
                if (starget->state == STARGET_DEL ||
-                   starget->state == STARGET_REMOVE)
+                   starget->state == STARGET_REMOVE ||
+                   starget->state == STARGET_CREATED_REMOVE)
                        continue;
                if (starget->dev.parent == dev || &starget->dev == dev) {
                        kref_get(&starget->reap_ref);
-                       starget->state = STARGET_REMOVE;
+                       if (starget->state == STARGET_CREATED)
+                               starget->state = STARGET_CREATED_REMOVE;
+                       else
+                               starget->state = STARGET_REMOVE;
                        spin_unlock_irqrestore(shost->host_lock, flags);
                        __scsi_remove_target(starget);
                        scsi_target_reap(starget);
diff --git a/drivers/spmi/spmi.c b/drivers/spmi/spmi.c
index 2b9b0941d9eb..6d23226e5f69 100644
--- a/drivers/spmi/spmi.c
+++ b/drivers/spmi/spmi.c
@@ -365,11 +365,23 @@ static int spmi_drv_remove(struct device *dev)
        return 0;
 }
 
+static int spmi_drv_uevent(struct device *dev, struct kobj_uevent_env *env)
+{
+       int ret;
+
+       ret = of_device_uevent_modalias(dev, env);
+       if (ret != -ENODEV)
+               return ret;
+
+       return 0;
+}
+
 static struct bus_type spmi_bus_type = {
        .name           = "spmi",
        .match          = spmi_device_match,
        .probe          = spmi_drv_probe,
        .remove         = spmi_drv_remove,
+       .uevent         = spmi_drv_uevent,
 };
 
 /**
diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c 
b/drivers/staging/comedi/drivers/ni_mio_common.c
index 1c967c30e4ce..a574885ffba9 100644
--- a/drivers/staging/comedi/drivers/ni_mio_common.c
+++ b/drivers/staging/comedi/drivers/ni_mio_common.c
@@ -3078,8 +3078,7 @@ static void ni_ao_cmd_set_update(struct comedi_device 
*dev,
                /* following line: 2-1 per STC */
                ni_stc_writel(dev, 1, NISTC_AO_UI_LOADA_REG);
                ni_stc_writew(dev, NISTC_AO_CMD1_UI_LOAD, NISTC_AO_CMD1_REG);
-               /* following line: N-1 per STC */
-               ni_stc_writel(dev, trigvar - 1, NISTC_AO_UI_LOADA_REG);
+               ni_stc_writel(dev, trigvar, NISTC_AO_UI_LOADA_REG);
        } else { /* TRIG_EXT */
                /* FIXME:  assert scan_begin_arg != 0, ret failure otherwise */
                devpriv->ao_cmd2  |= NISTC_AO_CMD2_BC_GATE_ENA;
diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c 
b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
index b27de8888149..995f2dac7f26 100644
--- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
+++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c
@@ -1650,8 +1650,13 @@ kiblnd_send(lnet_ni_t *ni, void *private, lnet_msg_t 
*lntmsg)
        ibmsg = tx->tx_msg;
        ibmsg->ibm_u.immediate.ibim_hdr = *hdr;
 
-       copy_from_iter(&ibmsg->ibm_u.immediate.ibim_payload, IBLND_MSG_SIZE,
-                      &from);
+       rc = copy_from_iter(&ibmsg->ibm_u.immediate.ibim_payload, payload_nob,
+                           &from);
+       if (rc != payload_nob) {
+               kiblnd_pool_free_node(&tx->tx_pool->tpo_pool, &tx->tx_list);
+               return -EFAULT;
+       }
+
        nob = offsetof(struct kib_immediate_msg, ibim_payload[payload_nob]);
        kiblnd_init_tx_msg(ni, tx, IBLND_MSG_IMMEDIATE, nob);
 
@@ -1751,8 +1756,14 @@ kiblnd_recv(lnet_ni_t *ni, void *private, lnet_msg_t 
*lntmsg, int delayed,
                        break;
                }
 
-               copy_to_iter(&rxmsg->ibm_u.immediate.ibim_payload,
-                            IBLND_MSG_SIZE, to);
+               rc = copy_to_iter(&rxmsg->ibm_u.immediate.ibim_payload, rlen,
+                                 to);
+               if (rc != rlen) {
+                       rc = -EFAULT;
+                       break;
+               }
+
+               rc = 0;
                lnet_finalize(ni, lntmsg, 0);
                break;
 
diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c 
b/drivers/staging/rtl8188eu/os_dep/usb_intf.c
index 68e1e6bbe87f..b432153a6c5a 100644
--- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c
+++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c
@@ -43,6 +43,7 @@ static struct usb_device_id rtw_usb_id_tbl[] = {
        {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
        {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
        {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */
+       {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */
        {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */
        {}      /* Terminating entry */
 };
diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c
index 7d90e250142c..86ace1449309 100644
--- a/drivers/staging/sm750fb/sm750.c
+++ b/drivers/staging/sm750fb/sm750.c
@@ -1049,6 +1049,26 @@ static int sm750fb_frambuffer_alloc(struct sm750_dev 
*sm750_dev, int fbidx)
        return err;
 }
 
+static int lynxfb_kick_out_firmware_fb(struct pci_dev *pdev)
+{
+       struct apertures_struct *ap;
+       bool primary = false;
+
+       ap = alloc_apertures(1);
+       if (!ap)
+               return -ENOMEM;
+
+       ap->ranges[0].base = pci_resource_start(pdev, 0);
+       ap->ranges[0].size = pci_resource_len(pdev, 0);
+#ifdef CONFIG_X86
+       primary = pdev->resource[PCI_ROM_RESOURCE].flags &
+                                       IORESOURCE_ROM_SHADOW;
+#endif
+       remove_conflicting_framebuffers(ap, "sm750_fb1", primary);
+       kfree(ap);
+       return 0;
+}
+
 static int lynxfb_pci_probe(struct pci_dev *pdev,
                            const struct pci_device_id *ent)
 {
@@ -1057,6 +1077,10 @@ static int lynxfb_pci_probe(struct pci_dev *pdev,
        int fbidx;
        int err;
 
+       err = lynxfb_kick_out_firmware_fb(pdev);
+       if (err)
+               return err;
+
        /* enable device */
        err = pcim_enable_device(pdev);
        if (err)
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c 
b/drivers/target/iscsi/iscsi_target_configfs.c
index 7e70fe849f0d..9cbbc9cf63fb 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -802,6 +802,7 @@ DEF_TPG_ATTRIB(default_erl);
 DEF_TPG_ATTRIB(t10_pi);
 DEF_TPG_ATTRIB(fabric_prot_type);
 DEF_TPG_ATTRIB(tpg_enabled_sendtargets);
+DEF_TPG_ATTRIB(login_keys_workaround);
 
 static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
        &iscsi_tpg_attrib_attr_authentication,
@@ -817,6 +818,7 @@ static struct configfs_attribute 
*lio_target_tpg_attrib_attrs[] = {
        &iscsi_tpg_attrib_attr_t10_pi,
        &iscsi_tpg_attrib_attr_fabric_prot_type,
        &iscsi_tpg_attrib_attr_tpg_enabled_sendtargets,
+       &iscsi_tpg_attrib_attr_login_keys_workaround,
        NULL,
 };
 
diff --git a/drivers/target/iscsi/iscsi_target_nego.c 
b/drivers/target/iscsi/iscsi_target_nego.c
index 89d34bd6d87f..6693d7c69f97 100644
--- a/drivers/target/iscsi/iscsi_target_nego.c
+++ b/drivers/target/iscsi/iscsi_target_nego.c
@@ -819,7 +819,8 @@ static int iscsi_target_handle_csg_zero(
                        SENDER_TARGET,
                        login->rsp_buf,
                        &login->rsp_length,
-                       conn->param_list);
+                       conn->param_list,
+                       conn->tpg->tpg_attrib.login_keys_workaround);
        if (ret < 0)
                return -1;
 
@@ -889,7 +890,8 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn 
*conn, struct iscsi_log
                        SENDER_TARGET,
                        login->rsp_buf,
                        &login->rsp_length,
-                       conn->param_list);
+                       conn->param_list,
+                       conn->tpg->tpg_attrib.login_keys_workaround);
        if (ret < 0) {
                iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR,
                                ISCSI_LOGIN_STATUS_INIT_ERR);
diff --git a/drivers/target/iscsi/iscsi_target_parameters.c 
b/drivers/target/iscsi/iscsi_target_parameters.c
index 4a073339ae2e..0151776fb48e 100644
--- a/drivers/target/iscsi/iscsi_target_parameters.c
+++ b/drivers/target/iscsi/iscsi_target_parameters.c
@@ -765,7 +765,8 @@ static int iscsi_check_for_auth_key(char *key)
        return 0;
 }
 
-static void iscsi_check_proposer_for_optional_reply(struct iscsi_param *param)
+static void iscsi_check_proposer_for_optional_reply(struct iscsi_param *param,
+                                                   bool keys_workaround)
 {
        if (IS_TYPE_BOOL_AND(param)) {
                if (!strcmp(param->value, NO))
@@ -773,19 +774,31 @@ static void 
iscsi_check_proposer_for_optional_reply(struct iscsi_param *param)
        } else if (IS_TYPE_BOOL_OR(param)) {
                if (!strcmp(param->value, YES))
                        SET_PSTATE_REPLY_OPTIONAL(param);
-                /*
-                 * Required for gPXE iSCSI boot client
-                 */
-               if (!strcmp(param->name, IMMEDIATEDATA))
-                       SET_PSTATE_REPLY_OPTIONAL(param);
+
+               if (keys_workaround) {
+                       /*
+                        * Required for gPXE iSCSI boot client
+                        */
+                       if (!strcmp(param->name, IMMEDIATEDATA))
+                               SET_PSTATE_REPLY_OPTIONAL(param);
+               }
        } else if (IS_TYPE_NUMBER(param)) {
                if (!strcmp(param->name, MAXRECVDATASEGMENTLENGTH))
                        SET_PSTATE_REPLY_OPTIONAL(param);
-               /*
-                * Required for gPXE iSCSI boot client
-                */
-               if (!strcmp(param->name, MAXCONNECTIONS))
-                       SET_PSTATE_REPLY_OPTIONAL(param);
+
+               if (keys_workaround) {
+                       /*
+                        * Required for Mellanox Flexboot PXE boot ROM
+                        */
+                       if (!strcmp(param->name, FIRSTBURSTLENGTH))
+                               SET_PSTATE_REPLY_OPTIONAL(param);
+
+                       /*
+                        * Required for gPXE iSCSI boot client
+                        */
+                       if (!strcmp(param->name, MAXCONNECTIONS))
+                               SET_PSTATE_REPLY_OPTIONAL(param);
+               }
        } else if (IS_PHASE_DECLARATIVE(param))
                SET_PSTATE_REPLY_OPTIONAL(param);
 }
@@ -1422,7 +1435,8 @@ int iscsi_encode_text_output(
        u8 sender,
        char *textbuf,
        u32 *length,
-       struct iscsi_param_list *param_list)
+       struct iscsi_param_list *param_list,
+       bool keys_workaround)
 {
        char *output_buf = NULL;
        struct iscsi_extra_response *er;
@@ -1458,7 +1472,8 @@ int iscsi_encode_text_output(
                        *length += 1;
                        output_buf = textbuf + *length;
                        SET_PSTATE_PROPOSER(param);
-                       iscsi_check_proposer_for_optional_reply(param);
+                       iscsi_check_proposer_for_optional_reply(param,
+                                                               
keys_workaround);
                        pr_debug("Sending key: %s=%s\n",
                                param->name, param->value);
                }
diff --git a/drivers/target/iscsi/iscsi_target_parameters.h 
b/drivers/target/iscsi/iscsi_target_parameters.h
index a0751e3f0813..17a58c2913f2 100644
--- a/drivers/target/iscsi/iscsi_target_parameters.h
+++ b/drivers/target/iscsi/iscsi_target_parameters.h
@@ -40,7 +40,7 @@ extern int iscsi_extract_key_value(char *, char **, char **);
 extern int iscsi_update_param_value(struct iscsi_param *, char *);
 extern int iscsi_decode_text_input(u8, u8, char *, u32, struct iscsi_conn *);
 extern int iscsi_encode_text_output(u8, u8, char *, u32 *,
-                       struct iscsi_param_list *);
+                       struct iscsi_param_list *, bool);
 extern int iscsi_check_negotiated_keys(struct iscsi_param_list *);
 extern void iscsi_set_connection_parameters(struct iscsi_conn_ops *,
                        struct iscsi_param_list *);
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c 
b/drivers/target/iscsi/iscsi_target_tpg.c
index 205a509b0dfb..63e1dcc5914d 100644
--- a/drivers/target/iscsi/iscsi_target_tpg.c
+++ b/drivers/target/iscsi/iscsi_target_tpg.c
@@ -227,6 +227,7 @@ static void iscsit_set_default_tpg_attribs(struct 
iscsi_portal_group *tpg)
        a->t10_pi = TA_DEFAULT_T10_PI;
        a->fabric_prot_type = TA_DEFAULT_FABRIC_PROT_TYPE;
        a->tpg_enabled_sendtargets = TA_DEFAULT_TPG_ENABLED_SENDTARGETS;
+       a->login_keys_workaround = TA_DEFAULT_LOGIN_KEYS_WORKAROUND;
 }
 
 int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct 
iscsi_portal_group *tpg)
@@ -899,3 +900,21 @@ int iscsit_ta_tpg_enabled_sendtargets(
 
        return 0;
 }
+
+int iscsit_ta_login_keys_workaround(
+       struct iscsi_portal_group *tpg,
+       u32 flag)
+{
+       struct iscsi_tpg_attrib *a = &tpg->tpg_attrib;
+
+       if ((flag != 0) && (flag != 1)) {
+               pr_err("Illegal value %d\n", flag);
+               return -EINVAL;
+       }
+
+       a->login_keys_workaround = flag;
+       pr_debug("iSCSI_TPG[%hu] - TPG enabled bit for login keys workaround: 
%s ",
+               tpg->tpgt, (a->login_keys_workaround) ? "ON" : "OFF");
+
+       return 0;
+}
diff --git a/drivers/target/iscsi/iscsi_target_tpg.h 
b/drivers/target/iscsi/iscsi_target_tpg.h
index 2da211920c18..901a712180f0 100644
--- a/drivers/target/iscsi/iscsi_target_tpg.h
+++ b/drivers/target/iscsi/iscsi_target_tpg.h
@@ -39,5 +39,6 @@ extern int iscsit_ta_default_erl(struct iscsi_portal_group *, 
u32);
 extern int iscsit_ta_t10_pi(struct iscsi_portal_group *, u32);
 extern int iscsit_ta_fabric_prot_type(struct iscsi_portal_group *, u32);
 extern int iscsit_ta_tpg_enabled_sendtargets(struct iscsi_portal_group *, u32);
+extern int iscsit_ta_login_keys_workaround(struct iscsi_portal_group *, u32);
 
 #endif /* ISCSI_TARGET_TPG_H */
diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
index 1f9bfa4195ea..e8a1f5cadba5 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -753,6 +753,15 @@ void target_complete_cmd(struct se_cmd *cmd, u8 
scsi_status)
        if (cmd->transport_state & CMD_T_ABORTED ||
            cmd->transport_state & CMD_T_STOP) {
                spin_unlock_irqrestore(&cmd->t_state_lock, flags);
+               /*
+                * If COMPARE_AND_WRITE was stopped by 
__transport_wait_for_tasks(),
+                * release se_device->caw_sem obtained by 
sbc_compare_and_write()
+                * since target_complete_ok_work() or 
target_complete_failure_work()
+                * won't be called to invoke the normal CAW completion 
callbacks.
+                */
+               if (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) {
+                       up(&dev->caw_sem);
+               }
                complete_all(&cmd->t_transport_stop_comp);
                return;
        } else if (!success) {
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index 9ce0e9eef923..f49d2989d000 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -191,8 +191,10 @@ unsigned long cpufreq_cooling_get_level(unsigned int cpu, 
unsigned int freq)
        mutex_lock(&cooling_list_lock);
        list_for_each_entry(cpufreq_dev, &cpufreq_dev_list, node) {
                if (cpumask_test_cpu(cpu, &cpufreq_dev->allowed_cpus)) {
+                       unsigned long level = get_level(cpufreq_dev, freq);
+
                        mutex_unlock(&cooling_list_lock);
-                       return get_level(cpufreq_dev, freq);
+                       return level;
                }
        }
        mutex_unlock(&cooling_list_lock);
diff --git a/drivers/thermal/max77620_thermal.c 
b/drivers/thermal/max77620_thermal.c
index 83905ff46e40..7e989277a890 100644
--- a/drivers/thermal/max77620_thermal.c
+++ b/drivers/thermal/max77620_thermal.c
@@ -104,8 +104,6 @@ static int max77620_thermal_probe(struct platform_device 
*pdev)
                return -EINVAL;
        }
 
-       pdev->dev.of_node = pdev->dev.parent->of_node;
-
        mtherm->dev = &pdev->dev;
        mtherm->rmap = dev_get_regmap(pdev->dev.parent, NULL);
        if (!mtherm->rmap) {
@@ -113,6 +111,14 @@ static int max77620_thermal_probe(struct platform_device 
*pdev)
                return -ENODEV;
        }
 
+       /*
+        * Drop any current reference to a device-tree node and get a
+        * reference to the parent's node which will be balanced on reprobe or
+        * on platform-device release.
+        */
+       of_node_put(pdev->dev.of_node);
+       pdev->dev.of_node = of_node_get(pdev->dev.parent->of_node);
+
        mtherm->tz_device = devm_thermal_zone_of_sensor_register(&pdev->dev, 0,
                                mtherm, &max77620_thermal_ops);
        if (IS_ERR(mtherm->tz_device)) {
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index a876d47246dc..f16491c25e73 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1770,6 +1770,9 @@ static const struct usb_device_id acm_ids[] = {
        { USB_DEVICE(0x1576, 0x03b1), /* Maretron USB100 */
        .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
        },
+       { USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */
+       .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */
+       },
 
        { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */
        .driver_info = CLEAR_HALT_CONDITIONS,
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index a9a1e4c40480..c8989c62a262 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -77,6 +77,16 @@
 #define USB_INTEL_USB3_PSSEN   0xD8
 #define USB_INTEL_USB3PRM      0xDC
 
+/* ASMEDIA quirk use */
+#define ASMT_DATA_WRITE0_REG   0xF8
+#define ASMT_DATA_WRITE1_REG   0xFC
+#define ASMT_CONTROL_REG       0xE0
+#define ASMT_CONTROL_WRITE_BIT 0x02
+#define ASMT_WRITEREG_CMD      0x10423
+#define ASMT_FLOWCTL_ADDR      0xFA30
+#define ASMT_FLOWCTL_DATA      0xBA
+#define ASMT_PSEUDO_DATA       0
+
 /*
  * amd_chipset_gen values represent AMD different chipset generations
  */
@@ -412,6 +422,50 @@ void usb_amd_quirk_pll_disable(void)
 }
 EXPORT_SYMBOL_GPL(usb_amd_quirk_pll_disable);
 
+static int usb_asmedia_wait_write(struct pci_dev *pdev)
+{
+       unsigned long retry_count;
+       unsigned char value;
+
+       for (retry_count = 1000; retry_count > 0; --retry_count) {
+
+               pci_read_config_byte(pdev, ASMT_CONTROL_REG, &value);
+
+               if (value == 0xff) {
+                       dev_err(&pdev->dev, "%s: check_ready ERROR", __func__);
+                       return -EIO;
+               }
+
+               if ((value & ASMT_CONTROL_WRITE_BIT) == 0)
+                       return 0;
+
+               usleep_range(40, 60);
+       }
+
+       dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__);
+       return -ETIMEDOUT;
+}
+
+void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev)
+{
+       if (usb_asmedia_wait_write(pdev) != 0)
+               return;
+
+       /* send command and address to device */
+       pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_WRITEREG_CMD);
+       pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_FLOWCTL_ADDR);
+       pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
+
+       if (usb_asmedia_wait_write(pdev) != 0)
+               return;
+
+       /* send data to device */
+       pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_FLOWCTL_DATA);
+       pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_PSEUDO_DATA);
+       pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
+}
+EXPORT_SYMBOL_GPL(usb_asmedia_modifyflowcontrol);
+
 void usb_amd_quirk_pll_enable(void)
 {
        usb_amd_quirk_pll(0);
diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h
index c622ddf21c94..6463fdb403c2 100644
--- a/drivers/usb/host/pci-quirks.h
+++ b/drivers/usb/host/pci-quirks.h
@@ -11,6 +11,7 @@ bool usb_amd_prefetch_quirk(void);
 void usb_amd_dev_put(void);
 void usb_amd_quirk_pll_disable(void);
 void usb_amd_quirk_pll_enable(void);
+void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev);
 void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev);
 void usb_disable_xhci_ports(struct pci_dev *xhci_pdev);
 void sb800_prefetch(struct device *dev, int on);
@@ -18,6 +19,7 @@ void sb800_prefetch(struct device *dev, int on);
 struct pci_dev;
 static inline void usb_amd_quirk_pll_disable(void) {}
 static inline void usb_amd_quirk_pll_enable(void) {}
+static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}
 static inline void usb_amd_dev_put(void) {}
 static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
 static inline void sb800_prefetch(struct device *dev, int on) {}
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index ff544f20872c..36b7789f8f22 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -783,6 +783,9 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
                        clear_bit(wIndex, &bus_state->resuming_ports);
 
                        set_bit(wIndex, &bus_state->rexit_ports);
+
+                       xhci_test_and_clear_bit(xhci, port_array, wIndex,
+                                               PORT_PLC);
                        xhci_set_link_state(xhci, port_array, wIndex,
                                        XDEV_U0);
 
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 672751ed2ba1..23833448e602 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -59,6 +59,8 @@
 #define PCI_DEVICE_ID_AMD_PROMONTORYA_2                        0x43bb
 #define PCI_DEVICE_ID_AMD_PROMONTORYA_1                        0x43bc
 
+#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI               0x1142
+
 static const char hcd_name[] = "xhci_hcd";
 
 static struct hc_driver __read_mostly xhci_pci_hc_driver;
@@ -217,6 +219,10 @@ static void xhci_pci_quirks(struct device *dev, struct 
xhci_hcd *xhci)
                        pdev->device == 0x1142)
                xhci->quirks |= XHCI_TRUST_TX_LENGTH;
 
+       if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
+               pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
+               xhci->quirks |= XHCI_ASMEDIA_MODIFY_FLOWCONTROL;
+
        if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241)
                xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7;
 
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 521c1816a26a..63735b5310bb 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -860,13 +860,16 @@ static void xhci_kill_endpoint_urbs(struct xhci_hcd *xhci,
                        (ep->ep_state & EP_GETTING_NO_STREAMS)) {
                int stream_id;
 
-               for (stream_id = 0; stream_id < ep->stream_info->num_streams;
+               for (stream_id = 1; stream_id < ep->stream_info->num_streams;
                                stream_id++) {
+                       ring = ep->stream_info->stream_rings[stream_id];
+                       if (!ring)
+                               continue;
+
                        xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb,
                                        "Killing URBs for slot ID %u, ep index 
%u, stream %u",
-                                       slot_id, ep_index, stream_id + 1);
-                       xhci_kill_ring_urbs(xhci,
-                                       
ep->stream_info->stream_rings[stream_id]);
+                                       slot_id, ep_index, stream_id);
+                       xhci_kill_ring_urbs(xhci, ring);
                }
        } else {
                ring = ep->ring;
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 34e23c7d7797..82308af5801b 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -192,6 +192,9 @@ int xhci_reset(struct xhci_hcd *xhci)
        if (ret)
                return ret;
 
+       if (xhci->quirks & XHCI_ASMEDIA_MODIFY_FLOWCONTROL)
+               
usb_asmedia_modifyflowcontrol(to_pci_dev(xhci_to_hcd(xhci)->self.controller));
+
        xhci_dbg_trace(xhci, trace_xhci_dbg_init,
                         "Wait for controller to be ready for doorbell rings");
        /*
@@ -1122,6 +1125,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
        if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running)
                compliance_mode_recovery_timer_init(xhci);
 
+       if (xhci->quirks & XHCI_ASMEDIA_MODIFY_FLOWCONTROL)
+               usb_asmedia_modifyflowcontrol(to_pci_dev(hcd->self.controller));
+
        /* Re-enable port polling. */
        xhci_dbg(xhci, "%s: starting port polling.\n", __func__);
        set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index 8336e07dc5f9..a0f4a9feb058 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1661,6 +1661,7 @@ struct xhci_hcd {
 #define XHCI_BROKEN_PORT_PED   (1 << 25)
 #define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26)
 #define XHCI_U2_DISABLE_WAKE   (1 << 27)
+#define XHCI_ASMEDIA_MODIFY_FLOWCONTROL        (1 << 28)
 
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;
diff --git a/drivers/usb/renesas_usbhs/common.c 
b/drivers/usb/renesas_usbhs/common.c
index 012a37aa3e0d..7994208be5de 100644
--- a/drivers/usb/renesas_usbhs/common.c
+++ b/drivers/usb/renesas_usbhs/common.c
@@ -752,8 +752,10 @@ static int usbhsc_resume(struct device *dev)
        struct usbhs_priv *priv = dev_get_drvdata(dev);
        struct platform_device *pdev = usbhs_priv_to_pdev(priv);
 
-       if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
+       if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) {
                usbhsc_power_ctrl(priv, 1);
+               usbhs_mod_autonomy_mode(priv);
+       }
 
        usbhs_platform_call(priv, phy_reset, pdev);
 
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c 
b/drivers/usb/renesas_usbhs/mod_gadget.c
index 5bc7a6138855..93fba9033b00 100644
--- a/drivers/usb/renesas_usbhs/mod_gadget.c
+++ b/drivers/usb/renesas_usbhs/mod_gadget.c
@@ -37,6 +37,7 @@ struct usbhsg_gpriv;
 struct usbhsg_uep {
        struct usb_ep            ep;
        struct usbhs_pipe       *pipe;
+       spinlock_t              lock;   /* protect the pipe */
 
        char ep_name[EP_NAME_SIZE];
 
@@ -636,10 +637,16 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
 static int usbhsg_ep_disable(struct usb_ep *ep)
 {
        struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep);
-       struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep);
+       struct usbhs_pipe *pipe;
+       unsigned long flags;
+       int ret = 0;
 
-       if (!pipe)
-               return -EINVAL;
+       spin_lock_irqsave(&uep->lock, flags);
+       pipe = usbhsg_uep_to_pipe(uep);
+       if (!pipe) {
+               ret = -EINVAL;
+               goto out;
+       }
 
        usbhsg_pipe_disable(uep);
        usbhs_pipe_free(pipe);
@@ -647,6 +654,9 @@ static int usbhsg_ep_disable(struct usb_ep *ep)
        uep->pipe->mod_private  = NULL;
        uep->pipe               = NULL;
 
+out:
+       spin_unlock_irqrestore(&uep->lock, flags);
+
        return 0;
 }
 
@@ -696,8 +706,11 @@ static int usbhsg_ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
 {
        struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep);
        struct usbhsg_request *ureq = usbhsg_req_to_ureq(req);
-       struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep);
+       struct usbhs_pipe *pipe;
+       unsigned long flags;
 
+       spin_lock_irqsave(&uep->lock, flags);
+       pipe = usbhsg_uep_to_pipe(uep);
        if (pipe)
                usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq));
 
@@ -706,6 +719,7 @@ static int usbhsg_ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
         * even if the pipe is NULL.
         */
        usbhsg_queue_pop(uep, ureq, -ECONNRESET);
+       spin_unlock_irqrestore(&uep->lock, flags);
 
        return 0;
 }
@@ -852,10 +866,10 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 
status)
 {
        struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv);
        struct usbhs_mod *mod = usbhs_mod_get_current(priv);
-       struct usbhsg_uep *dcp = usbhsg_gpriv_to_dcp(gpriv);
+       struct usbhsg_uep *uep;
        struct device *dev = usbhs_priv_to_dev(priv);
        unsigned long flags;
-       int ret = 0;
+       int ret = 0, i;
 
        /********************  spin lock ********************/
        usbhs_lock(priv, flags);
@@ -887,7 +901,9 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 
status)
        usbhs_sys_set_test_mode(priv, 0);
        usbhs_sys_function_ctrl(priv, 0);
 
-       usbhsg_ep_disable(&dcp->ep);
+       /* disable all eps */
+       usbhsg_for_each_uep_with_dcp(uep, gpriv, i)
+               usbhsg_ep_disable(&uep->ep);
 
        dev_dbg(dev, "stop gadget\n");
 
@@ -1069,6 +1085,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
                ret = -ENOMEM;
                goto usbhs_mod_gadget_probe_err_gpriv;
        }
+       spin_lock_init(&uep->lock);
 
        gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED);
        dev_info(dev, "%stransceiver found\n",
diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
index fba4005dd737..6a7720e66595 100644
--- a/drivers/usb/storage/isd200.c
+++ b/drivers/usb/storage/isd200.c
@@ -1529,8 +1529,11 @@ static void isd200_ata_command(struct scsi_cmnd *srb, 
struct us_data *us)
 
        /* Make sure driver was initialized */
 
-       if (us->extra == NULL)
+       if (us->extra == NULL) {
                usb_stor_dbg(us, "ERROR Driver not initialized\n");
+               srb->result = DID_ERROR << 16;
+               return;
+       }
 
        scsi_set_resid(srb, 0);
        /* scsi_bufflen might change in protocol translation to ata */
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index d1d70e0b011b..881fc3a55edc 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -419,6 +419,34 @@ static void vfio_group_put(struct vfio_group *group)
        kref_put_mutex(&group->kref, vfio_group_release, &vfio.group_lock);
 }
 
+struct vfio_group_put_work {
+       struct work_struct work;
+       struct vfio_group *group;
+};
+
+static void vfio_group_put_bg(struct work_struct *work)
+{
+       struct vfio_group_put_work *do_work;
+
+       do_work = container_of(work, struct vfio_group_put_work, work);
+
+       vfio_group_put(do_work->group);
+       kfree(do_work);
+}
+
+static void vfio_group_schedule_put(struct vfio_group *group)
+{
+       struct vfio_group_put_work *do_work;
+
+       do_work = kmalloc(sizeof(*do_work), GFP_KERNEL);
+       if (WARN_ON(!do_work))
+               return;
+
+       INIT_WORK(&do_work->work, vfio_group_put_bg);
+       do_work->group = group;
+       schedule_work(&do_work->work);
+}
+
 /* Assume group_lock or group reference is held */
 static void vfio_group_get(struct vfio_group *group)
 {
@@ -743,7 +771,14 @@ static int vfio_iommu_group_notifier(struct notifier_block 
*nb,
                break;
        }
 
-       vfio_group_put(group);
+       /*
+        * If we're the last reference to the group, the group will be
+        * released, which includes unregistering the iommu group notifier.
+        * We hold a read-lock on that notifier list, unregistering needs
+        * a write-lock... deadlock.  Release our reference asynchronously
+        * to avoid that situation.
+        */
+       vfio_group_schedule_put(group);
        return NOTIFY_OK;
 }
 
@@ -1716,6 +1751,15 @@ void vfio_group_put_external_user(struct vfio_group 
*group)
 }
 EXPORT_SYMBOL_GPL(vfio_group_put_external_user);
 
+bool vfio_external_group_match_file(struct vfio_group *test_group,
+                                   struct file *filep)
+{
+       struct vfio_group *group = filep->private_data;
+
+       return (filep->f_op == &vfio_group_fops) && (group == test_group);
+}
+EXPORT_SYMBOL_GPL(vfio_external_group_match_file);
+
 int vfio_external_user_iommu_id(struct vfio_group *group)
 {
        return iommu_group_id(group->iommu_group);
diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
index d6950e0802b7..980f32817305 100644
--- a/drivers/xen/xen-scsiback.c
+++ b/drivers/xen/xen-scsiback.c
@@ -134,9 +134,7 @@ struct vscsibk_pend {
        struct page *pages[VSCSI_MAX_GRANTS];
 
        struct se_cmd se_cmd;
-};
 
-struct scsiback_tmr {
        atomic_t tmr_complete;
        wait_queue_head_t tmr_wait;
 };
@@ -599,26 +597,20 @@ static void scsiback_device_action(struct vscsibk_pend 
*pending_req,
        struct scsiback_tpg *tpg = pending_req->v2p->tpg;
        struct scsiback_nexus *nexus = tpg->tpg_nexus;
        struct se_cmd *se_cmd = &pending_req->se_cmd;
-       struct scsiback_tmr *tmr;
        u64 unpacked_lun = pending_req->v2p->lun;
        int rc, err = FAILED;
 
-       tmr = kzalloc(sizeof(struct scsiback_tmr), GFP_KERNEL);
-       if (!tmr) {
-               target_put_sess_cmd(se_cmd);
-               goto err;
-       }
-
-       init_waitqueue_head(&tmr->tmr_wait);
+       init_waitqueue_head(&pending_req->tmr_wait);
 
        rc = target_submit_tmr(&pending_req->se_cmd, nexus->tvn_se_sess,
                               &pending_req->sense_buffer[0],
-                              unpacked_lun, tmr, act, GFP_KERNEL,
+                              unpacked_lun, NULL, act, GFP_KERNEL,
                               tag, TARGET_SCF_ACK_KREF);
        if (rc)
                goto err;
 
-       wait_event(tmr->tmr_wait, atomic_read(&tmr->tmr_complete));
+       wait_event(pending_req->tmr_wait,
+                  atomic_read(&pending_req->tmr_complete));
 
        err = (se_cmd->se_tmr_req->response == TMR_FUNCTION_COMPLETE) ?
                SUCCESS : FAILED;
@@ -626,9 +618,8 @@ static void scsiback_device_action(struct vscsibk_pend 
*pending_req,
        scsiback_do_resp_with_sense(NULL, err, 0, pending_req);
        transport_generic_free_cmd(&pending_req->se_cmd, 1);
        return;
+
 err:
-       if (tmr)
-               kfree(tmr);
        scsiback_do_resp_with_sense(NULL, err, 0, pending_req);
 }
 
@@ -1389,12 +1380,6 @@ static int scsiback_check_stop_free(struct se_cmd 
*se_cmd)
 static void scsiback_release_cmd(struct se_cmd *se_cmd)
 {
        struct se_session *se_sess = se_cmd->se_sess;
-       struct se_tmr_req *se_tmr = se_cmd->se_tmr_req;
-
-       if (se_tmr && se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) {
-               struct scsiback_tmr *tmr = se_tmr->fabric_tmr_ptr;
-               kfree(tmr);
-       }
 
        percpu_ida_free(&se_sess->sess_tag_pool, se_cmd->map_tag);
 }
@@ -1455,11 +1440,11 @@ static int scsiback_queue_status(struct se_cmd *se_cmd)
 
 static void scsiback_queue_tm_rsp(struct se_cmd *se_cmd)
 {
-       struct se_tmr_req *se_tmr = se_cmd->se_tmr_req;
-       struct scsiback_tmr *tmr = se_tmr->fabric_tmr_ptr;
+       struct vscsibk_pend *pending_req = container_of(se_cmd,
+                               struct vscsibk_pend, se_cmd);
 
-       atomic_set(&tmr->tmr_complete, 1);
-       wake_up(&tmr->tmr_wait);
+       atomic_set(&pending_req->tmr_complete, 1);
+       wake_up(&pending_req->tmr_wait);
 }
 
 static void scsiback_aborted_task(struct se_cmd *se_cmd)
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c
index 247b8dfaf6e5..8d8370ddb6b2 100644
--- a/fs/btrfs/acl.c
+++ b/fs/btrfs/acl.c
@@ -78,12 +78,6 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans,
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = XATTR_NAME_POSIX_ACL_ACCESS;
-               if (acl) {
-                       ret = posix_acl_update_mode(inode, &inode->i_mode, 
&acl);
-                       if (ret)
-                               return ret;
-               }
-               ret = 0;
                break;
        case ACL_TYPE_DEFAULT:
                if (!S_ISDIR(inode->i_mode))
@@ -119,6 +113,13 @@ static int __btrfs_set_acl(struct btrfs_trans_handle 
*trans,
 
 int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
+       int ret;
+
+       if (type == ACL_TYPE_ACCESS && acl) {
+               ret = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+               if (ret)
+                       return ret;
+       }
        return __btrfs_set_acl(NULL, inode, acl, type);
 }
 
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index aca0d884de73..cec25691cbae 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -292,6 +292,11 @@ static int __dcache_readdir(struct file *file,  struct 
dir_context *ctx,
                if (ret < 0)
                        err = ret;
                dput(last);
+               /* last_name no longer match cache index */
+               if (fi->readdir_cache_idx >= 0) {
+                       fi->readdir_cache_idx = -1;
+                       fi->dir_release_count = 0;
+               }
        }
        return err;
 }
diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c
index 79dafa71effd..069c0dceda01 100644
--- a/fs/ext2/acl.c
+++ b/fs/ext2/acl.c
@@ -175,11 +175,8 @@ ext2_get_acl(struct inode *inode, int type)
        return acl;
 }
 
-/*
- * inode->i_mutex: down
- */
-int
-ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
+static int
+__ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
        int name_index;
        void *value = NULL;
@@ -189,13 +186,6 @@ ext2_set_acl(struct inode *inode, struct posix_acl *acl, 
int type)
        switch(type) {
                case ACL_TYPE_ACCESS:
                        name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS;
-                       if (acl) {
-                               error = posix_acl_update_mode(inode, 
&inode->i_mode, &acl);
-                               if (error)
-                                       return error;
-                               inode->i_ctime = current_time(inode);
-                               mark_inode_dirty(inode);
-                       }
                        break;
 
                case ACL_TYPE_DEFAULT:
@@ -222,6 +212,24 @@ ext2_set_acl(struct inode *inode, struct posix_acl *acl, 
int type)
 }
 
 /*
+ * inode->i_mutex: down
+ */
+int
+ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
+{
+       int error;
+
+       if (type == ACL_TYPE_ACCESS && acl) {
+               error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+               if (error)
+                       return error;
+               inode->i_ctime = current_time(inode);
+               mark_inode_dirty(inode);
+       }
+       return __ext2_set_acl(inode, acl, type);
+}
+
+/*
  * Initialize the ACLs of a new inode. Called from ext2_new_inode.
  *
  * dir->i_mutex: down
@@ -238,12 +246,12 @@ ext2_init_acl(struct inode *inode, struct inode *dir)
                return error;
 
        if (default_acl) {
-               error = ext2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
+               error = __ext2_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
                posix_acl_release(default_acl);
        }
        if (acl) {
                if (!error)
-                       error = ext2_set_acl(inode, acl, ACL_TYPE_ACCESS);
+                       error = __ext2_set_acl(inode, acl, ACL_TYPE_ACCESS);
                posix_acl_release(acl);
        }
        return error;
diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
index 6fe23af509e1..55aa29c0c78d 100644
--- a/fs/f2fs/acl.c
+++ b/fs/f2fs/acl.c
@@ -211,7 +211,7 @@ static int __f2fs_set_acl(struct inode *inode, int type,
        switch (type) {
        case ACL_TYPE_ACCESS:
                name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS;
-               if (acl) {
+               if (acl && !ipage) {
                        error = posix_acl_update_mode(inode, &inode->i_mode, 
&acl);
                        if (error)
                                return error;
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index a7943f861d68..74a2b444406d 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -1805,6 +1805,8 @@ static int read_normal_summaries(struct f2fs_sb_info 
*sbi, int type)
 
 static int restore_curseg_summaries(struct f2fs_sb_info *sbi)
 {
+       struct f2fs_journal *sit_j = CURSEG_I(sbi, CURSEG_COLD_DATA)->journal;
+       struct f2fs_journal *nat_j = CURSEG_I(sbi, CURSEG_HOT_DATA)->journal;
        int type = CURSEG_HOT_DATA;
        int err;
 
@@ -1831,6 +1833,11 @@ static int restore_curseg_summaries(struct f2fs_sb_info 
*sbi)
                        return err;
        }
 
+       /* sanity check for summary blocks */
+       if (nats_in_cursum(nat_j) > NAT_JOURNAL_ENTRIES ||
+                       sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES)
+               return -EINVAL;
+
        return 0;
 }
 
diff --git a/fs/hfsplus/posix_acl.c b/fs/hfsplus/posix_acl.c
index 9b92058a1240..6bb5d7c42888 100644
--- a/fs/hfsplus/posix_acl.c
+++ b/fs/hfsplus/posix_acl.c
@@ -51,8 +51,8 @@ struct posix_acl *hfsplus_get_posix_acl(struct inode *inode, 
int type)
        return acl;
 }
 
-int hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl,
-               int type)
+static int __hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl,
+                                  int type)
 {
        int err;
        char *xattr_name;
@@ -64,12 +64,6 @@ int hfsplus_set_posix_acl(struct inode *inode, struct 
posix_acl *acl,
        switch (type) {
        case ACL_TYPE_ACCESS:
                xattr_name = XATTR_NAME_POSIX_ACL_ACCESS;
-               if (acl) {
-                       err = posix_acl_update_mode(inode, &inode->i_mode, 
&acl);
-                       if (err)
-                               return err;
-               }
-               err = 0;
                break;
 
        case ACL_TYPE_DEFAULT:
@@ -105,6 +99,18 @@ int hfsplus_set_posix_acl(struct inode *inode, struct 
posix_acl *acl,
        return err;
 }
 
+int hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl, int type)
+{
+       int err;
+
+       if (type == ACL_TYPE_ACCESS && acl) {
+               err = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+               if (err)
+                       return err;
+       }
+       return __hfsplus_set_posix_acl(inode, acl, type);
+}
+
 int hfsplus_init_posix_acl(struct inode *inode, struct inode *dir)
 {
        int err = 0;
@@ -122,15 +128,15 @@ int hfsplus_init_posix_acl(struct inode *inode, struct 
inode *dir)
                return err;
 
        if (default_acl) {
-               err = hfsplus_set_posix_acl(inode, default_acl,
-                                           ACL_TYPE_DEFAULT);
+               err = __hfsplus_set_posix_acl(inode, default_acl,
+                                             ACL_TYPE_DEFAULT);
                posix_acl_release(default_acl);
        }
 
        if (acl) {
                if (!err)
-                       err = hfsplus_set_posix_acl(inode, acl,
-                                                   ACL_TYPE_ACCESS);
+                       err = __hfsplus_set_posix_acl(inode, acl,
+                                                     ACL_TYPE_ACCESS);
                posix_acl_release(acl);
        }
        return err;
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 53e02b8bd9bd..d04ec3814779 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -1167,11 +1167,13 @@ static int nfs_lookup_revalidate(struct dentry *dentry, 
unsigned int flags)
        /* Force a full look up iff the parent directory has changed */
        if (!nfs_is_exclusive_create(dir, flags) &&
            nfs_check_verifier(dir, dentry, flags & LOOKUP_RCU)) {
-
-               if (nfs_lookup_verify_inode(inode, flags)) {
+               error = nfs_lookup_verify_inode(inode, flags);
+               if (error) {
                        if (flags & LOOKUP_RCU)
                                return -ECHILD;
-                       goto out_zap_parent;
+                       if (error == -ESTALE)
+                               goto out_zap_parent;
+                       goto out_error;
                }
                goto out_valid;
        }
@@ -1195,8 +1197,10 @@ static int nfs_lookup_revalidate(struct dentry *dentry, 
unsigned int flags)
        trace_nfs_lookup_revalidate_enter(dir, dentry, flags);
        error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr, 
label);
        trace_nfs_lookup_revalidate_exit(dir, dentry, flags, error);
-       if (error)
+       if (error == -ESTALE || error == -ENOENT)
                goto out_bad;
+       if (error)
+               goto out_error;
        if (nfs_compare_fh(NFS_FH(inode), fhandle))
                goto out_bad;
        if ((error = nfs_refresh_inode(inode, fattr)) != 0)
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index bf4ec5ecc97e..76ae25661d3f 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1278,9 +1278,9 @@ static int nfs_check_inode_attributes(struct inode 
*inode, struct nfs_fattr *fat
                return 0;
        /* Has the inode gone and changed behind our back? */
        if ((fattr->valid & NFS_ATTR_FATTR_FILEID) && nfsi->fileid != 
fattr->fileid)
-               return -EIO;
+               return -ESTALE;
        if ((fattr->valid & NFS_ATTR_FATTR_TYPE) && (inode->i_mode & S_IFMT) != 
(fattr->mode & S_IFMT))
-               return -EIO;
+               return -ESTALE;
 
        if (!nfs_file_has_buffered_writers(nfsi)) {
                /* Verify a few of the more important attributes */
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 0e100856c7b8..e7c8ac41e288 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -1146,6 +1146,7 @@ static int ovl_fill_super(struct super_block *sb, void 
*data, int silent)
        unsigned int stacklen = 0;
        unsigned int i;
        bool remote = false;
+       struct cred *cred;
        int err;
 
        err = -ENOMEM;
@@ -1309,10 +1310,14 @@ static int ovl_fill_super(struct super_block *sb, void 
*data, int silent)
        else
                sb->s_d_op = &ovl_dentry_operations;
 
-       ufs->creator_cred = prepare_creds();
-       if (!ufs->creator_cred)
+       err = -ENOMEM;
+       ufs->creator_cred = cred = prepare_creds();
+       if (!cred)
                goto out_put_lower_mnt;
 
+       /* Never override disk quota limits or use reserved space */
+       cap_lower(cred->cap_effective, CAP_SYS_RESOURCE);
+
        err = -ENOMEM;
        oe = ovl_alloc_entry(numlower);
        if (!oe)
diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c
index 3d2256a425ee..d92a1dc6ee70 100644
--- a/fs/reiserfs/xattr_acl.c
+++ b/fs/reiserfs/xattr_acl.c
@@ -37,7 +37,14 @@ reiserfs_set_acl(struct inode *inode, struct posix_acl *acl, 
int type)
        error = journal_begin(&th, inode->i_sb, jcreate_blocks);
        reiserfs_write_unlock(inode->i_sb);
        if (error == 0) {
+               if (type == ACL_TYPE_ACCESS && acl) {
+                       error = posix_acl_update_mode(inode, &inode->i_mode,
+                                                     &acl);
+                       if (error)
+                               goto unlock;
+               }
                error = __reiserfs_set_acl(&th, inode, type, acl);
+unlock:
                reiserfs_write_lock(inode->i_sb);
                error2 = journal_end(&th);
                reiserfs_write_unlock(inode->i_sb);
@@ -241,11 +248,6 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, 
struct inode *inode,
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = XATTR_NAME_POSIX_ACL_ACCESS;
-               if (acl) {
-                       error = posix_acl_update_mode(inode, &inode->i_mode, 
&acl);
-                       if (error)
-                               return error;
-               }
                break;
        case ACL_TYPE_DEFAULT:
                name = XATTR_NAME_POSIX_ACL_DEFAULT;
diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c
index 91bc76dc559e..7d764e3b6c79 100644
--- a/fs/ubifs/journal.c
+++ b/fs/ubifs/journal.c
@@ -576,7 +576,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct 
inode *dir,
        /* Make sure to also account for extended attributes */
        len += host_ui->data_len;
 
-       dent = kmalloc(len, GFP_NOFS);
+       dent = kzalloc(len, GFP_NOFS);
        if (!dent)
                return -ENOMEM;
 
@@ -952,7 +952,7 @@ int ubifs_jnl_xrename(struct ubifs_info *c, const struct 
inode *fst_dir,
        if (twoparents)
                len += plen;
 
-       dent1 = kmalloc(len, GFP_NOFS);
+       dent1 = kzalloc(len, GFP_NOFS);
        if (!dent1)
                return -ENOMEM;
 
@@ -1102,7 +1102,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct 
inode *old_dir,
        len = aligned_dlen1 + aligned_dlen2 + ALIGN(ilen, 8) + ALIGN(plen, 8);
        if (move)
                len += plen;
-       dent = kmalloc(len, GFP_NOFS);
+       dent = kzalloc(len, GFP_NOFS);
        if (!dent)
                return -ENOMEM;
 
@@ -1466,7 +1466,7 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const 
struct inode *host,
        hlen = host_ui->data_len + UBIFS_INO_NODE_SZ;
        len = aligned_xlen + UBIFS_INO_NODE_SZ + ALIGN(hlen, 8);
 
-       xent = kmalloc(len, GFP_NOFS);
+       xent = kzalloc(len, GFP_NOFS);
        if (!xent)
                return -ENOMEM;
 
@@ -1573,7 +1573,7 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const 
struct inode *inode,
        aligned_len1 = ALIGN(len1, 8);
        aligned_len = aligned_len1 + ALIGN(len2, 8);
 
-       ino = kmalloc(aligned_len, GFP_NOFS);
+       ino = kzalloc(aligned_len, GFP_NOFS);
        if (!ino)
                return -ENOMEM;
 
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 129b18a29c8f..035943501b9f 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -1243,8 +1243,8 @@ int udf_setsize(struct inode *inode, loff_t newsize)
                        return err;
                }
 set_size:
-               truncate_setsize(inode, newsize);
                up_write(&iinfo->i_data_sem);
+               truncate_setsize(inode, newsize);
        } else {
                if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
                        down_write(&iinfo->i_data_sem);
@@ -1261,9 +1261,9 @@ int udf_setsize(struct inode *inode, loff_t newsize)
                                          udf_get_block);
                if (err)
                        return err;
+               truncate_setsize(inode, newsize);
                down_write(&iinfo->i_data_sem);
                udf_clear_extent_cache(inode);
-               truncate_setsize(inode, newsize);
                udf_truncate_extents(inode);
                up_write(&iinfo->i_data_sem);
        }
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c
index b468e041f207..7034e17535de 100644
--- a/fs/xfs/xfs_acl.c
+++ b/fs/xfs/xfs_acl.c
@@ -170,8 +170,8 @@ xfs_get_acl(struct inode *inode, int type)
        return acl;
 }
 
-STATIC int
-__xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
+int
+__xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
        struct xfs_inode *ip = XFS_I(inode);
        unsigned char *ea_name;
@@ -268,5 +268,5 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int 
type)
        }
 
  set_acl:
-       return __xfs_set_acl(inode, type, acl);
+       return __xfs_set_acl(inode, acl, type);
 }
diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h
index 286fa89217f5..04327318ef67 100644
--- a/fs/xfs/xfs_acl.h
+++ b/fs/xfs/xfs_acl.h
@@ -24,6 +24,7 @@ struct posix_acl;
 #ifdef CONFIG_XFS_POSIX_ACL
 extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
 extern int xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
+extern int __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
 #else
 static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type)
 {
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index f5e0f608e245..a1247c3c1efb 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c
@@ -190,12 +190,12 @@ xfs_generic_create(
 
 #ifdef CONFIG_XFS_POSIX_ACL
        if (default_acl) {
-               error = xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
+               error = __xfs_set_acl(inode, default_acl, ACL_TYPE_DEFAULT);
                if (error)
                        goto out_cleanup_inode;
        }
        if (acl) {
-               error = xfs_set_acl(inode, acl, ACL_TYPE_ACCESS);
+               error = __xfs_set_acl(inode, acl, ACL_TYPE_ACCESS);
                if (error)
                        goto out_cleanup_inode;
        }
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index 0ecae0b1cd34..ed466750e744 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -88,6 +88,8 @@ extern void vfio_unregister_iommu_driver(
  */
 extern struct vfio_group *vfio_group_get_external_user(struct file *filep);
 extern void vfio_group_put_external_user(struct vfio_group *group);
+extern bool vfio_external_group_match_file(struct vfio_group *group,
+                                          struct file *filep);
 extern int vfio_external_user_iommu_id(struct vfio_group *group);
 extern long vfio_external_check_extension(struct vfio_group *group,
                                          unsigned long arg);
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index b9ec4939b80c..f2b9a2ffe9e6 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -248,6 +248,7 @@ enum scsi_target_state {
        STARGET_CREATED = 1,
        STARGET_RUNNING,
        STARGET_REMOVE,
+       STARGET_CREATED_REMOVE,
        STARGET_DEL,
 };
 
diff --git a/include/target/iscsi/iscsi_target_core.h 
b/include/target/iscsi/iscsi_target_core.h
index 4ac24f5a3308..33b2e75bf2eb 100644
--- a/include/target/iscsi/iscsi_target_core.h
+++ b/include/target/iscsi/iscsi_target_core.h
@@ -64,6 +64,14 @@
 #define TA_DEFAULT_FABRIC_PROT_TYPE    0
 /* TPG status needs to be enabled to return sendtargets discovery endpoint 
info */
 #define TA_DEFAULT_TPG_ENABLED_SENDTARGETS 1
+/*
+ * Used to control the sending of keys with optional to respond state bit,
+ * as a workaround for non RFC compliant initiators,that do not propose,
+ * nor respond to specific keys required for login to complete.
+ *
+ * See iscsi_check_proposer_for_optional_reply() for more details.
+ */
+#define TA_DEFAULT_LOGIN_KEYS_WORKAROUND 1
 
 #define ISCSI_IOV_DATA_BUFFER          5
 
@@ -766,6 +774,7 @@ struct iscsi_tpg_attrib {
        u8                      t10_pi;
        u32                     fabric_prot_type;
        u32                     tpg_enabled_sendtargets;
+       u32                     login_keys_workaround;
        struct iscsi_portal_group *tpg;
 };
 
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 30ccc7029d18..f5a693589d66 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7088,21 +7088,6 @@ static void perf_log_itrace_start(struct perf_event 
*event)
        perf_output_end(&handle);
 }
 
-static bool sample_is_allowed(struct perf_event *event, struct pt_regs *regs)
-{
-       /*
-        * Due to interrupt latency (AKA "skid"), we may enter the
-        * kernel before taking an overflow, even if the PMU is only
-        * counting user events.
-        * To avoid leaking information to userspace, we must always
-        * reject kernel samples when exclude_kernel is set.
-        */
-       if (event->attr.exclude_kernel && !user_mode(regs))
-               return false;
-
-       return true;
-}
-
 /*
  * Generic event overflow handling, sampling.
  */
@@ -7150,12 +7135,6 @@ static int __perf_event_overflow(struct perf_event 
*event,
        }
 
        /*
-        * For security, drop the skid kernel samples if necessary.
-        */
-       if (!sample_is_allowed(event, regs))
-               return ret;
-
-       /*
         * XXX event_limit might not quite work as expected on inherited
         * events
         */
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 9ba04aa740b9..d67ef56ca9bc 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -629,7 +629,8 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,
         * Rate limit to the tick as a hot fix to prevent DOS. Will be
         * mopped up later.
         */
-       if (ktime_to_ns(timr->it.alarm.interval) < TICK_NSEC)
+       if (timr->it.alarm.interval.tv64 &&
+                       ktime_to_ns(timr->it.alarm.interval) < TICK_NSEC)
                timr->it.alarm.interval = ktime_set(0, TICK_NSEC);
 
        exp = timespec_to_ktime(new_setting->it_value);
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 221eb59272e1..4f7ea8446bb5 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -3590,7 +3590,7 @@ match_records(struct ftrace_hash *hash, char *func, int 
len, char *mod)
        int exclude_mod = 0;
        int found = 0;
        int ret;
-       int clear_filter;
+       int clear_filter = 0;
 
        if (func) {
                func_g.type = filter_parse_regex(func, len, &func_g.search,
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 52ee2c51f4b3..53c308068e39 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -7162,6 +7162,7 @@ static int instance_rmdir(const char *name)
        }
        kfree(tr->topts);
 
+       free_cpumask_var(tr->tracing_cpumask);
        kfree(tr->name);
        kfree(tr);
 
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 43faf2aea2ab..658c900752c6 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -23,6 +23,7 @@
 #include <linux/debugfs.h>
 #include <linux/scatterlist.h>
 #include <linux/crypto.h>
+#include <crypto/algapi.h>
 #include <crypto/b128ops.h>
 #include <crypto/hash.h>
 
@@ -506,7 +507,7 @@ bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
        if (err)
                return false;
 
-       return !memcmp(bdaddr->b, hash, 3);
+       return !crypto_memneq(bdaddr->b, hash, 3);
 }
 
 int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
@@ -559,7 +560,7 @@ int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 
rand[16])
                        /* This is unlikely, but we need to check that
                         * we didn't accidentially generate a debug key.
                         */
-                       if (memcmp(smp->local_sk, debug_sk, 32))
+                       if (crypto_memneq(smp->local_sk, debug_sk, 32))
                                break;
                }
                smp->debug_key = false;
@@ -973,7 +974,7 @@ static u8 smp_random(struct smp_chan *smp)
        if (ret)
                return SMP_UNSPECIFIED;
 
-       if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
+       if (crypto_memneq(smp->pcnf, confirm, sizeof(smp->pcnf))) {
                BT_ERR("Pairing failed (confirmation values mismatch)");
                return SMP_CONFIRM_FAILED;
        }
@@ -1473,7 +1474,7 @@ static u8 sc_passkey_round(struct smp_chan *smp, u8 
smp_op)
                           smp->rrnd, r, cfm))
                        return SMP_UNSPECIFIED;
 
-               if (memcmp(smp->pcnf, cfm, 16))
+               if (crypto_memneq(smp->pcnf, cfm, 16))
                        return SMP_CONFIRM_FAILED;
 
                smp->passkey_round++;
@@ -1857,7 +1858,7 @@ static u8 sc_send_public_key(struct smp_chan *smp)
                        /* This is unlikely, but we need to check that
                         * we didn't accidentially generate a debug key.
                         */
-                       if (memcmp(smp->local_sk, debug_sk, 32))
+                       if (crypto_memneq(smp->local_sk, debug_sk, 32))
                                break;
                }
        }
@@ -2122,7 +2123,7 @@ static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, 
struct sk_buff *skb)
                if (err)
                        return SMP_UNSPECIFIED;
 
-               if (memcmp(smp->pcnf, cfm, 16))
+               if (crypto_memneq(smp->pcnf, cfm, 16))
                        return SMP_CONFIRM_FAILED;
        } else {
                smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
@@ -2603,7 +2604,7 @@ static int smp_cmd_public_key(struct l2cap_conn *conn, 
struct sk_buff *skb)
                if (err)
                        return SMP_UNSPECIFIED;
 
-               if (memcmp(cfm.confirm_val, smp->pcnf, 16))
+               if (crypto_memneq(cfm.confirm_val, smp->pcnf, 16))
                        return SMP_CONFIRM_FAILED;
        }
 
@@ -2636,7 +2637,7 @@ static int smp_cmd_public_key(struct l2cap_conn *conn, 
struct sk_buff *skb)
        else
                hcon->pending_sec_level = BT_SECURITY_FIPS;
 
-       if (!memcmp(debug_pk, smp->remote_pk, 64))
+       if (!crypto_memneq(debug_pk, smp->remote_pk, 64))
                set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
 
        if (smp->method == DSP_PASSKEY) {
@@ -2735,7 +2736,7 @@ static int smp_cmd_dhkey_check(struct l2cap_conn *conn, 
struct sk_buff *skb)
        if (err)
                return SMP_UNSPECIFIED;
 
-       if (memcmp(check->e, e, 16))
+       if (crypto_memneq(check->e, e, 16))
                return SMP_DHKEY_CHECK_FAILED;
 
        if (!hcon->out) {
@@ -3446,7 +3447,7 @@ static int __init test_ah(struct crypto_cipher *tfm_aes)
        if (err)
                return err;
 
-       if (memcmp(res, exp, 3))
+       if (crypto_memneq(res, exp, 3))
                return -EINVAL;
 
        return 0;
@@ -3476,7 +3477,7 @@ static int __init test_c1(struct crypto_cipher *tfm_aes)
        if (err)
                return err;
 
-       if (memcmp(res, exp, 16))
+       if (crypto_memneq(res, exp, 16))
                return -EINVAL;
 
        return 0;
@@ -3501,7 +3502,7 @@ static int __init test_s1(struct crypto_cipher *tfm_aes)
        if (err)
                return err;
 
-       if (memcmp(res, exp, 16))
+       if (crypto_memneq(res, exp, 16))
                return -EINVAL;
 
        return 0;
@@ -3533,7 +3534,7 @@ static int __init test_f4(struct crypto_shash *tfm_cmac)
        if (err)
                return err;
 
-       if (memcmp(res, exp, 16))
+       if (crypto_memneq(res, exp, 16))
                return -EINVAL;
 
        return 0;
@@ -3567,10 +3568,10 @@ static int __init test_f5(struct crypto_shash *tfm_cmac)
        if (err)
                return err;
 
-       if (memcmp(mackey, exp_mackey, 16))
+       if (crypto_memneq(mackey, exp_mackey, 16))
                return -EINVAL;
 
-       if (memcmp(ltk, exp_ltk, 16))
+       if (crypto_memneq(ltk, exp_ltk, 16))
                return -EINVAL;
 
        return 0;
@@ -3603,7 +3604,7 @@ static int __init test_f6(struct crypto_shash *tfm_cmac)
        if (err)
                return err;
 
-       if (memcmp(res, exp, 16))
+       if (crypto_memneq(res, exp, 16))
                return -EINVAL;
 
        return 0;
@@ -3657,7 +3658,7 @@ static int __init test_h6(struct crypto_shash *tfm_cmac)
        if (err)
                return err;
 
-       if (memcmp(res, exp, 16))
+       if (crypto_memneq(res, exp, 16))
                return -EINVAL;
 
        return 0;
diff --git a/net/key/af_key.c b/net/key/af_key.c
index e67c28e614b9..d8d95b6415e4 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -65,6 +65,10 @@ struct pfkey_sock {
        } dump;
 };
 
+static int parse_sockaddr_pair(struct sockaddr *sa, int ext_len,
+                              xfrm_address_t *saddr, xfrm_address_t *daddr,
+                              u16 *family);
+
 static inline struct pfkey_sock *pfkey_sk(struct sock *sk)
 {
        return (struct pfkey_sock *)sk;
@@ -1922,19 +1926,14 @@ parse_ipsecrequest(struct xfrm_policy *xp, struct 
sadb_x_ipsecrequest *rq)
 
        /* addresses present only in tunnel mode */
        if (t->mode == XFRM_MODE_TUNNEL) {
-               u8 *sa = (u8 *) (rq + 1);
-               int family, socklen;
+               int err;
 
-               family = pfkey_sockaddr_extract((struct sockaddr *)sa,
-                                               &t->saddr);
-               if (!family)
-                       return -EINVAL;
-
-               socklen = pfkey_sockaddr_len(family);
-               if (pfkey_sockaddr_extract((struct sockaddr *)(sa + socklen),
-                                          &t->id.daddr) != family)
-                       return -EINVAL;
-               t->encap_family = family;
+               err = parse_sockaddr_pair(
+                       (struct sockaddr *)(rq + 1),
+                       rq->sadb_x_ipsecrequest_len - sizeof(*rq),
+                       &t->saddr, &t->id.daddr, &t->encap_family);
+               if (err)
+                       return err;
        } else
                t->encap_family = xp->family;
 
@@ -1954,7 +1953,11 @@ parse_ipsecrequests(struct xfrm_policy *xp, struct 
sadb_x_policy *pol)
        if (pol->sadb_x_policy_len * 8 < sizeof(struct sadb_x_policy))
                return -EINVAL;
 
-       while (len >= sizeof(struct sadb_x_ipsecrequest)) {
+       while (len >= sizeof(*rq)) {
+               if (len < rq->sadb_x_ipsecrequest_len ||
+                   rq->sadb_x_ipsecrequest_len < sizeof(*rq))
+                       return -EINVAL;
+
                if ((err = parse_ipsecrequest(xp, rq)) < 0)
                        return err;
                len -= rq->sadb_x_ipsecrequest_len;
@@ -2417,7 +2420,6 @@ static int key_pol_get_resp(struct sock *sk, struct 
xfrm_policy *xp, const struc
        return err;
 }
 
-#ifdef CONFIG_NET_KEY_MIGRATE
 static int pfkey_sockaddr_pair_size(sa_family_t family)
 {
        return PFKEY_ALIGN8(pfkey_sockaddr_len(family) * 2);
@@ -2429,7 +2431,7 @@ static int parse_sockaddr_pair(struct sockaddr *sa, int 
ext_len,
 {
        int af, socklen;
 
-       if (ext_len < pfkey_sockaddr_pair_size(sa->sa_family))
+       if (ext_len < 2 || ext_len < pfkey_sockaddr_pair_size(sa->sa_family))
                return -EINVAL;
 
        af = pfkey_sockaddr_extract(sa, saddr);
@@ -2445,6 +2447,7 @@ static int parse_sockaddr_pair(struct sockaddr *sa, int 
ext_len,
        return 0;
 }
 
+#ifdef CONFIG_NET_KEY_MIGRATE
 static int ipsecrequests_to_migrate(struct sadb_x_ipsecrequest *rq1, int len,
                                    struct xfrm_migrate *m)
 {
@@ -2452,13 +2455,14 @@ static int ipsecrequests_to_migrate(struct 
sadb_x_ipsecrequest *rq1, int len,
        struct sadb_x_ipsecrequest *rq2;
        int mode;
 
-       if (len <= sizeof(struct sadb_x_ipsecrequest) ||
-           len < rq1->sadb_x_ipsecrequest_len)
+       if (len < sizeof(*rq1) ||
+           len < rq1->sadb_x_ipsecrequest_len ||
+           rq1->sadb_x_ipsecrequest_len < sizeof(*rq1))
                return -EINVAL;
 
        /* old endoints */
        err = parse_sockaddr_pair((struct sockaddr *)(rq1 + 1),
-                                 rq1->sadb_x_ipsecrequest_len,
+                                 rq1->sadb_x_ipsecrequest_len - sizeof(*rq1),
                                  &m->old_saddr, &m->old_daddr,
                                  &m->old_family);
        if (err)
@@ -2467,13 +2471,14 @@ static int ipsecrequests_to_migrate(struct 
sadb_x_ipsecrequest *rq1, int len,
        rq2 = (struct sadb_x_ipsecrequest *)((u8 *)rq1 + 
rq1->sadb_x_ipsecrequest_len);
        len -= rq1->sadb_x_ipsecrequest_len;
 
-       if (len <= sizeof(struct sadb_x_ipsecrequest) ||
-           len < rq2->sadb_x_ipsecrequest_len)
+       if (len <= sizeof(*rq2) ||
+           len < rq2->sadb_x_ipsecrequest_len ||
+           rq2->sadb_x_ipsecrequest_len < sizeof(*rq2))
                return -EINVAL;
 
        /* new endpoints */
        err = parse_sockaddr_pair((struct sockaddr *)(rq2 + 1),
-                                 rq2->sadb_x_ipsecrequest_len,
+                                 rq2->sadb_x_ipsecrequest_len - sizeof(*rq2),
                                  &m->new_saddr, &m->new_daddr,
                                  &m->new_family);
        if (err)
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
index 2c1b498a7a27..e34d3f60fccd 100644
--- a/net/netfilter/ipvs/ip_vs_core.c
+++ b/net/netfilter/ipvs/ip_vs_core.c
@@ -849,10 +849,8 @@ static int handle_response_icmp(int af, struct sk_buff 
*skb,
 {
        unsigned int verdict = NF_DROP;
 
-       if (IP_VS_FWD_METHOD(cp) != 0) {
-               pr_err("shouldn't reach here, because the box is on the "
-                      "half connection in the tun/dr module.\n");
-       }
+       if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)
+               goto ignore_cp;
 
        /* Ensure the checksum is correct */
        if (!skb_csum_unnecessary(skb) && ip_vs_checksum_complete(skb, ihl)) {
@@ -886,6 +884,8 @@ static int handle_response_icmp(int af, struct sk_buff *skb,
                ip_vs_notrack(skb);
        else
                ip_vs_update_conntrack(skb, cp, 0);
+
+ignore_cp:
        verdict = NF_ACCEPT;
 
 out:
@@ -1385,8 +1385,11 @@ ip_vs_out(struct netns_ipvs *ipvs, unsigned int hooknum, 
struct sk_buff *skb, in
         */
        cp = pp->conn_out_get(ipvs, af, skb, &iph);
 
-       if (likely(cp))
+       if (likely(cp)) {
+               if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)
+                       goto ignore_cp;
                return handle_response(af, skb, pd, cp, &iph, hooknum);
+       }
 
        /* Check for real-server-started requests */
        if (atomic_read(&ipvs->conn_out_counter)) {
@@ -1444,9 +1447,15 @@ ip_vs_out(struct netns_ipvs *ipvs, unsigned int hooknum, 
struct sk_buff *skb, in
                        }
                }
        }
+
+out:
        IP_VS_DBG_PKT(12, af, pp, skb, iph.off,
                      "ip_vs_out: packet continues traversal as normal");
        return NF_ACCEPT;
+
+ignore_cp:
+       __ip_vs_conn_put(cp);
+       goto out;
 }
 
 /*
diff --git a/net/nfc/core.c b/net/nfc/core.c
index 122bb81da918..5cf33df888c3 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -982,6 +982,8 @@ static void nfc_release(struct device *d)
                        kfree(se);
        }
 
+       ida_simple_remove(&nfc_index_ida, dev->idx);
+
        kfree(dev);
 }
 
@@ -1056,6 +1058,7 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
                                    int tx_headroom, int tx_tailroom)
 {
        struct nfc_dev *dev;
+       int rc;
 
        if (!ops->start_poll || !ops->stop_poll || !ops->activate_target ||
            !ops->deactivate_target || !ops->im_transceive)
@@ -1068,6 +1071,15 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
        if (!dev)
                return NULL;
 
+       rc = ida_simple_get(&nfc_index_ida, 0, 0, GFP_KERNEL);
+       if (rc < 0)
+               goto err_free_dev;
+       dev->idx = rc;
+
+       dev->dev.class = &nfc_class;
+       dev_set_name(&dev->dev, "nfc%d", dev->idx);
+       device_initialize(&dev->dev);
+
        dev->ops = ops;
        dev->supported_protocols = supported_protocols;
        dev->tx_headroom = tx_headroom;
@@ -1090,6 +1102,11 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops,
        }
 
        return dev;
+
+err_free_dev:
+       kfree(dev);
+
+       return ERR_PTR(rc);
 }
 EXPORT_SYMBOL(nfc_allocate_device);
 
@@ -1104,14 +1121,6 @@ int nfc_register_device(struct nfc_dev *dev)
 
        pr_debug("dev_name=%s\n", dev_name(&dev->dev));
 
-       dev->idx = ida_simple_get(&nfc_index_ida, 0, 0, GFP_KERNEL);
-       if (dev->idx < 0)
-               return dev->idx;
-
-       dev->dev.class = &nfc_class;
-       dev_set_name(&dev->dev, "nfc%d", dev->idx);
-       device_initialize(&dev->dev);
-
        mutex_lock(&nfc_devlist_mutex);
        nfc_devlist_generation++;
        rc = device_add(&dev->dev);
@@ -1149,12 +1158,10 @@ EXPORT_SYMBOL(nfc_register_device);
  */
 void nfc_unregister_device(struct nfc_dev *dev)
 {
-       int rc, id;
+       int rc;
 
        pr_debug("dev_name=%s\n", dev_name(&dev->dev));
 
-       id = dev->idx;
-
        if (dev->rfkill) {
                rfkill_unregister(dev->rfkill);
                rfkill_destroy(dev->rfkill);
@@ -1179,8 +1186,6 @@ void nfc_unregister_device(struct nfc_dev *dev)
        nfc_devlist_generation++;
        device_del(&dev->dev);
        mutex_unlock(&nfc_devlist_mutex);
-
-       ida_simple_remove(&nfc_index_ida, id);
 }
 EXPORT_SYMBOL(nfc_unregister_device);
 
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c
index b9edf5fae6ae..e31dea17473d 100644
--- a/net/nfc/llcp_sock.c
+++ b/net/nfc/llcp_sock.c
@@ -76,7 +76,8 @@ static int llcp_sock_bind(struct socket *sock, struct 
sockaddr *addr, int alen)
        struct sockaddr_nfc_llcp llcp_addr;
        int len, ret = 0;
 
-       if (!addr || addr->sa_family != AF_NFC)
+       if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
+           addr->sa_family != AF_NFC)
                return -EINVAL;
 
        pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
@@ -150,7 +151,8 @@ static int llcp_raw_sock_bind(struct socket *sock, struct 
sockaddr *addr,
        struct sockaddr_nfc_llcp llcp_addr;
        int len, ret = 0;
 
-       if (!addr || addr->sa_family != AF_NFC)
+       if (!addr || alen < offsetofend(struct sockaddr, sa_family) ||
+           addr->sa_family != AF_NFC)
                return -EINVAL;
 
        pr_debug("sk %p addr %p family %d\n", sk, addr, addr->sa_family);
@@ -661,8 +663,7 @@ static int llcp_sock_connect(struct socket *sock, struct 
sockaddr *_addr,
 
        pr_debug("sock %p sk %p flags 0x%x\n", sock, sk, flags);
 
-       if (!addr || len < sizeof(struct sockaddr_nfc) ||
-           addr->sa_family != AF_NFC)
+       if (!addr || len < sizeof(*addr) || addr->sa_family != AF_NFC)
                return -EINVAL;
 
        if (addr->service_name_len == 0 && addr->dsap == 0)
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 61fff422424f..85a3d9ed4c29 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -1173,8 +1173,7 @@ struct nci_dev *nci_allocate_device(struct nci_ops *ops,
        return ndev;
 
 free_nfc:
-       kfree(ndev->nfc_dev);
-
+       nfc_free_device(ndev->nfc_dev);
 free_nci:
        kfree(ndev);
        return NULL;
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
index ea023b35f1c2..102c681c48b5 100644
--- a/net/nfc/netlink.c
+++ b/net/nfc/netlink.c
@@ -910,7 +910,9 @@ static int nfc_genl_activate_target(struct sk_buff *skb, 
struct genl_info *info)
        u32 device_idx, target_idx, protocol;
        int rc;
 
-       if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
+       if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
+           !info->attrs[NFC_ATTR_TARGET_INDEX] ||
+           !info->attrs[NFC_ATTR_PROTOCOLS])
                return -EINVAL;
 
        device_idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
diff --git a/net/sunrpc/auth_gss/gss_krb5_crypto.c 
b/net/sunrpc/auth_gss/gss_krb5_crypto.c
index 90115ceefd49..79aec90259cd 100644
--- a/net/sunrpc/auth_gss/gss_krb5_crypto.c
+++ b/net/sunrpc/auth_gss/gss_krb5_crypto.c
@@ -34,6 +34,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+#include <crypto/algapi.h>
 #include <crypto/hash.h>
 #include <crypto/skcipher.h>
 #include <linux/err.h>
@@ -927,7 +928,7 @@ gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset, 
struct xdr_buf *buf,
        if (ret)
                goto out_err;
 
-       if (memcmp(pkt_hmac, our_hmac, kctx->gk5e->cksumlength) != 0) {
+       if (crypto_memneq(pkt_hmac, our_hmac, kctx->gk5e->cksumlength) != 0) {
                ret = GSS_S_BAD_SIG;
                goto out_err;
        }
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
index bf7b52fce597..ff093edccea9 100644
--- a/sound/soc/soc-compress.c
+++ b/sound/soc/soc-compress.c
@@ -68,7 +68,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
 static int soc_compr_open_fe(struct snd_compr_stream *cstream)
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
-       struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream;
+       struct snd_pcm_substream *fe_substream =
+                fe->pcm->streams[cstream->direction].substream;
        struct snd_soc_platform *platform = fe->platform;
        struct snd_soc_dpcm *dpcm;
        struct snd_soc_dapm_widget_list *list;
@@ -414,7 +415,8 @@ static int soc_compr_set_params_fe(struct snd_compr_stream 
*cstream,
                                        struct snd_compr_params *params)
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
-       struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream;
+       struct snd_pcm_substream *fe_substream =
+                fe->pcm->streams[cstream->direction].substream;
        struct snd_soc_platform *platform = fe->platform;
        int ret = 0, stream;
 
diff --git a/tools/perf/ui/browser.c b/tools/perf/ui/browser.c
index 3eb3edb307a4..a1309010d109 100644
--- a/tools/perf/ui/browser.c
+++ b/tools/perf/ui/browser.c
@@ -702,7 +702,7 @@ static void __ui_browser__line_arrow_down(struct ui_browser 
*browser,
                ui_browser__gotorc(browser, row, column + 1);
                SLsmg_draw_hline(2);
 
-               if (row++ == 0)
+               if (++row == 0)
                        goto out;
        } else
                row = 0;
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 04387ab31316..7e27207d0f45 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -64,6 +64,25 @@ enum intel_pt_pkt_state {
        INTEL_PT_STATE_FUP_NO_TIP,
 };
 
+static inline bool intel_pt_sample_time(enum intel_pt_pkt_state pkt_state)
+{
+       switch (pkt_state) {
+       case INTEL_PT_STATE_NO_PSB:
+       case INTEL_PT_STATE_NO_IP:
+       case INTEL_PT_STATE_ERR_RESYNC:
+       case INTEL_PT_STATE_IN_SYNC:
+       case INTEL_PT_STATE_TNT:
+               return true;
+       case INTEL_PT_STATE_TIP:
+       case INTEL_PT_STATE_TIP_PGD:
+       case INTEL_PT_STATE_FUP:
+       case INTEL_PT_STATE_FUP_NO_TIP:
+               return false;
+       default:
+               return true;
+       };
+}
+
 #ifdef INTEL_PT_STRICT
 #define INTEL_PT_STATE_ERR1    INTEL_PT_STATE_NO_PSB
 #define INTEL_PT_STATE_ERR2    INTEL_PT_STATE_NO_PSB
@@ -92,6 +111,7 @@ struct intel_pt_decoder {
        bool have_tma;
        bool have_cyc;
        bool fixup_last_mtc;
+       bool have_last_ip;
        uint64_t pos;
        uint64_t last_ip;
        uint64_t ip;
@@ -99,6 +119,7 @@ struct intel_pt_decoder {
        uint64_t timestamp;
        uint64_t tsc_timestamp;
        uint64_t ref_timestamp;
+       uint64_t sample_timestamp;
        uint64_t ret_addr;
        uint64_t ctc_timestamp;
        uint64_t ctc_delta;
@@ -139,6 +160,7 @@ struct intel_pt_decoder {
        unsigned int fup_tx_flags;
        unsigned int tx_flags;
        uint64_t timestamp_insn_cnt;
+       uint64_t sample_insn_cnt;
        uint64_t stuck_ip;
        int no_progress;
        int stuck_ip_prd;
@@ -398,6 +420,7 @@ static uint64_t intel_pt_calc_ip(const struct intel_pt_pkt 
*packet,
 static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder)
 {
        decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip);
+       decoder->have_last_ip = true;
 }
 
 static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder)
@@ -898,6 +921,7 @@ static int intel_pt_walk_insn(struct intel_pt_decoder 
*decoder,
 
        decoder->tot_insn_cnt += insn_cnt;
        decoder->timestamp_insn_cnt += insn_cnt;
+       decoder->sample_insn_cnt += insn_cnt;
        decoder->period_insn_cnt += insn_cnt;
 
        if (err) {
@@ -1444,7 +1468,8 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder 
*decoder)
 
                case INTEL_PT_FUP:
                        decoder->pge = true;
-                       intel_pt_set_last_ip(decoder);
+                       if (decoder->packet.count)
+                               intel_pt_set_last_ip(decoder);
                        break;
 
                case INTEL_PT_MODE_TSX:
@@ -1648,6 +1673,8 @@ static int intel_pt_walk_trace(struct intel_pt_decoder 
*decoder)
                        break;
 
                case INTEL_PT_PSB:
+                       decoder->last_ip = 0;
+                       decoder->have_last_ip = true;
                        intel_pt_clear_stack(&decoder->stack);
                        err = intel_pt_walk_psbend(decoder);
                        if (err == -EAGAIN)
@@ -1728,8 +1755,9 @@ static int intel_pt_walk_trace(struct intel_pt_decoder 
*decoder)
 
 static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder)
 {
-       return decoder->last_ip || decoder->packet.count == 0 ||
-              decoder->packet.count == 3 || decoder->packet.count == 6;
+       return decoder->packet.count &&
+              (decoder->have_last_ip || decoder->packet.count == 3 ||
+               decoder->packet.count == 6);
 }
 
 /* Walk PSB+ packets to get in sync. */
@@ -1852,14 +1880,10 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder 
*decoder)
                        break;
 
                case INTEL_PT_FUP:
-                       if (decoder->overflow) {
-                               if (intel_pt_have_ip(decoder))
-                                       intel_pt_set_ip(decoder);
-                               if (decoder->ip)
-                                       return 0;
-                       }
-                       if (decoder->packet.count)
-                               intel_pt_set_last_ip(decoder);
+                       if (intel_pt_have_ip(decoder))
+                               intel_pt_set_ip(decoder);
+                       if (decoder->ip)
+                               return 0;
                        break;
 
                case INTEL_PT_MTC:
@@ -1908,6 +1932,9 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder 
*decoder)
                        break;
 
                case INTEL_PT_PSB:
+                       decoder->last_ip = 0;
+                       decoder->have_last_ip = true;
+                       intel_pt_clear_stack(&decoder->stack);
                        err = intel_pt_walk_psb(decoder);
                        if (err)
                                return err;
@@ -1933,6 +1960,8 @@ static int intel_pt_sync_ip(struct intel_pt_decoder 
*decoder)
 {
        int err;
 
+       decoder->set_fup_tx_flags = false;
+
        intel_pt_log("Scanning for full IP\n");
        err = intel_pt_walk_to_ip(decoder);
        if (err)
@@ -2041,6 +2070,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
 
        decoder->pge = false;
        decoder->continuous_period = false;
+       decoder->have_last_ip = false;
        decoder->last_ip = 0;
        decoder->ip = 0;
        intel_pt_clear_stack(&decoder->stack);
@@ -2049,6 +2079,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
        if (err)
                return err;
 
+       decoder->have_last_ip = true;
        decoder->pkt_state = INTEL_PT_STATE_NO_IP;
 
        err = intel_pt_walk_psb(decoder);
@@ -2067,7 +2098,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
 
 static uint64_t intel_pt_est_timestamp(struct intel_pt_decoder *decoder)
 {
-       uint64_t est = decoder->timestamp_insn_cnt << 1;
+       uint64_t est = decoder->sample_insn_cnt << 1;
 
        if (!decoder->cbr || !decoder->max_non_turbo_ratio)
                goto out;
@@ -2075,7 +2106,7 @@ static uint64_t intel_pt_est_timestamp(struct 
intel_pt_decoder *decoder)
        est *= decoder->max_non_turbo_ratio;
        est /= decoder->cbr;
 out:
-       return decoder->timestamp + est;
+       return decoder->sample_timestamp + est;
 }
 
 const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
@@ -2091,7 +2122,9 @@ const struct intel_pt_state *intel_pt_decode(struct 
intel_pt_decoder *decoder)
                        err = intel_pt_sync(decoder);
                        break;
                case INTEL_PT_STATE_NO_IP:
+                       decoder->have_last_ip = false;
                        decoder->last_ip = 0;
+                       decoder->ip = 0;
                        /* Fall through */
                case INTEL_PT_STATE_ERR_RESYNC:
                        err = intel_pt_sync_ip(decoder);
@@ -2128,15 +2161,24 @@ const struct intel_pt_state *intel_pt_decode(struct 
intel_pt_decoder *decoder)
                }
        } while (err == -ENOLINK);
 
-       decoder->state.err = err ? intel_pt_ext_err(err) : 0;
-       decoder->state.timestamp = decoder->timestamp;
+       if (err) {
+               decoder->state.err = intel_pt_ext_err(err);
+               decoder->state.from_ip = decoder->ip;
+               decoder->sample_timestamp = decoder->timestamp;
+               decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;
+       } else {
+               decoder->state.err = 0;
+               if (intel_pt_sample_time(decoder->pkt_state)) {
+                       decoder->sample_timestamp = decoder->timestamp;
+                       decoder->sample_insn_cnt = decoder->timestamp_insn_cnt;
+               }
+       }
+
+       decoder->state.timestamp = decoder->sample_timestamp;
        decoder->state.est_timestamp = intel_pt_est_timestamp(decoder);
        decoder->state.cr3 = decoder->cr3;
        decoder->state.tot_insn_cnt = decoder->tot_insn_cnt;
 
-       if (err)
-               decoder->state.from_ip = decoder->ip;
-
        return &decoder->state;
 }
 
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c
index 1dd087da6f31..111e09c3f4bf 100644
--- a/virt/kvm/vfio.c
+++ b/virt/kvm/vfio.c
@@ -47,6 +47,22 @@ static struct vfio_group 
*kvm_vfio_group_get_external_user(struct file *filep)
        return vfio_group;
 }
 
+static bool kvm_vfio_external_group_match_file(struct vfio_group *group,
+                                              struct file *filep)
+{
+       bool ret, (*fn)(struct vfio_group *, struct file *);
+
+       fn = symbol_get(vfio_external_group_match_file);
+       if (!fn)
+               return false;
+
+       ret = fn(group, filep);
+
+       symbol_put(vfio_external_group_match_file);
+
+       return ret;
+}
+
 static void kvm_vfio_group_put_external_user(struct vfio_group *vfio_group)
 {
        void (*fn)(struct vfio_group *);
@@ -171,18 +187,13 @@ static int kvm_vfio_set_group(struct kvm_device *dev, 
long attr, u64 arg)
                if (!f.file)
                        return -EBADF;
 
-               vfio_group = kvm_vfio_group_get_external_user(f.file);
-               fdput(f);
-
-               if (IS_ERR(vfio_group))
-                       return PTR_ERR(vfio_group);
-
                ret = -ENOENT;
 
                mutex_lock(&kv->lock);
 
                list_for_each_entry(kvg, &kv->group_list, node) {
-                       if (kvg->vfio_group != vfio_group)
+                       if (!kvm_vfio_external_group_match_file(kvg->vfio_group,
+                                                               f.file))
                                continue;
 
                        list_del(&kvg->node);
@@ -196,7 +207,7 @@ static int kvm_vfio_set_group(struct kvm_device *dev, long 
attr, u64 arg)
 
                mutex_unlock(&kv->lock);
 
-               kvm_vfio_group_put_external_user(vfio_group);
+               fdput(f);
 
                kvm_vfio_update_coherency(dev);
 

Reply via email to