summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '3.2.71/1063_linux-3.2.64.patch')
-rw-r--r--3.2.71/1063_linux-3.2.64.patch3821
1 files changed, 0 insertions, 3821 deletions
diff --git a/3.2.71/1063_linux-3.2.64.patch b/3.2.71/1063_linux-3.2.64.patch
deleted file mode 100644
index 862b4f0..0000000
--- a/3.2.71/1063_linux-3.2.64.patch
+++ /dev/null
@@ -1,3821 +0,0 @@
-diff --git a/Makefile b/Makefile
-index 6d3f2d4..2b58ffc 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 3
- PATCHLEVEL = 2
--SUBLEVEL = 63
-+SUBLEVEL = 64
- EXTRAVERSION =
- NAME = Saber-toothed Squirrel
-
-diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c
-index a125c4b..6e39bf1 100644
---- a/arch/arm/mm/alignment.c
-+++ b/arch/arm/mm/alignment.c
-@@ -38,6 +38,7 @@
- * This code is not portable to processors with late data abort handling.
- */
- #define CODING_BITS(i) (i & 0x0e000000)
-+#define COND_BITS(i) (i & 0xf0000000)
-
- #define LDST_I_BIT(i) (i & (1 << 26)) /* Immediate constant */
- #define LDST_P_BIT(i) (i & (1 << 24)) /* Preindex */
-@@ -812,6 +813,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
- break;
-
- case 0x04000000: /* ldr or str immediate */
-+ if (COND_BITS(instr) == 0xf0000000) /* NEON VLDn, VSTn */
-+ goto bad;
- offset.un = OFFSET_BITS(instr);
- handler = do_alignment_ldrstr;
- break;
-diff --git a/arch/mips/boot/compressed/decompress.c b/arch/mips/boot/compressed/decompress.c
-index 5cad0fa..ca51d69 100644
---- a/arch/mips/boot/compressed/decompress.c
-+++ b/arch/mips/boot/compressed/decompress.c
-@@ -13,6 +13,7 @@
-
- #include <linux/types.h>
- #include <linux/kernel.h>
-+#include <linux/string.h>
-
- #include <asm/addrspace.h>
-
-diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S
-index 4c968e7..55eca41 100644
---- a/arch/mips/kernel/mcount.S
-+++ b/arch/mips/kernel/mcount.S
-@@ -119,7 +119,11 @@ NESTED(_mcount, PT_SIZE, ra)
- nop
- #endif
- b ftrace_stub
-+#ifdef CONFIG_32BIT
-+ addiu sp, sp, 8
-+#else
- nop
-+#endif
-
- static_trace:
- MCOUNT_SAVE_REGS
-@@ -129,6 +133,9 @@ static_trace:
- move a1, AT /* arg2: parent's return address */
-
- MCOUNT_RESTORE_REGS
-+#ifdef CONFIG_32BIT
-+ addiu sp, sp, 8
-+#endif
- .globl ftrace_stub
- ftrace_stub:
- RETURN_BACK
-@@ -177,6 +184,11 @@ NESTED(ftrace_graph_caller, PT_SIZE, ra)
- jal prepare_ftrace_return
- nop
- MCOUNT_RESTORE_REGS
-+#ifndef CONFIG_DYNAMIC_FTRACE
-+#ifdef CONFIG_32BIT
-+ addiu sp, sp, 8
-+#endif
-+#endif
- RETURN_BACK
- END(ftrace_graph_caller)
-
-diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
-index fe425bb..228a205 100644
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -606,6 +606,7 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
- r4k_blast_scache();
- else
- blast_scache_range(addr, addr + size);
-+ preempt_enable();
- __sync();
- return;
- }
-@@ -647,6 +648,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
- */
- blast_inv_scache_range(addr, addr + size);
- }
-+ preempt_enable();
- __sync();
- return;
- }
-diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile
-index 55cca1d..75947e0 100644
---- a/arch/parisc/Makefile
-+++ b/arch/parisc/Makefile
-@@ -47,7 +47,12 @@ cflags-y := -pipe
-
- # These flags should be implied by an hppa-linux configuration, but they
- # are not in gcc 3.2.
--cflags-y += -mno-space-regs -mfast-indirect-calls
-+cflags-y += -mno-space-regs
-+
-+# -mfast-indirect-calls is only relevant for 32-bit kernels.
-+ifndef CONFIG_64BIT
-+cflags-y += -mfast-indirect-calls
-+endif
-
- # Currently we save and restore fpregs on all kernel entry/interruption paths.
- # If that gets optimized, we might need to disable the use of fpregs in the
-diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
-index dd072b1..f6f41dd 100644
---- a/arch/s390/kvm/kvm-s390.c
-+++ b/arch/s390/kvm/kvm-s390.c
-@@ -516,16 +516,6 @@ rerun_vcpu:
-
- BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL);
-
-- switch (kvm_run->exit_reason) {
-- case KVM_EXIT_S390_SIEIC:
-- case KVM_EXIT_UNKNOWN:
-- case KVM_EXIT_INTR:
-- case KVM_EXIT_S390_RESET:
-- break;
-- default:
-- BUG();
-- }
--
- vcpu->arch.sie_block->gpsw.mask = kvm_run->psw_mask;
- vcpu->arch.sie_block->gpsw.addr = kvm_run->psw_addr;
-
-diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
-index b3eb9a7..15d24cb 100644
---- a/arch/x86/include/asm/kvm_host.h
-+++ b/arch/x86/include/asm/kvm_host.h
-@@ -821,6 +821,20 @@ static inline void kvm_inject_gp(struct kvm_vcpu *vcpu, u32 error_code)
- kvm_queue_exception_e(vcpu, GP_VECTOR, error_code);
- }
-
-+static inline u64 get_canonical(u64 la)
-+{
-+ return ((int64_t)la << 16) >> 16;
-+}
-+
-+static inline bool is_noncanonical_address(u64 la)
-+{
-+#ifdef CONFIG_X86_64
-+ return get_canonical(la) != la;
-+#else
-+ return false;
-+#endif
-+}
-+
- #define TSS_IOPB_BASE_OFFSET 0x66
- #define TSS_BASE_SIZE 0x68
- #define TSS_IOPB_SIZE (65536 / 8)
-diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
-index 31f180c..36cbe2a 100644
---- a/arch/x86/include/asm/vmx.h
-+++ b/arch/x86/include/asm/vmx.h
-@@ -279,6 +279,8 @@ enum vmcs_field {
- #define EXIT_REASON_APIC_ACCESS 44
- #define EXIT_REASON_EPT_VIOLATION 48
- #define EXIT_REASON_EPT_MISCONFIG 49
-+#define EXIT_REASON_INVEPT 50
-+#define EXIT_REASON_INVVPID 53
- #define EXIT_REASON_WBINVD 54
- #define EXIT_REASON_XSETBV 55
-
-diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
-index 6e68bd9..bb28f2ca 100644
---- a/arch/x86/kernel/smpboot.c
-+++ b/arch/x86/kernel/smpboot.c
-@@ -1252,6 +1252,9 @@ static void remove_siblinginfo(int cpu)
-
- for_each_cpu(sibling, cpu_sibling_mask(cpu))
- cpumask_clear_cpu(cpu, cpu_sibling_mask(sibling));
-+ for_each_cpu(sibling, cpu_llc_shared_mask(cpu))
-+ cpumask_clear_cpu(cpu, cpu_llc_shared_mask(sibling));
-+ cpumask_clear(cpu_llc_shared_mask(cpu));
- cpumask_clear(cpu_sibling_mask(cpu));
- cpumask_clear(cpu_core_mask(cpu));
- c->phys_proc_id = 0;
-diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
-index 638cab5..f0ac042 100644
---- a/arch/x86/kvm/emulate.c
-+++ b/arch/x86/kvm/emulate.c
-@@ -456,11 +456,6 @@ register_address_increment(struct x86_emulate_ctxt *ctxt, unsigned long *reg, in
- *reg = (*reg & ~ad_mask(ctxt)) | ((*reg + inc) & ad_mask(ctxt));
- }
-
--static inline void jmp_rel(struct x86_emulate_ctxt *ctxt, int rel)
--{
-- register_address_increment(ctxt, &ctxt->_eip, rel);
--}
--
- static u32 desc_limit_scaled(struct desc_struct *desc)
- {
- u32 limit = get_desc_limit(desc);
-@@ -534,6 +529,40 @@ static int emulate_nm(struct x86_emulate_ctxt *ctxt)
- return emulate_exception(ctxt, NM_VECTOR, 0, false);
- }
-
-+static inline int assign_eip_far(struct x86_emulate_ctxt *ctxt, ulong dst,
-+ int cs_l)
-+{
-+ switch (ctxt->op_bytes) {
-+ case 2:
-+ ctxt->_eip = (u16)dst;
-+ break;
-+ case 4:
-+ ctxt->_eip = (u32)dst;
-+ break;
-+#ifdef CONFIG_X86_64
-+ case 8:
-+ if ((cs_l && is_noncanonical_address(dst)) ||
-+ (!cs_l && (dst >> 32) != 0))
-+ return emulate_gp(ctxt, 0);
-+ ctxt->_eip = dst;
-+ break;
-+#endif
-+ default:
-+ WARN(1, "unsupported eip assignment size\n");
-+ }
-+ return X86EMUL_CONTINUE;
-+}
-+
-+static inline int assign_eip_near(struct x86_emulate_ctxt *ctxt, ulong dst)
-+{
-+ return assign_eip_far(ctxt, dst, ctxt->mode == X86EMUL_MODE_PROT64);
-+}
-+
-+static inline int jmp_rel(struct x86_emulate_ctxt *ctxt, int rel)
-+{
-+ return assign_eip_near(ctxt, ctxt->_eip + rel);
-+}
-+
- static u16 get_segment_selector(struct x86_emulate_ctxt *ctxt, unsigned seg)
- {
- u16 selector;
-@@ -1206,11 +1235,12 @@ static int write_segment_descriptor(struct x86_emulate_ctxt *ctxt,
- }
-
- /* Does not support long mode */
--static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
-- u16 selector, int seg)
-+static int __load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
-+ u16 selector, int seg, u8 cpl,
-+ struct desc_struct *desc)
- {
- struct desc_struct seg_desc;
-- u8 dpl, rpl, cpl;
-+ u8 dpl, rpl;
- unsigned err_vec = GP_VECTOR;
- u32 err_code = 0;
- bool null_selector = !(selector & ~0x3); /* 0000-0003 are null */
-@@ -1259,7 +1289,6 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
-
- rpl = selector & 3;
- dpl = seg_desc.dpl;
-- cpl = ctxt->ops->cpl(ctxt);
-
- switch (seg) {
- case VCPU_SREG_SS:
-@@ -1316,12 +1345,21 @@ static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
- }
- load:
- ctxt->ops->set_segment(ctxt, selector, &seg_desc, 0, seg);
-+ if (desc)
-+ *desc = seg_desc;
- return X86EMUL_CONTINUE;
- exception:
- emulate_exception(ctxt, err_vec, err_code, true);
- return X86EMUL_PROPAGATE_FAULT;
- }
-
-+static int load_segment_descriptor(struct x86_emulate_ctxt *ctxt,
-+ u16 selector, int seg)
-+{
-+ u8 cpl = ctxt->ops->cpl(ctxt);
-+ return __load_segment_descriptor(ctxt, selector, seg, cpl, NULL);
-+}
-+
- static void write_register_operand(struct operand *op)
- {
- /* The 4-byte case *is* correct: in 64-bit mode we zero-extend. */
-@@ -1661,17 +1699,31 @@ static int em_iret(struct x86_emulate_ctxt *ctxt)
- static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
- {
- int rc;
-- unsigned short sel;
-+ unsigned short sel, old_sel;
-+ struct desc_struct old_desc, new_desc;
-+ const struct x86_emulate_ops *ops = ctxt->ops;
-+ u8 cpl = ctxt->ops->cpl(ctxt);
-+
-+ /* Assignment of RIP may only fail in 64-bit mode */
-+ if (ctxt->mode == X86EMUL_MODE_PROT64)
-+ ops->get_segment(ctxt, &old_sel, &old_desc, NULL,
-+ VCPU_SREG_CS);
-
- memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2);
-
-- rc = load_segment_descriptor(ctxt, sel, VCPU_SREG_CS);
-+ rc = __load_segment_descriptor(ctxt, sel, VCPU_SREG_CS, cpl,
-+ &new_desc);
- if (rc != X86EMUL_CONTINUE)
- return rc;
-
-- ctxt->_eip = 0;
-- memcpy(&ctxt->_eip, ctxt->src.valptr, ctxt->op_bytes);
-- return X86EMUL_CONTINUE;
-+ rc = assign_eip_far(ctxt, ctxt->src.val, new_desc.l);
-+ if (rc != X86EMUL_CONTINUE) {
-+ WARN_ON(ctxt->mode != X86EMUL_MODE_PROT64);
-+ /* assigning eip failed; restore the old cs */
-+ ops->set_segment(ctxt, old_sel, &old_desc, 0, VCPU_SREG_CS);
-+ return rc;
-+ }
-+ return rc;
- }
-
- static int em_grp1a(struct x86_emulate_ctxt *ctxt)
-@@ -1770,13 +1822,15 @@ static int em_grp45(struct x86_emulate_ctxt *ctxt)
- case 2: /* call near abs */ {
- long int old_eip;
- old_eip = ctxt->_eip;
-- ctxt->_eip = ctxt->src.val;
-+ rc = assign_eip_near(ctxt, ctxt->src.val);
-+ if (rc != X86EMUL_CONTINUE)
-+ break;
- ctxt->src.val = old_eip;
- rc = em_push(ctxt);
- break;
- }
- case 4: /* jmp abs */
-- ctxt->_eip = ctxt->src.val;
-+ rc = assign_eip_near(ctxt, ctxt->src.val);
- break;
- case 5: /* jmp far */
- rc = em_jmp_far(ctxt);
-@@ -1808,30 +1862,47 @@ static int em_grp9(struct x86_emulate_ctxt *ctxt)
-
- static int em_ret(struct x86_emulate_ctxt *ctxt)
- {
-- ctxt->dst.type = OP_REG;
-- ctxt->dst.addr.reg = &ctxt->_eip;
-- ctxt->dst.bytes = ctxt->op_bytes;
-- return em_pop(ctxt);
-+ int rc;
-+ unsigned long eip;
-+
-+ rc = emulate_pop(ctxt, &eip, ctxt->op_bytes);
-+ if (rc != X86EMUL_CONTINUE)
-+ return rc;
-+
-+ return assign_eip_near(ctxt, eip);
- }
-
- static int em_ret_far(struct x86_emulate_ctxt *ctxt)
- {
- int rc;
-- unsigned long cs;
-+ unsigned long eip, cs;
-+ u16 old_cs;
- int cpl = ctxt->ops->cpl(ctxt);
-+ struct desc_struct old_desc, new_desc;
-+ const struct x86_emulate_ops *ops = ctxt->ops;
-
-- rc = emulate_pop(ctxt, &ctxt->_eip, ctxt->op_bytes);
-+ if (ctxt->mode == X86EMUL_MODE_PROT64)
-+ ops->get_segment(ctxt, &old_cs, &old_desc, NULL,
-+ VCPU_SREG_CS);
-+
-+ rc = emulate_pop(ctxt, &eip, ctxt->op_bytes);
- if (rc != X86EMUL_CONTINUE)
- return rc;
-- if (ctxt->op_bytes == 4)
-- ctxt->_eip = (u32)ctxt->_eip;
- rc = emulate_pop(ctxt, &cs, ctxt->op_bytes);
- if (rc != X86EMUL_CONTINUE)
- return rc;
- /* Outer-privilege level return is not implemented */
- if (ctxt->mode >= X86EMUL_MODE_PROT16 && (cs & 3) > cpl)
- return X86EMUL_UNHANDLEABLE;
-- rc = load_segment_descriptor(ctxt, (u16)cs, VCPU_SREG_CS);
-+ rc = __load_segment_descriptor(ctxt, (u16)cs, VCPU_SREG_CS, 0,
-+ &new_desc);
-+ if (rc != X86EMUL_CONTINUE)
-+ return rc;
-+ rc = assign_eip_far(ctxt, eip, new_desc.l);
-+ if (rc != X86EMUL_CONTINUE) {
-+ WARN_ON(ctxt->mode != X86EMUL_MODE_PROT64);
-+ ops->set_segment(ctxt, old_cs, &old_desc, 0, VCPU_SREG_CS);
-+ }
- return rc;
- }
-
-@@ -2043,7 +2114,7 @@ static int em_sysexit(struct x86_emulate_ctxt *ctxt)
- {
- struct x86_emulate_ops *ops = ctxt->ops;
- struct desc_struct cs, ss;
-- u64 msr_data;
-+ u64 msr_data, rcx, rdx;
- int usermode;
- u16 cs_sel = 0, ss_sel = 0;
-
-@@ -2059,6 +2130,9 @@ static int em_sysexit(struct x86_emulate_ctxt *ctxt)
- else
- usermode = X86EMUL_MODE_PROT32;
-
-+ rcx = ctxt->regs[VCPU_REGS_RCX];
-+ rdx = ctxt->regs[VCPU_REGS_RDX];
-+
- cs.dpl = 3;
- ss.dpl = 3;
- ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data);
-@@ -2076,6 +2150,9 @@ static int em_sysexit(struct x86_emulate_ctxt *ctxt)
- ss_sel = cs_sel + 8;
- cs.d = 0;
- cs.l = 1;
-+ if (is_noncanonical_address(rcx) ||
-+ is_noncanonical_address(rdx))
-+ return emulate_gp(ctxt, 0);
- break;
- }
- cs_sel |= SELECTOR_RPL_MASK;
-@@ -2084,8 +2161,8 @@ static int em_sysexit(struct x86_emulate_ctxt *ctxt)
- ops->set_segment(ctxt, cs_sel, &cs, 0, VCPU_SREG_CS);
- ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS);
-
-- ctxt->_eip = ctxt->regs[VCPU_REGS_RDX];
-- ctxt->regs[VCPU_REGS_RSP] = ctxt->regs[VCPU_REGS_RCX];
-+ ctxt->_eip = rdx;
-+ ctxt->regs[VCPU_REGS_RSP] = rcx;
-
- return X86EMUL_CONTINUE;
- }
-@@ -2174,6 +2251,7 @@ static int load_state_from_tss16(struct x86_emulate_ctxt *ctxt,
- struct tss_segment_16 *tss)
- {
- int ret;
-+ u8 cpl;
-
- ctxt->_eip = tss->ip;
- ctxt->eflags = tss->flag | 2;
-@@ -2196,23 +2274,30 @@ static int load_state_from_tss16(struct x86_emulate_ctxt *ctxt,
- set_segment_selector(ctxt, tss->ss, VCPU_SREG_SS);
- set_segment_selector(ctxt, tss->ds, VCPU_SREG_DS);
-
-+ cpl = tss->cs & 3;
-+
- /*
- * Now load segment descriptors. If fault happenes at this stage
- * it is handled in a context of new task
- */
-- ret = load_segment_descriptor(ctxt, tss->ldt, VCPU_SREG_LDTR);
-+ ret = __load_segment_descriptor(ctxt, tss->ldt, VCPU_SREG_LDTR, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->es, VCPU_SREG_ES);
-+ ret = __load_segment_descriptor(ctxt, tss->es, VCPU_SREG_ES, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->cs, VCPU_SREG_CS);
-+ ret = __load_segment_descriptor(ctxt, tss->cs, VCPU_SREG_CS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->ss, VCPU_SREG_SS);
-+ ret = __load_segment_descriptor(ctxt, tss->ss, VCPU_SREG_SS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->ds, VCPU_SREG_DS);
-+ ret = __load_segment_descriptor(ctxt, tss->ds, VCPU_SREG_DS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-
-@@ -2291,6 +2376,7 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt,
- struct tss_segment_32 *tss)
- {
- int ret;
-+ u8 cpl;
-
- if (ctxt->ops->set_cr(ctxt, 3, tss->cr3))
- return emulate_gp(ctxt, 0);
-@@ -2307,7 +2393,8 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt,
-
- /*
- * SDM says that segment selectors are loaded before segment
-- * descriptors
-+ * descriptors. This is important because CPL checks will
-+ * use CS.RPL.
- */
- set_segment_selector(ctxt, tss->ldt_selector, VCPU_SREG_LDTR);
- set_segment_selector(ctxt, tss->es, VCPU_SREG_ES);
-@@ -2317,29 +2404,38 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt,
- set_segment_selector(ctxt, tss->fs, VCPU_SREG_FS);
- set_segment_selector(ctxt, tss->gs, VCPU_SREG_GS);
-
-+ cpl = tss->cs & 3;
-+
- /*
- * Now load segment descriptors. If fault happenes at this stage
- * it is handled in a context of new task
- */
-- ret = load_segment_descriptor(ctxt, tss->ldt_selector, VCPU_SREG_LDTR);
-+ ret = __load_segment_descriptor(ctxt, tss->ldt_selector, VCPU_SREG_LDTR,
-+ cpl, NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->es, VCPU_SREG_ES);
-+ ret = __load_segment_descriptor(ctxt, tss->es, VCPU_SREG_ES, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->cs, VCPU_SREG_CS);
-+ ret = __load_segment_descriptor(ctxt, tss->cs, VCPU_SREG_CS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->ss, VCPU_SREG_SS);
-+ ret = __load_segment_descriptor(ctxt, tss->ss, VCPU_SREG_SS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->ds, VCPU_SREG_DS);
-+ ret = __load_segment_descriptor(ctxt, tss->ds, VCPU_SREG_DS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->fs, VCPU_SREG_FS);
-+ ret = __load_segment_descriptor(ctxt, tss->fs, VCPU_SREG_FS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-- ret = load_segment_descriptor(ctxt, tss->gs, VCPU_SREG_GS);
-+ ret = __load_segment_descriptor(ctxt, tss->gs, VCPU_SREG_GS, cpl,
-+ NULL);
- if (ret != X86EMUL_CONTINUE)
- return ret;
-
-@@ -2536,39 +2632,67 @@ static int em_das(struct x86_emulate_ctxt *ctxt)
- return X86EMUL_CONTINUE;
- }
-
-+static int em_call(struct x86_emulate_ctxt *ctxt)
-+{
-+ int rc;
-+ long rel = ctxt->src.val;
-+
-+ ctxt->src.val = (unsigned long)ctxt->_eip;
-+ rc = jmp_rel(ctxt, rel);
-+ if (rc != X86EMUL_CONTINUE)
-+ return rc;
-+ return em_push(ctxt);
-+}
-+
- static int em_call_far(struct x86_emulate_ctxt *ctxt)
- {
- u16 sel, old_cs;
- ulong old_eip;
- int rc;
-+ struct desc_struct old_desc, new_desc;
-+ const struct x86_emulate_ops *ops = ctxt->ops;
-+ int cpl = ctxt->ops->cpl(ctxt);
-
-- old_cs = get_segment_selector(ctxt, VCPU_SREG_CS);
- old_eip = ctxt->_eip;
-+ ops->get_segment(ctxt, &old_cs, &old_desc, NULL, VCPU_SREG_CS);
-
- memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2);
-- if (load_segment_descriptor(ctxt, sel, VCPU_SREG_CS))
-+ rc = __load_segment_descriptor(ctxt, sel, VCPU_SREG_CS, cpl,
-+ &new_desc);
-+ if (rc != X86EMUL_CONTINUE)
- return X86EMUL_CONTINUE;
-
-- ctxt->_eip = 0;
-- memcpy(&ctxt->_eip, ctxt->src.valptr, ctxt->op_bytes);
-+ rc = assign_eip_far(ctxt, ctxt->src.val, new_desc.l);
-+ if (rc != X86EMUL_CONTINUE)
-+ goto fail;
-
- ctxt->src.val = old_cs;
- rc = em_push(ctxt);
- if (rc != X86EMUL_CONTINUE)
-- return rc;
-+ goto fail;
-
- ctxt->src.val = old_eip;
-- return em_push(ctxt);
-+ rc = em_push(ctxt);
-+ /* If we failed, we tainted the memory, but the very least we should
-+ restore cs */
-+ if (rc != X86EMUL_CONTINUE)
-+ goto fail;
-+ return rc;
-+fail:
-+ ops->set_segment(ctxt, old_cs, &old_desc, 0, VCPU_SREG_CS);
-+ return rc;
-+
- }
-
- static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt)
- {
- int rc;
-+ unsigned long eip;
-
-- ctxt->dst.type = OP_REG;
-- ctxt->dst.addr.reg = &ctxt->_eip;
-- ctxt->dst.bytes = ctxt->op_bytes;
-- rc = emulate_pop(ctxt, &ctxt->dst.val, ctxt->op_bytes);
-+ rc = emulate_pop(ctxt, &eip, ctxt->op_bytes);
-+ if (rc != X86EMUL_CONTINUE)
-+ return rc;
-+ rc = assign_eip_near(ctxt, eip);
- if (rc != X86EMUL_CONTINUE)
- return rc;
- register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], ctxt->src.val);
-@@ -2814,20 +2938,24 @@ static int em_lmsw(struct x86_emulate_ctxt *ctxt)
-
- static int em_loop(struct x86_emulate_ctxt *ctxt)
- {
-+ int rc = X86EMUL_CONTINUE;
-+
- register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RCX], -1);
- if ((address_mask(ctxt, ctxt->regs[VCPU_REGS_RCX]) != 0) &&
- (ctxt->b == 0xe2 || test_cc(ctxt->b ^ 0x5, ctxt->eflags)))
-- jmp_rel(ctxt, ctxt->src.val);
-+ rc = jmp_rel(ctxt, ctxt->src.val);
-
-- return X86EMUL_CONTINUE;
-+ return rc;
- }
-
- static int em_jcxz(struct x86_emulate_ctxt *ctxt)
- {
-+ int rc = X86EMUL_CONTINUE;
-+
- if (address_mask(ctxt, ctxt->regs[VCPU_REGS_RCX]) == 0)
-- jmp_rel(ctxt, ctxt->src.val);
-+ rc = jmp_rel(ctxt, ctxt->src.val);
-
-- return X86EMUL_CONTINUE;
-+ return rc;
- }
-
- static int em_cli(struct x86_emulate_ctxt *ctxt)
-@@ -3271,7 +3399,7 @@ static struct opcode opcode_table[256] = {
- D2bvIP(SrcImmUByte | DstAcc, in, check_perm_in),
- D2bvIP(SrcAcc | DstImmUByte, out, check_perm_out),
- /* 0xE8 - 0xEF */
-- D(SrcImm | Stack), D(SrcImm | ImplicitOps),
-+ I(SrcImm | Stack, em_call), D(SrcImm | ImplicitOps),
- I(SrcImmFAddr | No64, em_jmp_far), D(SrcImmByte | ImplicitOps),
- D2bvIP(SrcDX | DstAcc, in, check_perm_in),
- D2bvIP(SrcAcc | DstDX, out, check_perm_out),
-@@ -3920,7 +4048,7 @@ special_insn:
- break;
- case 0x70 ... 0x7f: /* jcc (short) */
- if (test_cc(ctxt->b, ctxt->eflags))
-- jmp_rel(ctxt, ctxt->src.val);
-+ rc = jmp_rel(ctxt, ctxt->src.val);
- break;
- case 0x8d: /* lea r16/r32, m */
- ctxt->dst.val = ctxt->src.addr.mem.ea;
-@@ -3966,16 +4094,9 @@ special_insn:
- case 0xe6: /* outb */
- case 0xe7: /* out */
- goto do_io_out;
-- case 0xe8: /* call (near) */ {
-- long int rel = ctxt->src.val;
-- ctxt->src.val = (unsigned long) ctxt->_eip;
-- jmp_rel(ctxt, rel);
-- rc = em_push(ctxt);
-- break;
-- }
- case 0xe9: /* jmp rel */
- case 0xeb: /* jmp rel short */
-- jmp_rel(ctxt, ctxt->src.val);
-+ rc = jmp_rel(ctxt, ctxt->src.val);
- ctxt->dst.type = OP_NONE; /* Disable writeback. */
- break;
- case 0xec: /* in al,dx */
-@@ -4141,7 +4262,7 @@ twobyte_insn:
- break;
- case 0x80 ... 0x8f: /* jnz rel, etc*/
- if (test_cc(ctxt->b, ctxt->eflags))
-- jmp_rel(ctxt, ctxt->src.val);
-+ rc = jmp_rel(ctxt, ctxt->src.val);
- break;
- case 0x90 ... 0x9f: /* setcc r/m8 */
- ctxt->dst.val = test_cc(ctxt->b, ctxt->eflags);
-diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
-index 139415e..cced57f 100644
---- a/arch/x86/kvm/i8254.c
-+++ b/arch/x86/kvm/i8254.c
-@@ -264,8 +264,10 @@ void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu)
- return;
-
- timer = &pit->pit_state.pit_timer.timer;
-+ mutex_lock(&pit->pit_state.lock);
- if (hrtimer_cancel(timer))
- hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
-+ mutex_unlock(&pit->pit_state.lock);
- }
-
- static void destroy_pit_timer(struct kvm_pit *pit)
-diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
-index 2102a17..82f97a5 100644
---- a/arch/x86/kvm/svm.c
-+++ b/arch/x86/kvm/svm.c
-@@ -3109,7 +3109,7 @@ static int wrmsr_interception(struct vcpu_svm *svm)
-
-
- svm->next_rip = kvm_rip_read(&svm->vcpu) + 2;
-- if (svm_set_msr(&svm->vcpu, ecx, data)) {
-+ if (kvm_set_msr(&svm->vcpu, ecx, data)) {
- trace_kvm_msr_write_ex(ecx, data);
- kvm_inject_gp(&svm->vcpu, 0);
- } else {
-diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
-index a4f6bda..578b1c6 100644
---- a/arch/x86/kvm/vmx.c
-+++ b/arch/x86/kvm/vmx.c
-@@ -390,6 +390,7 @@ struct vcpu_vmx {
- u16 fs_sel, gs_sel, ldt_sel;
- int gs_ldt_reload_needed;
- int fs_reload_needed;
-+ unsigned long vmcs_host_cr4; /* May not match real cr4 */
- } host_state;
- struct {
- int vm86_active;
-@@ -3629,16 +3630,21 @@ static void vmx_disable_intercept_for_msr(u32 msr, bool longmode_only)
- * Note that host-state that does change is set elsewhere. E.g., host-state
- * that is set differently for each CPU is set in vmx_vcpu_load(), not here.
- */
--static void vmx_set_constant_host_state(void)
-+static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
- {
- u32 low32, high32;
- unsigned long tmpl;
- struct desc_ptr dt;
-+ unsigned long cr4;
-
- vmcs_writel(HOST_CR0, read_cr0() | X86_CR0_TS); /* 22.2.3 */
-- vmcs_writel(HOST_CR4, read_cr4()); /* 22.2.3, 22.2.5 */
- vmcs_writel(HOST_CR3, read_cr3()); /* 22.2.3 FIXME: shadow tables */
-
-+ /* Save the most likely value for this task's CR4 in the VMCS. */
-+ cr4 = read_cr4();
-+ vmcs_writel(HOST_CR4, cr4); /* 22.2.3, 22.2.5 */
-+ vmx->host_state.vmcs_host_cr4 = cr4;
-+
- vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */
- vmcs_write16(HOST_DS_SELECTOR, __KERNEL_DS); /* 22.2.4 */
- vmcs_write16(HOST_ES_SELECTOR, __KERNEL_DS); /* 22.2.4 */
-@@ -3760,7 +3766,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
-
- vmcs_write16(HOST_FS_SELECTOR, 0); /* 22.2.4 */
- vmcs_write16(HOST_GS_SELECTOR, 0); /* 22.2.4 */
-- vmx_set_constant_host_state();
-+ vmx_set_constant_host_state(vmx);
- #ifdef CONFIG_X86_64
- rdmsrl(MSR_FS_BASE, a);
- vmcs_writel(HOST_FS_BASE, a); /* 22.2.4 */
-@@ -4544,7 +4550,7 @@ static int handle_wrmsr(struct kvm_vcpu *vcpu)
- u64 data = (vcpu->arch.regs[VCPU_REGS_RAX] & -1u)
- | ((u64)(vcpu->arch.regs[VCPU_REGS_RDX] & -1u) << 32);
-
-- if (vmx_set_msr(vcpu, ecx, data) != 0) {
-+ if (kvm_set_msr(vcpu, ecx, data) != 0) {
- trace_kvm_msr_write_ex(ecx, data);
- kvm_inject_gp(vcpu, 0);
- return 1;
-@@ -5550,6 +5556,18 @@ static int handle_vmptrst(struct kvm_vcpu *vcpu)
- return 1;
- }
-
-+static int handle_invept(struct kvm_vcpu *vcpu)
-+{
-+ kvm_queue_exception(vcpu, UD_VECTOR);
-+ return 1;
-+}
-+
-+static int handle_invvpid(struct kvm_vcpu *vcpu)
-+{
-+ kvm_queue_exception(vcpu, UD_VECTOR);
-+ return 1;
-+}
-+
- /*
- * The exit handlers return 1 if the exit was handled fully and guest execution
- * may resume. Otherwise they set the kvm_run parameter to indicate what needs
-@@ -5591,6 +5609,8 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = {
- [EXIT_REASON_PAUSE_INSTRUCTION] = handle_pause,
- [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op,
- [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op,
-+ [EXIT_REASON_INVEPT] = handle_invept,
-+ [EXIT_REASON_INVVPID] = handle_invvpid,
- };
-
- static const int kvm_vmx_max_exit_handlers =
-@@ -5775,6 +5795,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
- case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD:
- case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE:
- case EXIT_REASON_VMOFF: case EXIT_REASON_VMON:
-+ case EXIT_REASON_INVEPT: case EXIT_REASON_INVVPID:
- /*
- * VMX instructions trap unconditionally. This allows L1 to
- * emulate them for its L2 guest, i.e., allows 3-level nesting!
-@@ -6093,6 +6114,7 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx)
- static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
- {
- struct vcpu_vmx *vmx = to_vmx(vcpu);
-+ unsigned long cr4;
-
- if (is_guest_mode(vcpu) && !vmx->nested.nested_run_pending) {
- struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
-@@ -6123,6 +6145,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
- if (test_bit(VCPU_REGS_RIP, (unsigned long *)&vcpu->arch.regs_dirty))
- vmcs_writel(GUEST_RIP, vcpu->arch.regs[VCPU_REGS_RIP]);
-
-+ cr4 = read_cr4();
-+ if (unlikely(cr4 != vmx->host_state.vmcs_host_cr4)) {
-+ vmcs_writel(HOST_CR4, cr4);
-+ vmx->host_state.vmcs_host_cr4 = cr4;
-+ }
-+
- /* When single-stepping over STI and MOV SS, we must clear the
- * corresponding interruptibility bits in the guest state. Otherwise
- * vmentry fails as it then expects bit 14 (BS) in pending debug
-@@ -6581,7 +6609,7 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
- * Other fields are different per CPU, and will be set later when
- * vmx_vcpu_load() is called, and when vmx_save_host_state() is called.
- */
-- vmx_set_constant_host_state();
-+ vmx_set_constant_host_state(vmx);
-
- /*
- * HOST_RSP is normally set correctly in vmx_vcpu_run() just before
-diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
-index b9fefaf..2d7d0df 100644
---- a/arch/x86/kvm/x86.c
-+++ b/arch/x86/kvm/x86.c
-@@ -893,7 +893,6 @@ void kvm_enable_efer_bits(u64 mask)
- }
- EXPORT_SYMBOL_GPL(kvm_enable_efer_bits);
-
--
- /*
- * Writes msr value into into the appropriate "register".
- * Returns 0 on success, non-0 otherwise.
-@@ -901,8 +900,34 @@ EXPORT_SYMBOL_GPL(kvm_enable_efer_bits);
- */
- int kvm_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
- {
-+ switch (msr_index) {
-+ case MSR_FS_BASE:
-+ case MSR_GS_BASE:
-+ case MSR_KERNEL_GS_BASE:
-+ case MSR_CSTAR:
-+ case MSR_LSTAR:
-+ if (is_noncanonical_address(data))
-+ return 1;
-+ break;
-+ case MSR_IA32_SYSENTER_EIP:
-+ case MSR_IA32_SYSENTER_ESP:
-+ /*
-+ * IA32_SYSENTER_ESP and IA32_SYSENTER_EIP cause #GP if
-+ * non-canonical address is written on Intel but not on
-+ * AMD (which ignores the top 32-bits, because it does
-+ * not implement 64-bit SYSENTER).
-+ *
-+ * 64-bit code should hence be able to write a non-canonical
-+ * value on AMD. Making the address canonical ensures that
-+ * vmentry does not fail on Intel after writing a non-canonical
-+ * value, and that something deterministic happens if the guest
-+ * invokes 64-bit SYSENTER.
-+ */
-+ data = get_canonical(data);
-+ }
- return kvm_x86_ops->set_msr(vcpu, msr_index, data);
- }
-+EXPORT_SYMBOL_GPL(kvm_set_msr);
-
- /*
- * Adapt set_msr() to msr_io()'s calling convention
-diff --git a/block/genhd.c b/block/genhd.c
-index 8bd4ef2..41b0435 100644
---- a/block/genhd.c
-+++ b/block/genhd.c
-@@ -28,10 +28,10 @@ struct kobject *block_depr;
- /* for extended dynamic devt allocation, currently only one major is used */
- #define NR_EXT_DEVT (1 << MINORBITS)
-
--/* For extended devt allocation. ext_devt_mutex prevents look up
-+/* For extended devt allocation. ext_devt_lock prevents look up
- * results from going away underneath its user.
- */
--static DEFINE_MUTEX(ext_devt_mutex);
-+static DEFINE_SPINLOCK(ext_devt_lock);
- static DEFINE_IDR(ext_devt_idr);
-
- static struct device_type disk_type;
-@@ -421,13 +421,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
- do {
- if (!idr_pre_get(&ext_devt_idr, GFP_KERNEL))
- return -ENOMEM;
-- mutex_lock(&ext_devt_mutex);
-+ spin_lock(&ext_devt_lock);
- rc = idr_get_new(&ext_devt_idr, part, &idx);
- if (!rc && idx >= NR_EXT_DEVT) {
- idr_remove(&ext_devt_idr, idx);
- rc = -EBUSY;
- }
-- mutex_unlock(&ext_devt_mutex);
-+ spin_unlock(&ext_devt_lock);
- } while (rc == -EAGAIN);
-
- if (rc)
-@@ -448,15 +448,13 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
- */
- void blk_free_devt(dev_t devt)
- {
-- might_sleep();
--
- if (devt == MKDEV(0, 0))
- return;
-
- if (MAJOR(devt) == BLOCK_EXT_MAJOR) {
-- mutex_lock(&ext_devt_mutex);
-+ spin_lock(&ext_devt_lock);
- idr_remove(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
-- mutex_unlock(&ext_devt_mutex);
-+ spin_unlock(&ext_devt_lock);
- }
- }
-
-@@ -663,7 +661,6 @@ void del_gendisk(struct gendisk *disk)
- if (!sysfs_deprecated)
- sysfs_remove_link(block_depr, dev_name(disk_to_dev(disk)));
- device_del(disk_to_dev(disk));
-- blk_free_devt(disk_to_dev(disk)->devt);
- }
- EXPORT_SYMBOL(del_gendisk);
-
-@@ -688,13 +685,13 @@ struct gendisk *get_gendisk(dev_t devt, int *partno)
- } else {
- struct hd_struct *part;
-
-- mutex_lock(&ext_devt_mutex);
-+ spin_lock(&ext_devt_lock);
- part = idr_find(&ext_devt_idr, blk_mangle_minor(MINOR(devt)));
- if (part && get_disk(part_to_disk(part))) {
- *partno = part->partno;
- disk = part_to_disk(part);
- }
-- mutex_unlock(&ext_devt_mutex);
-+ spin_unlock(&ext_devt_lock);
- }
-
- return disk;
-@@ -1102,6 +1099,7 @@ static void disk_release(struct device *dev)
- {
- struct gendisk *disk = dev_to_disk(dev);
-
-+ blk_free_devt(dev->devt);
- disk_release_events(disk);
- kfree(disk->random);
- disk_replace_part_tbl(disk, NULL);
-diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
-index de0791c..388ba10 100644
---- a/drivers/acpi/processor_idle.c
-+++ b/drivers/acpi/processor_idle.c
-@@ -1165,9 +1165,9 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
- if (smp_processor_id() == 0 &&
- cpuidle_get_driver() == &acpi_idle_driver) {
-
-- cpuidle_pause_and_lock();
- /* Protect against cpu-hotplug */
- get_online_cpus();
-+ cpuidle_pause_and_lock();
-
- /* Disable all cpuidle devices */
- for_each_online_cpu(cpu) {
-@@ -1192,8 +1192,8 @@ int acpi_processor_cst_has_changed(struct acpi_processor *pr)
- cpuidle_enable_device(&_pr->power.dev);
- }
- }
-- put_online_cpus();
- cpuidle_resume_and_unlock();
-+ put_online_cpus();
- }
-
- return 0;
-diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
-index 43b0acf..4007f62 100644
---- a/drivers/ata/ahci.c
-+++ b/drivers/ata/ahci.c
-@@ -315,6 +315,14 @@ static const struct pci_device_id ahci_pci_tbl[] = {
- { PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */
- { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */
-+ { PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */
-+ { PCI_VDEVICE(INTEL, 0x8c83), board_ahci }, /* 9 Series AHCI */
-+ { PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */
-+ { PCI_VDEVICE(INTEL, 0x8c85), board_ahci }, /* 9 Series RAID */
-+ { PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */
-+ { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
-+ { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
-+ { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
-
- /* JMicron 360/1/3/5/6, match class to avoid IDE function */
- { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
-@@ -449,6 +457,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
- .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
-+ .driver_data = board_ahci_yes_fbs }, /* 88se9182 */
-+ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9182),
- .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
- .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */
-diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
-index 5b0b5f7..b1e8e11 100644
---- a/drivers/ata/ata_piix.c
-+++ b/drivers/ata/ata_piix.c
-@@ -362,6 +362,14 @@ static const struct pci_device_id piix_pci_tbl[] = {
- { 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
- /* SATA Controller IDE (Coleto Creek) */
- { 0x8086, 0x23a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
-+ /* SATA Controller IDE (9 Series) */
-+ { 0x8086, 0x8c88, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
-+ /* SATA Controller IDE (9 Series) */
-+ { 0x8086, 0x8c89, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
-+ /* SATA Controller IDE (9 Series) */
-+ { 0x8086, 0x8c80, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
-+ /* SATA Controller IDE (9 Series) */
-+ { 0x8086, 0x8c81, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
-
- { } /* terminate list */
- };
-diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
-index bf441db..ea78bc46 100644
---- a/drivers/base/regmap/regmap.c
-+++ b/drivers/base/regmap/regmap.c
-@@ -36,6 +36,9 @@ bool regmap_readable(struct regmap *map, unsigned int reg)
- if (map->max_register && reg > map->max_register)
- return false;
-
-+ if (map->format.format_write)
-+ return false;
-+
- if (map->readable_reg)
- return map->readable_reg(map->dev, reg);
-
-@@ -44,7 +47,7 @@ bool regmap_readable(struct regmap *map, unsigned int reg)
-
- bool regmap_volatile(struct regmap *map, unsigned int reg)
- {
-- if (map->max_register && reg > map->max_register)
-+ if (!map->format.format_write && !regmap_readable(map, reg))
- return false;
-
- if (map->volatile_reg)
-@@ -55,7 +58,7 @@ bool regmap_volatile(struct regmap *map, unsigned int reg)
-
- bool regmap_precious(struct regmap *map, unsigned int reg)
- {
-- if (map->max_register && reg > map->max_register)
-+ if (!regmap_readable(map, reg))
- return false;
-
- if (map->precious_reg)
-diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
-index 0016fee..96d5cfc 100644
---- a/drivers/gpu/drm/i915/intel_bios.c
-+++ b/drivers/gpu/drm/i915/intel_bios.c
-@@ -651,7 +651,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
- DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq);
- }
-
--static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
-+static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
- {
- DRM_DEBUG_KMS("Falling back to manually reading VBT from "
- "VBIOS ROM for %s\n",
-diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
-index 74d312f..fadd021 100644
---- a/drivers/gpu/drm/i915/intel_lvds.c
-+++ b/drivers/gpu/drm/i915/intel_lvds.c
-@@ -613,7 +613,7 @@ static const struct drm_encoder_funcs intel_lvds_enc_funcs = {
- .destroy = intel_encoder_destroy,
- };
-
--static int __init intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
-+static int intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
- {
- DRM_DEBUG_KMS("Skipping LVDS initialization for %s\n", id->ident);
- return 1;
-diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
-index 6d9c32b..24e9756 100644
---- a/drivers/gpu/drm/radeon/radeon_atombios.c
-+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
-@@ -457,6 +457,13 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
- }
- }
-
-+ /* Fujitsu D3003-S2 board lists DVI-I as DVI-I and VGA */
-+ if ((dev->pdev->device == 0x9805) &&
-+ (dev->pdev->subsystem_vendor == 0x1734) &&
-+ (dev->pdev->subsystem_device == 0x11bd)) {
-+ if (*connector_type == DRM_MODE_CONNECTOR_VGA)
-+ return false;
-+ }
-
- return true;
- }
-diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
-index a0c2f12..decca82 100644
---- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
-+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c
-@@ -163,8 +163,9 @@ void vmw_fifo_release(struct vmw_private *dev_priv, struct vmw_fifo_state *fifo)
-
- mutex_lock(&dev_priv->hw_mutex);
-
-+ vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC);
- while (vmw_read(dev_priv, SVGA_REG_BUSY) != 0)
-- vmw_write(dev_priv, SVGA_REG_SYNC, SVGA_SYNC_GENERIC);
-+ ;
-
- dev_priv->last_read_seqno = ioread32(fifo_mem + SVGA_FIFO_FENCE);
-
-diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
-index 70423dc..2d5bb5b 100644
---- a/drivers/input/mouse/elantech.c
-+++ b/drivers/input/mouse/elantech.c
-@@ -1130,6 +1130,13 @@ static bool elantech_is_signature_valid(const unsigned char *param)
- if (param[1] == 0)
- return true;
-
-+ /*
-+ * Some models have a revision higher then 20. Meaning param[2] may
-+ * be 10 or 20, skip the rates check for these.
-+ */
-+ if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40)
-+ return true;
-+
- for (i = 0; i < ARRAY_SIZE(rates); i++)
- if (param[2] == rates[i])
- return false;
-diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
-index df8b72b..a50e121 100644
---- a/drivers/input/mouse/synaptics.c
-+++ b/drivers/input/mouse/synaptics.c
-@@ -506,10 +506,61 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
- ((buf[0] & 0x04) >> 1) |
- ((buf[3] & 0x04) >> 2));
-
-+ if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
-+ SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) &&
-+ hw->w == 2) {
-+ synaptics_parse_agm(buf, priv, hw);
-+ return 1;
-+ }
-+
-+ hw->x = (((buf[3] & 0x10) << 8) |
-+ ((buf[1] & 0x0f) << 8) |
-+ buf[4]);
-+ hw->y = (((buf[3] & 0x20) << 7) |
-+ ((buf[1] & 0xf0) << 4) |
-+ buf[5]);
-+ hw->z = buf[2];
-+
- hw->left = (buf[0] & 0x01) ? 1 : 0;
- hw->right = (buf[0] & 0x02) ? 1 : 0;
-
-- if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
-+ if (SYN_CAP_FORCEPAD(priv->ext_cap_0c)) {
-+ /*
-+ * ForcePads, like Clickpads, use middle button
-+ * bits to report primary button clicks.
-+ * Unfortunately they report primary button not
-+ * only when user presses on the pad above certain
-+ * threshold, but also when there are more than one
-+ * finger on the touchpad, which interferes with
-+ * out multi-finger gestures.
-+ */
-+ if (hw->z == 0) {
-+ /* No contacts */
-+ priv->press = priv->report_press = false;
-+ } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) {
-+ /*
-+ * Single-finger touch with pressure above
-+ * the threshold. If pressure stays long
-+ * enough, we'll start reporting primary
-+ * button. We rely on the device continuing
-+ * sending data even if finger does not
-+ * move.
-+ */
-+ if (!priv->press) {
-+ priv->press_start = jiffies;
-+ priv->press = true;
-+ } else if (time_after(jiffies,
-+ priv->press_start +
-+ msecs_to_jiffies(50))) {
-+ priv->report_press = true;
-+ }
-+ } else {
-+ priv->press = false;
-+ }
-+
-+ hw->left = priv->report_press;
-+
-+ } else if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) {
- /*
- * Clickpad's button is transmitted as middle button,
- * however, since it is primary button, we will report
-@@ -528,21 +579,6 @@ static int synaptics_parse_hw_state(const unsigned char buf[],
- hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0;
- }
-
-- if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
-- SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) &&
-- hw->w == 2) {
-- synaptics_parse_agm(buf, priv, hw);
-- return 1;
-- }
--
-- hw->x = (((buf[3] & 0x10) << 8) |
-- ((buf[1] & 0x0f) << 8) |
-- buf[4]);
-- hw->y = (((buf[3] & 0x20) << 7) |
-- ((buf[1] & 0xf0) << 4) |
-- buf[5]);
-- hw->z = buf[2];
--
- if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) &&
- ((buf[0] ^ buf[3]) & 0x02)) {
- switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) {
-diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h
-index 622aea8..908d167 100644
---- a/drivers/input/mouse/synaptics.h
-+++ b/drivers/input/mouse/synaptics.h
-@@ -77,6 +77,11 @@
- * 2 0x08 image sensor image sensor tracks 5 fingers, but only
- * reports 2.
- * 2 0x20 report min query 0x0f gives min coord reported
-+ * 2 0x80 forcepad forcepad is a variant of clickpad that
-+ * does not have physical buttons but rather
-+ * uses pressure above certain threshold to
-+ * report primary clicks. Forcepads also have
-+ * clickpad bit set.
- */
- #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */
- #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */
-@@ -85,6 +90,7 @@
- #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000)
- #define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400)
- #define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800)
-+#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000)
-
- /* synaptics modes query bits */
- #define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7))
-@@ -170,6 +176,11 @@ struct synaptics_data {
- */
- struct synaptics_hw_state agm;
- bool agm_pending; /* new AGM packet received */
-+
-+ /* ForcePad handling */
-+ unsigned long press_start;
-+ bool press;
-+ bool report_press;
- };
-
- void synaptics_module_init(void);
-diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
-index 031270c..bab8238 100644
---- a/drivers/input/serio/i8042-x86ia64io.h
-+++ b/drivers/input/serio/i8042-x86ia64io.h
-@@ -458,6 +458,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
- DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
- },
- },
-+ {
-+ /* Avatar AVIU-145A6 */
-+ .matches = {
-+ DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
-+ },
-+ },
- { }
- };
-
-@@ -594,6 +601,14 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
- DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
- },
- },
-+ {
-+ /* Fujitsu U574 laptop */
-+ /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
-+ .matches = {
-+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
-+ },
-+ },
- { }
- };
-
-diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c
-index 8755f5f..e4ecf3b 100644
---- a/drivers/input/serio/serport.c
-+++ b/drivers/input/serio/serport.c
-@@ -21,6 +21,7 @@
- #include <linux/init.h>
- #include <linux/serio.h>
- #include <linux/tty.h>
-+#include <linux/compat.h>
-
- MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
- MODULE_DESCRIPTION("Input device TTY line discipline");
-@@ -196,28 +197,55 @@ static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, u
- return 0;
- }
-
-+static void serport_set_type(struct tty_struct *tty, unsigned long type)
-+{
-+ struct serport *serport = tty->disc_data;
-+
-+ serport->id.proto = type & 0x000000ff;
-+ serport->id.id = (type & 0x0000ff00) >> 8;
-+ serport->id.extra = (type & 0x00ff0000) >> 16;
-+}
-+
- /*
- * serport_ldisc_ioctl() allows to set the port protocol, and device ID
- */
-
--static int serport_ldisc_ioctl(struct tty_struct * tty, struct file * file, unsigned int cmd, unsigned long arg)
-+static int serport_ldisc_ioctl(struct tty_struct *tty, struct file *file,
-+ unsigned int cmd, unsigned long arg)
- {
-- struct serport *serport = (struct serport*) tty->disc_data;
-- unsigned long type;
--
- if (cmd == SPIOCSTYPE) {
-+ unsigned long type;
-+
- if (get_user(type, (unsigned long __user *) arg))
- return -EFAULT;
-
-- serport->id.proto = type & 0x000000ff;
-- serport->id.id = (type & 0x0000ff00) >> 8;
-- serport->id.extra = (type & 0x00ff0000) >> 16;
-+ serport_set_type(tty, type);
-+ return 0;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+#ifdef CONFIG_COMPAT
-+#define COMPAT_SPIOCSTYPE _IOW('q', 0x01, compat_ulong_t)
-+static long serport_ldisc_compat_ioctl(struct tty_struct *tty,
-+ struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ if (cmd == COMPAT_SPIOCSTYPE) {
-+ void __user *uarg = compat_ptr(arg);
-+ compat_ulong_t compat_type;
-+
-+ if (get_user(compat_type, (compat_ulong_t __user *)uarg))
-+ return -EFAULT;
-
-+ serport_set_type(tty, compat_type);
- return 0;
- }
-
- return -EINVAL;
- }
-+#endif
-
- static void serport_ldisc_write_wakeup(struct tty_struct * tty)
- {
-@@ -241,6 +269,9 @@ static struct tty_ldisc_ops serport_ldisc = {
- .close = serport_ldisc_close,
- .read = serport_ldisc_read,
- .ioctl = serport_ldisc_ioctl,
-+#ifdef CONFIG_COMPAT
-+ .compat_ioctl = serport_ldisc_compat_ioctl,
-+#endif
- .receive_buf = serport_ldisc_receive,
- .write_wakeup = serport_ldisc_write_wakeup
- };
-diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
-index aa142f9..4878d91 100644
---- a/drivers/md/dm-crypt.c
-+++ b/drivers/md/dm-crypt.c
-@@ -1565,6 +1565,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
- unsigned int key_size, opt_params;
- unsigned long long tmpll;
- int ret;
-+ size_t iv_size_padding;
- struct dm_arg_set as;
- const char *opt_string;
-
-@@ -1600,12 +1601,23 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
-
- cc->dmreq_start = sizeof(struct ablkcipher_request);
- cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc));
-- cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment());
-- cc->dmreq_start += crypto_ablkcipher_alignmask(any_tfm(cc)) &
-- ~(crypto_tfm_ctx_alignment() - 1);
-+ cc->dmreq_start = ALIGN(cc->dmreq_start, __alignof__(struct dm_crypt_request));
-+
-+ if (crypto_ablkcipher_alignmask(any_tfm(cc)) < CRYPTO_MINALIGN) {
-+ /* Allocate the padding exactly */
-+ iv_size_padding = -(cc->dmreq_start + sizeof(struct dm_crypt_request))
-+ & crypto_ablkcipher_alignmask(any_tfm(cc));
-+ } else {
-+ /*
-+ * If the cipher requires greater alignment than kmalloc
-+ * alignment, we don't know the exact position of the
-+ * initialization vector. We must assume worst case.
-+ */
-+ iv_size_padding = crypto_ablkcipher_alignmask(any_tfm(cc));
-+ }
-
- cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start +
-- sizeof(struct dm_crypt_request) + cc->iv_size);
-+ sizeof(struct dm_crypt_request) + iv_size_padding + cc->iv_size);
- if (!cc->req_pool) {
- ti->error = "Cannot allocate crypt request mempool";
- goto bad;
-diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c
-index 044ea06..ab411c3 100644
---- a/drivers/net/can/at91_can.c
-+++ b/drivers/net/can/at91_can.c
-@@ -1115,7 +1115,9 @@ static int at91_open(struct net_device *dev)
- struct at91_priv *priv = netdev_priv(dev);
- int err;
-
-- clk_enable(priv->clk);
-+ err = clk_prepare_enable(priv->clk);
-+ if (err)
-+ return err;
-
- /* check or determine and set bittime */
- err = open_candev(dev);
-@@ -1139,7 +1141,7 @@ static int at91_open(struct net_device *dev)
- out_close:
- close_candev(dev);
- out:
-- clk_disable(priv->clk);
-+ clk_disable_unprepare(priv->clk);
-
- return err;
- }
-@@ -1156,7 +1158,7 @@ static int at91_close(struct net_device *dev)
- at91_chip_stop(dev, CAN_STATE_STOPPED);
-
- free_irq(dev->irq, dev);
-- clk_disable(priv->clk);
-+ clk_disable_unprepare(priv->clk);
-
- close_candev(dev);
-
-diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
-index 7c6bb5a..b1f354f 100644
---- a/drivers/net/can/flexcan.c
-+++ b/drivers/net/can/flexcan.c
-@@ -120,7 +120,9 @@
- (FLEXCAN_ESR_ERR_BUS | FLEXCAN_ESR_ERR_STATE)
-
- /* FLEXCAN interrupt flag register (IFLAG) bits */
--#define FLEXCAN_TX_BUF_ID 8
-+/* Errata ERR005829 step7: Reserve first valid MB */
-+#define FLEXCAN_TX_BUF_RESERVED 8
-+#define FLEXCAN_TX_BUF_ID 9
- #define FLEXCAN_IFLAG_BUF(x) BIT(x)
- #define FLEXCAN_IFLAG_RX_FIFO_OVERFLOW BIT(7)
- #define FLEXCAN_IFLAG_RX_FIFO_WARN BIT(6)
-@@ -131,6 +133,17 @@
-
- /* FLEXCAN message buffers */
- #define FLEXCAN_MB_CNT_CODE(x) (((x) & 0xf) << 24)
-+#define FLEXCAN_MB_CODE_RX_INACTIVE (0x0 << 24)
-+#define FLEXCAN_MB_CODE_RX_EMPTY (0x4 << 24)
-+#define FLEXCAN_MB_CODE_RX_FULL (0x2 << 24)
-+#define FLEXCAN_MB_CODE_RX_OVERRRUN (0x6 << 24)
-+#define FLEXCAN_MB_CODE_RX_RANSWER (0xa << 24)
-+
-+#define FLEXCAN_MB_CODE_TX_INACTIVE (0x8 << 24)
-+#define FLEXCAN_MB_CODE_TX_ABORT (0x9 << 24)
-+#define FLEXCAN_MB_CODE_TX_DATA (0xc << 24)
-+#define FLEXCAN_MB_CODE_TX_TANSWER (0xe << 24)
-+
- #define FLEXCAN_MB_CNT_SRR BIT(22)
- #define FLEXCAN_MB_CNT_IDE BIT(21)
- #define FLEXCAN_MB_CNT_RTR BIT(20)
-@@ -302,6 +315,14 @@ static int flexcan_start_xmit(struct sk_buff *skb, struct net_device *dev)
- flexcan_write(can_id, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_id);
- flexcan_write(ctrl, &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
-
-+ /* Errata ERR005829 step8:
-+ * Write twice INACTIVE(0x8) code to first MB.
-+ */
-+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
-+ &regs->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl);
-+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
-+ &regs->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl);
-+
- kfree_skb(skb);
-
- /* tx_packets is incremented in flexcan_irq */
-@@ -611,6 +632,9 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id)
- if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) {
- /* tx_bytes is incremented in flexcan_start_xmit */
- stats->tx_packets++;
-+ /* after sending a RTR frame mailbox is in RX mode */
-+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
-+ &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
- flexcan_write((1 << FLEXCAN_TX_BUF_ID), &regs->iflag1);
- netif_wake_queue(dev);
- }
-@@ -668,6 +692,7 @@ static int flexcan_chip_start(struct net_device *dev)
- struct flexcan_regs __iomem *regs = priv->base;
- int err;
- u32 reg_mcr, reg_ctrl;
-+ int i;
-
- /* enable module */
- flexcan_chip_enable(priv);
-@@ -733,8 +758,18 @@ static int flexcan_chip_start(struct net_device *dev)
- dev_dbg(dev->dev.parent, "%s: writing ctrl=0x%08x", __func__, reg_ctrl);
- flexcan_write(reg_ctrl, &regs->ctrl);
-
-- /* Abort any pending TX, mark Mailbox as INACTIVE */
-- flexcan_write(FLEXCAN_MB_CNT_CODE(0x4),
-+ /* clear and invalidate all mailboxes first */
-+ for (i = FLEXCAN_TX_BUF_ID; i < ARRAY_SIZE(regs->cantxfg); i++) {
-+ flexcan_write(FLEXCAN_MB_CODE_RX_INACTIVE,
-+ &regs->cantxfg[i].can_ctrl);
-+ }
-+
-+ /* Errata ERR005829: mark first TX mailbox as INACTIVE */
-+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
-+ &regs->cantxfg[FLEXCAN_TX_BUF_RESERVED].can_ctrl);
-+
-+ /* mark TX mailbox as INACTIVE */
-+ flexcan_write(FLEXCAN_MB_CODE_TX_INACTIVE,
- &regs->cantxfg[FLEXCAN_TX_BUF_ID].can_ctrl);
-
- /* acceptance mask/acceptance code (accept everything) */
-diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
-index d696536..d552fa3 100644
---- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
-@@ -440,6 +440,14 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
- /* always get timestamp with Rx frame */
- ctx->staging.flags |= RXON_FLG_TSF2HOST_MSK;
-
-+ /*
-+ * force CTS-to-self frames protection if RTS-CTS is not preferred
-+ * one aggregation protection method
-+ */
-+ if (!(priv->cfg->ht_params &&
-+ priv->cfg->ht_params->use_rts_for_aggregation))
-+ ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
-+
- if ((ctx->vif && ctx->vif->bss_conf.use_short_slot) ||
- !(ctx->staging.flags & RXON_FLG_BAND_24G_MSK))
- ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
-@@ -872,6 +880,11 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
- else
- ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
-
-+ if (bss_conf->use_cts_prot)
-+ ctx->staging.flags |= RXON_FLG_SELF_CTS_EN;
-+ else
-+ ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN;
-+
- memcpy(ctx->staging.bssid_addr, bss_conf->bssid, ETH_ALEN);
-
- if (vif->type == NL80211_IFTYPE_AP ||
-diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
-index c184253..1644b1f 100644
---- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
-+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
-@@ -316,6 +316,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
- {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/
- {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
- {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
-+ {RTL_USB_DEVICE(0x0df6, 0x0070, rtl92cu_hal_cfg)}, /*Sitecom - 150N */
- {RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/
- {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/
- {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/
-diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
-index 143bbe4..2794a30 100644
---- a/drivers/scsi/libiscsi.c
-+++ b/drivers/scsi/libiscsi.c
-@@ -718,11 +718,21 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
- return NULL;
- }
-
-+ if (data_size > ISCSI_DEF_MAX_RECV_SEG_LEN) {
-+ iscsi_conn_printk(KERN_ERR, conn, "Invalid buffer len of %u for login task. Max len is %u\n", data_size, ISCSI_DEF_MAX_RECV_SEG_LEN);
-+ return NULL;
-+ }
-+
- task = conn->login_task;
- } else {
- if (session->state != ISCSI_STATE_LOGGED_IN)
- return NULL;
-
-+ if (data_size != 0) {
-+ iscsi_conn_printk(KERN_ERR, conn, "Can not send data buffer of len %u for op 0x%x\n", data_size, opcode);
-+ return NULL;
-+ }
-+
- BUG_ON(conn->c_stage == ISCSI_CONN_INITIAL_STAGE);
- BUG_ON(conn->c_stage == ISCSI_CONN_STOPPED);
-
-diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
-index ab5dd16..ae4e7da 100644
---- a/drivers/target/iscsi/iscsi_target.c
-+++ b/drivers/target/iscsi/iscsi_target.c
-@@ -4306,6 +4306,7 @@ static void iscsit_logout_post_handler_diffcid(
- {
- struct iscsi_conn *l_conn;
- struct iscsi_session *sess = conn->sess;
-+ bool conn_found = false;
-
- if (!sess)
- return;
-@@ -4314,12 +4315,13 @@ static void iscsit_logout_post_handler_diffcid(
- list_for_each_entry(l_conn, &sess->sess_conn_list, conn_list) {
- if (l_conn->cid == cid) {
- iscsit_inc_conn_usage_count(l_conn);
-+ conn_found = true;
- break;
- }
- }
- spin_unlock_bh(&sess->conn_lock);
-
-- if (!l_conn)
-+ if (!conn_found)
- return;
-
- if (l_conn->sock)
-diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c
-index db313ba..e5f5bff 100644
---- a/drivers/target/iscsi/iscsi_target_parameters.c
-+++ b/drivers/target/iscsi/iscsi_target_parameters.c
-@@ -552,7 +552,7 @@ int iscsi_copy_param_list(
- param_list = kzalloc(sizeof(struct iscsi_param_list), GFP_KERNEL);
- if (!param_list) {
- pr_err("Unable to allocate memory for struct iscsi_param_list.\n");
-- goto err_out;
-+ return -1;
- }
- INIT_LIST_HEAD(&param_list->param_list);
- INIT_LIST_HEAD(&param_list->extra_response_list);
-diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
-index f08732b..10aec1a 100644
---- a/drivers/usb/core/hub.c
-+++ b/drivers/usb/core/hub.c
-@@ -3651,9 +3651,10 @@ static void hub_events(void)
-
- hub = list_entry(tmp, struct usb_hub, event_list);
- kref_get(&hub->kref);
-+ hdev = hub->hdev;
-+ usb_get_dev(hdev);
- spin_unlock_irq(&hub_event_lock);
-
-- hdev = hub->hdev;
- hub_dev = hub->intfdev;
- intf = to_usb_interface(hub_dev);
- dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n",
-@@ -3888,6 +3889,7 @@ static void hub_events(void)
- usb_autopm_put_interface(intf);
- loop_disconnected:
- usb_unlock_device(hdev);
-+ usb_put_dev(hdev);
- kref_put(&hub->kref, hub_release);
-
- } /* end while (1) */
-diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
-index 600d823..3d9b57e 100644
---- a/drivers/usb/dwc3/core.c
-+++ b/drivers/usb/dwc3/core.c
-@@ -427,9 +427,6 @@ static int __devexit dwc3_remove(struct platform_device *pdev)
-
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-- pm_runtime_put(&pdev->dev);
-- pm_runtime_disable(&pdev->dev);
--
- dwc3_debugfs_exit(dwc);
-
- if (features & DWC3_HAS_PERIPHERAL)
-@@ -440,6 +437,9 @@ static int __devexit dwc3_remove(struct platform_device *pdev)
- iounmap(dwc->regs);
- kfree(dwc->mem);
-
-+ pm_runtime_put_sync(&pdev->dev);
-+ pm_runtime_disable(&pdev->dev);
-+
- return 0;
- }
-
-diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
-index 517cadb..a3b569f 100644
---- a/drivers/usb/host/xhci-hub.c
-+++ b/drivers/usb/host/xhci-hub.c
-@@ -440,7 +440,8 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array,
- }
-
- /* Updates Link Status for super Speed port */
--static void xhci_hub_report_link_state(u32 *status, u32 status_reg)
-+static void xhci_hub_report_link_state(struct xhci_hcd *xhci,
-+ u32 *status, u32 status_reg)
- {
- u32 pls = status_reg & PORT_PLS_MASK;
-
-@@ -479,7 +480,8 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg)
- * in which sometimes the port enters compliance mode
- * caused by a delay on the host-device negotiation.
- */
-- if (pls == USB_SS_PORT_LS_COMP_MOD)
-+ if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
-+ (pls == USB_SS_PORT_LS_COMP_MOD))
- pls |= USB_PORT_STAT_CONNECTION;
- }
-
-@@ -655,7 +657,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
- }
- /* Update Port Link State for super speed ports*/
- if (hcd->speed == HCD_USB3) {
-- xhci_hub_report_link_state(&status, temp);
-+ xhci_hub_report_link_state(xhci, &status, temp);
- /*
- * Verify if all USB3 Ports Have entered U0 already.
- * Delete Compliance Mode Timer if so.
-diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
-index 74922b9..0f4a41d 100644
---- a/drivers/usb/host/xhci-mem.c
-+++ b/drivers/usb/host/xhci-mem.c
-@@ -1723,7 +1723,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
- }
-
- num_ports = HCS_MAX_PORTS(xhci->hcs_params1);
-- for (i = 0; i < num_ports; i++) {
-+ for (i = 0; i < num_ports && xhci->rh_bw; i++) {
- struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table;
- for (j = 0; j < XHCI_MAX_INTERVAL; j++) {
- struct list_head *ep = &bwt->interval_bw[j].endpoints;
-diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
-index 0d34f85..8fe5c13 100644
---- a/drivers/usb/serial/ftdi_sio.c
-+++ b/drivers/usb/serial/ftdi_sio.c
-@@ -752,6 +752,7 @@ static struct usb_device_id id_table_combined [] = {
- { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
- .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
- { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
-+ { USB_DEVICE(NOVITUS_VID, NOVITUS_BONO_E_PID) },
- { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
- { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
- { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
-@@ -961,6 +962,8 @@ static struct usb_device_id id_table_combined [] = {
- { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
- /* ekey Devices */
- { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },
-+ /* GE Healthcare devices */
-+ { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },
- { }, /* Optional parameter entry */
- { } /* Terminating entry */
- };
-diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
-index cbcb1e6..bd509de 100644
---- a/drivers/usb/serial/ftdi_sio_ids.h
-+++ b/drivers/usb/serial/ftdi_sio_ids.h
-@@ -831,6 +831,12 @@
- #define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */
-
- /*
-+ * NOVITUS printers
-+ */
-+#define NOVITUS_VID 0x1a28
-+#define NOVITUS_BONO_E_PID 0x6010
-+
-+/*
- * RT Systems programming cables for various ham radios
- */
- #define RTSYSTEMS_VID 0x2100 /* Vendor ID */
-@@ -1379,3 +1385,9 @@
- * ekey biometric systems GmbH (http://ekey.net/)
- */
- #define FTDI_EKEY_CONV_USB_PID 0xCB08 /* Converter USB */
-+
-+/*
-+ * GE Healthcare devices
-+ */
-+#define GE_HEALTHCARE_VID 0x1901
-+#define GE_HEALTHCARE_NEMO_TRACKER_PID 0x0015
-diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
-index 0d26ab6..db9e54a 100644
---- a/drivers/usb/serial/sierra.c
-+++ b/drivers/usb/serial/sierra.c
-@@ -296,14 +296,19 @@ static const struct usb_device_id id_table[] = {
- { USB_DEVICE(0x1199, 0x68A2), /* Sierra Wireless MC77xx in QMI mode */
- .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
- },
-- { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */
-+ /* Sierra Wireless Direct IP modems */
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68A3, 0xFF, 0xFF, 0xFF),
-+ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
-+ },
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68AA, 0xFF, 0xFF, 0xFF),
- .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
- },
- /* AT&T Direct IP LTE modems */
- { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68AA, 0xFF, 0xFF, 0xFF),
- .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
- },
-- { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */
-+ /* Airprime/Sierra Wireless Direct IP modems */
-+ { USB_DEVICE_AND_INTERFACE_INFO(0x0F3D, 0x68A3, 0xFF, 0xFF, 0xFF),
- .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist
- },
-
-diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
-index e588a11..a6c4c7d 100644
---- a/drivers/usb/storage/unusual_devs.h
-+++ b/drivers/usb/storage/unusual_devs.h
-@@ -93,6 +93,12 @@ UNUSUAL_DEV( 0x03f0, 0x4002, 0x0001, 0x0001,
- "PhotoSmart R707",
- USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_FIX_CAPACITY),
-
-+UNUSUAL_DEV( 0x03f3, 0x0001, 0x0000, 0x9999,
-+ "Adaptec",
-+ "USBConnect 2000",
-+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
-+ US_FL_SCM_MULT_TARG ),
-+
- /* Reported by Sebastian Kapfer <sebastian_kapfer@gmx.net>
- * and Olaf Hering <olh@suse.de> (different bcd's, same vendor/product)
- * for USB floppies that need the SINGLE_LUN enforcement.
-@@ -733,6 +739,12 @@ UNUSUAL_DEV( 0x059b, 0x0001, 0x0100, 0x0100,
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- US_FL_SINGLE_LUN ),
-
-+UNUSUAL_DEV( 0x059b, 0x0040, 0x0100, 0x0100,
-+ "Iomega",
-+ "Jaz USB Adapter",
-+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-+ US_FL_SINGLE_LUN ),
-+
- /* Reported by <Hendryk.Pfeiffer@gmx.de> */
- UNUSUAL_DEV( 0x059f, 0x0643, 0x0000, 0x0000,
- "LaCie",
-@@ -1105,6 +1117,18 @@ UNUSUAL_DEV( 0x0851, 0x1543, 0x0200, 0x0200,
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- US_FL_NOT_LOCKABLE),
-
-+UNUSUAL_DEV( 0x085a, 0x0026, 0x0100, 0x0133,
-+ "Xircom",
-+ "PortGear USB-SCSI (Mac USB Dock)",
-+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
-+ US_FL_SCM_MULT_TARG ),
-+
-+UNUSUAL_DEV( 0x085a, 0x0028, 0x0100, 0x0133,
-+ "Xircom",
-+ "PortGear USB to SCSI Converter",
-+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
-+ US_FL_SCM_MULT_TARG ),
-+
- /* Submitted by Jan De Luyck <lkml@kcore.org> */
- UNUSUAL_DEV( 0x08bd, 0x1100, 0x0000, 0x0000,
- "CITIZEN",
-@@ -1932,6 +1956,14 @@ UNUSUAL_DEV( 0x152d, 0x2329, 0x0100, 0x0100,
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- US_FL_IGNORE_RESIDUE | US_FL_SANE_SENSE ),
-
-+/* Entrega Technologies U1-SC25 (later Xircom PortGear PGSCSI)
-+ * and Mac USB Dock USB-SCSI */
-+UNUSUAL_DEV( 0x1645, 0x0007, 0x0100, 0x0133,
-+ "Entrega Technologies",
-+ "USB to SCSI Converter",
-+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
-+ US_FL_SCM_MULT_TARG ),
-+
- /* Reported by Robert Schedel <r.schedel@yahoo.de>
- * Note: this is a 'super top' device like the above 14cd/6600 device */
- UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
-@@ -1947,6 +1979,12 @@ UNUSUAL_DEV( 0x177f, 0x0400, 0x0000, 0x0000,
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- US_FL_BULK_IGNORE_TAG | US_FL_MAX_SECTORS_64 ),
-
-+UNUSUAL_DEV( 0x1822, 0x0001, 0x0000, 0x9999,
-+ "Ariston Technologies",
-+ "iConnect USB to SCSI adapter",
-+ USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init,
-+ US_FL_SCM_MULT_TARG ),
-+
- /* Reported by Hans de Goede <hdegoede@redhat.com>
- * These Appotech controllers are found in Picture Frames, they provide a
- * (buggy) emulation of a cdrom drive which contains the windows software
-diff --git a/drivers/uwb/lc-dev.c b/drivers/uwb/lc-dev.c
-index 5241f1d..3c9e929 100644
---- a/drivers/uwb/lc-dev.c
-+++ b/drivers/uwb/lc-dev.c
-@@ -441,16 +441,19 @@ void uwbd_dev_onair(struct uwb_rc *rc, struct uwb_beca_e *bce)
- uwb_dev->mac_addr = *bce->mac_addr;
- uwb_dev->dev_addr = bce->dev_addr;
- dev_set_name(&uwb_dev->dev, macbuf);
-+
-+ /* plug the beacon cache */
-+ bce->uwb_dev = uwb_dev;
-+ uwb_dev->bce = bce;
-+ uwb_bce_get(bce); /* released in uwb_dev_sys_release() */
-+
- result = uwb_dev_add(uwb_dev, &rc->uwb_dev.dev, rc);
- if (result < 0) {
- dev_err(dev, "new device %s: cannot instantiate device\n",
- macbuf);
- goto error_dev_add;
- }
-- /* plug the beacon cache */
-- bce->uwb_dev = uwb_dev;
-- uwb_dev->bce = bce;
-- uwb_bce_get(bce); /* released in uwb_dev_sys_release() */
-+
- dev_info(dev, "uwb device (mac %s dev %s) connected to %s %s\n",
- macbuf, devbuf, rc->uwb_dev.dev.parent->bus->name,
- dev_name(rc->uwb_dev.dev.parent));
-@@ -458,6 +461,8 @@ void uwbd_dev_onair(struct uwb_rc *rc, struct uwb_beca_e *bce)
- return;
-
- error_dev_add:
-+ bce->uwb_dev = NULL;
-+ uwb_bce_put(bce);
- kfree(uwb_dev);
- return;
- }
-diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
-index c8af7e5..6548417 100644
---- a/drivers/xen/manage.c
-+++ b/drivers/xen/manage.c
-@@ -108,16 +108,11 @@ static void do_suspend(void)
-
- shutting_down = SHUTDOWN_SUSPEND;
-
--#ifdef CONFIG_PREEMPT
-- /* If the kernel is preemptible, we need to freeze all the processes
-- to prevent them from being in the middle of a pagetable update
-- during suspend. */
- err = freeze_processes();
- if (err) {
- printk(KERN_ERR "xen suspend: freeze failed %d\n", err);
- goto out;
- }
--#endif
-
- err = dpm_suspend_start(PMSG_FREEZE);
- if (err) {
-@@ -172,10 +167,8 @@ out_resume:
- clock_was_set();
-
- out_thaw:
--#ifdef CONFIG_PREEMPT
- thaw_processes();
- out:
--#endif
- shutting_down = SHUTDOWN_INVALID;
- }
- #endif /* CONFIG_HIBERNATE_CALLBACKS */
-diff --git a/fs/aio.c b/fs/aio.c
-index 8cdd8ea..9acfd07 100644
---- a/fs/aio.c
-+++ b/fs/aio.c
-@@ -1102,6 +1102,13 @@ static int aio_read_evt(struct kioctx *ioctx, struct io_event *ent)
- head = ring->head % info->nr;
- if (head != ring->tail) {
- struct io_event *evp = aio_ring_event(info, head, KM_USER1);
-+
-+ /*
-+ * Ensure that once we've read the current tail pointer, that
-+ * we also see the events that were stored up to the tail.
-+ */
-+ smp_rmb();
-+
- *ent = *evp;
- head = (head + 1) % info->nr;
- smp_mb(); /* finish reading the event before updatng the head */
-diff --git a/fs/buffer.c b/fs/buffer.c
-index 5f4bde2..59496e7 100644
---- a/fs/buffer.c
-+++ b/fs/buffer.c
-@@ -1021,7 +1021,8 @@ grow_dev_page(struct block_device *bdev, sector_t block,
- bh = page_buffers(page);
- if (bh->b_size == size) {
- end_block = init_page_buffers(page, bdev,
-- index << sizebits, size);
-+ (sector_t)index << sizebits,
-+ size);
- goto done;
- }
- if (!try_to_free_buffers(page))
-@@ -1042,7 +1043,8 @@ grow_dev_page(struct block_device *bdev, sector_t block,
- */
- spin_lock(&inode->i_mapping->private_lock);
- link_dev_buffers(page, bh);
-- end_block = init_page_buffers(page, bdev, index << sizebits, size);
-+ end_block = init_page_buffers(page, bdev, (sector_t)index << sizebits,
-+ size);
- spin_unlock(&inode->i_mapping->private_lock);
- done:
- ret = (block < end_block) ? 1 : -ENXIO;
-diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
-index 91a6945..5a45b8f 100644
---- a/fs/ext2/inode.c
-+++ b/fs/ext2/inode.c
-@@ -619,6 +619,8 @@ static int ext2_get_blocks(struct inode *inode,
- int count = 0;
- ext2_fsblk_t first_block = 0;
-
-+ BUG_ON(maxblocks == 0);
-+
- depth = ext2_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
-
- if (depth == 0)
-diff --git a/fs/ext2/xip.c b/fs/ext2/xip.c
-index 322a56b..af014bb 100644
---- a/fs/ext2/xip.c
-+++ b/fs/ext2/xip.c
-@@ -37,6 +37,7 @@ __ext2_get_block(struct inode *inode, pgoff_t pgoff, int create,
- int rc;
-
- memset(&tmp, 0, sizeof(struct buffer_head));
-+ tmp.b_size = 1 << inode->i_blkbits;
- rc = ext2_get_block(inode, pgoff, &tmp, create);
- *result = tmp.b_blocknr;
-
-diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
-index 818b43e..5baa7ba 100644
---- a/fs/ext4/mballoc.c
-+++ b/fs/ext4/mballoc.c
-@@ -1312,6 +1312,8 @@ static void mb_free_blocks(struct inode *inode, struct ext4_buddy *e4b,
- void *buddy2;
- struct super_block *sb = e4b->bd_sb;
-
-+ if (WARN_ON(count == 0))
-+ return;
- BUG_ON(first + count > (sb->s_blocksize << 3));
- assert_spin_locked(ext4_group_lock_ptr(sb, e4b->bd_group));
- mb_check_buddy(e4b);
-@@ -3132,6 +3134,8 @@ static void ext4_discard_allocated_blocks(struct ext4_allocation_context *ac)
- int err;
-
- if (pa == NULL) {
-+ if (ac->ac_f_ex.fe_len == 0)
-+ return;
- err = ext4_mb_load_buddy(ac->ac_sb, ac->ac_f_ex.fe_group, &e4b);
- if (err) {
- /*
-@@ -3146,6 +3150,7 @@ static void ext4_discard_allocated_blocks(struct ext4_allocation_context *ac)
- mb_free_blocks(ac->ac_inode, &e4b, ac->ac_f_ex.fe_start,
- ac->ac_f_ex.fe_len);
- ext4_unlock_group(ac->ac_sb, ac->ac_f_ex.fe_group);
-+ ext4_mb_unload_buddy(&e4b);
- return;
- }
- if (pa->pa_type == MB_INODE_PA)
-diff --git a/fs/namei.c b/fs/namei.c
-index 9680cef..dea2dab 100644
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -554,24 +554,22 @@ static int complete_walk(struct nameidata *nd)
-
- static __always_inline void set_root(struct nameidata *nd)
- {
-- if (!nd->root.mnt)
-- get_fs_root(current->fs, &nd->root);
-+ get_fs_root(current->fs, &nd->root);
- }
-
- static int link_path_walk(const char *, struct nameidata *);
-
--static __always_inline void set_root_rcu(struct nameidata *nd)
-+static __always_inline unsigned set_root_rcu(struct nameidata *nd)
- {
-- if (!nd->root.mnt) {
-- struct fs_struct *fs = current->fs;
-- unsigned seq;
-+ struct fs_struct *fs = current->fs;
-+ unsigned seq, res;
-
-- do {
-- seq = read_seqcount_begin(&fs->seq);
-- nd->root = fs->root;
-- nd->seq = __read_seqcount_begin(&nd->root.dentry->d_seq);
-- } while (read_seqcount_retry(&fs->seq, seq));
-- }
-+ do {
-+ seq = read_seqcount_begin(&fs->seq);
-+ nd->root = fs->root;
-+ res = __read_seqcount_begin(&nd->root.dentry->d_seq);
-+ } while (read_seqcount_retry(&fs->seq, seq));
-+ return res;
- }
-
- static __always_inline int __vfs_follow_link(struct nameidata *nd, const char *link)
-@@ -582,7 +580,8 @@ static __always_inline int __vfs_follow_link(struct nameidata *nd, const char *l
- goto fail;
-
- if (*link == '/') {
-- set_root(nd);
-+ if (!nd->root.mnt)
-+ set_root(nd);
- path_put(&nd->path);
- nd->path = nd->root;
- path_get(&nd->root);
-@@ -912,22 +911,11 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,
- return true;
- }
-
--static void follow_mount_rcu(struct nameidata *nd)
--{
-- while (d_mountpoint(nd->path.dentry)) {
-- struct vfsmount *mounted;
-- mounted = __lookup_mnt(nd->path.mnt, nd->path.dentry, 1);
-- if (!mounted)
-- break;
-- nd->path.mnt = mounted;
-- nd->path.dentry = mounted->mnt_root;
-- nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq);
-- }
--}
--
- static int follow_dotdot_rcu(struct nameidata *nd)
- {
-- set_root_rcu(nd);
-+ struct inode *inode = nd->inode;
-+ if (!nd->root.mnt)
-+ set_root_rcu(nd);
-
- while (1) {
- if (nd->path.dentry == nd->root.dentry &&
-@@ -939,6 +927,7 @@ static int follow_dotdot_rcu(struct nameidata *nd)
- struct dentry *parent = old->d_parent;
- unsigned seq;
-
-+ inode = parent->d_inode;
- seq = read_seqcount_begin(&parent->d_seq);
- if (read_seqcount_retry(&old->d_seq, nd->seq))
- goto failed;
-@@ -948,10 +937,20 @@ static int follow_dotdot_rcu(struct nameidata *nd)
- }
- if (!follow_up_rcu(&nd->path))
- break;
-+ inode = nd->path.dentry->d_inode;
- nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq);
- }
-- follow_mount_rcu(nd);
-- nd->inode = nd->path.dentry->d_inode;
-+ while (d_mountpoint(nd->path.dentry)) {
-+ struct vfsmount *mounted;
-+ mounted = __lookup_mnt(nd->path.mnt, nd->path.dentry, 1);
-+ if (!mounted)
-+ break;
-+ nd->path.mnt = mounted;
-+ nd->path.dentry = mounted->mnt_root;
-+ inode = nd->path.dentry->d_inode;
-+ nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq);
-+ }
-+ nd->inode = inode;
- return 0;
-
- failed:
-@@ -1030,7 +1029,8 @@ static void follow_mount(struct path *path)
-
- static void follow_dotdot(struct nameidata *nd)
- {
-- set_root(nd);
-+ if (!nd->root.mnt)
-+ set_root(nd);
-
- while(1) {
- struct dentry *old = nd->path.dentry;
-@@ -1504,7 +1504,7 @@ static int path_init(int dfd, const char *name, unsigned int flags,
- if (flags & LOOKUP_RCU) {
- br_read_lock(vfsmount_lock);
- rcu_read_lock();
-- set_root_rcu(nd);
-+ nd->seq = set_root_rcu(nd);
- } else {
- set_root(nd);
- path_get(&nd->root);
-@@ -1560,7 +1560,14 @@ static int path_init(int dfd, const char *name, unsigned int flags,
- }
-
- nd->inode = nd->path.dentry->d_inode;
-- return 0;
-+ if (!(flags & LOOKUP_RCU))
-+ return 0;
-+ if (likely(!read_seqcount_retry(&nd->path.dentry->d_seq, nd->seq)))
-+ return 0;
-+ if (!(nd->flags & LOOKUP_ROOT))
-+ nd->root.mnt = NULL;
-+ rcu_read_unlock();
-+ return -ECHILD;
-
- fput_fail:
- fput_light(file, fput_needed);
-diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
-index c4a2a68..61a1303 100644
---- a/fs/nfs/nfs4proc.c
-+++ b/fs/nfs/nfs4proc.c
-@@ -2015,23 +2015,23 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
- is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags);
- is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags);
- is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags);
-- /* Calculate the current open share mode */
-- calldata->arg.fmode = 0;
-- if (is_rdonly || is_rdwr)
-- calldata->arg.fmode |= FMODE_READ;
-- if (is_wronly || is_rdwr)
-- calldata->arg.fmode |= FMODE_WRITE;
- /* Calculate the change in open mode */
-+ calldata->arg.fmode = 0;
- if (state->n_rdwr == 0) {
-- if (state->n_rdonly == 0) {
-- call_close |= is_rdonly || is_rdwr;
-- calldata->arg.fmode &= ~FMODE_READ;
-- }
-- if (state->n_wronly == 0) {
-- call_close |= is_wronly || is_rdwr;
-- calldata->arg.fmode &= ~FMODE_WRITE;
-- }
-- }
-+ if (state->n_rdonly == 0)
-+ call_close |= is_rdonly;
-+ else if (is_rdonly)
-+ calldata->arg.fmode |= FMODE_READ;
-+ if (state->n_wronly == 0)
-+ call_close |= is_wronly;
-+ else if (is_wronly)
-+ calldata->arg.fmode |= FMODE_WRITE;
-+ } else if (is_rdwr)
-+ calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
-+
-+ if (calldata->arg.fmode == 0)
-+ call_close |= is_rdwr;
-+
- spin_unlock(&state->owner->so_lock);
-
- if (!call_close) {
-diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
-index 11e1888..e2e7914 100644
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -508,6 +508,9 @@ set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl *pacl, char *key)
- char *buf = NULL;
- int error = 0;
-
-+ if (!pacl)
-+ return vfs_setxattr(dentry, key, NULL, 0, 0);
-+
- buflen = posix_acl_xattr_size(pacl->a_count);
- buf = kmalloc(buflen, GFP_KERNEL);
- error = -ENOMEM;
-diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c
-index edeb239..b2d8a96 100644
---- a/fs/nilfs2/inode.c
-+++ b/fs/nilfs2/inode.c
-@@ -24,6 +24,7 @@
- #include <linux/buffer_head.h>
- #include <linux/gfp.h>
- #include <linux/mpage.h>
-+#include <linux/pagemap.h>
- #include <linux/writeback.h>
- #include <linux/uio.h>
- #include "nilfs.h"
-@@ -195,10 +196,10 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
-
- static int nilfs_set_page_dirty(struct page *page)
- {
-+ struct inode *inode = page->mapping->host;
- int ret = __set_page_dirty_nobuffers(page);
-
- if (page_has_buffers(page)) {
-- struct inode *inode = page->mapping->host;
- unsigned nr_dirty = 0;
- struct buffer_head *bh, *head;
-
-@@ -221,6 +222,10 @@ static int nilfs_set_page_dirty(struct page *page)
-
- if (nr_dirty)
- nilfs_set_file_dirty(inode, nr_dirty);
-+ } else if (ret) {
-+ unsigned nr_dirty = 1 << (PAGE_CACHE_SHIFT - inode->i_blkbits);
-+
-+ nilfs_set_file_dirty(inode, nr_dirty);
- }
- return ret;
- }
-diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
-index 005261c..dbc372e 100644
---- a/fs/ocfs2/dlm/dlmmaster.c
-+++ b/fs/ocfs2/dlm/dlmmaster.c
-@@ -653,12 +653,9 @@ void dlm_lockres_clear_refmap_bit(struct dlm_ctxt *dlm,
- clear_bit(bit, res->refmap);
- }
-
--
--void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
-+static void __dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
- struct dlm_lock_resource *res)
- {
-- assert_spin_locked(&res->spinlock);
--
- res->inflight_locks++;
-
- mlog(0, "%s: res %.*s, inflight++: now %u, %ps()\n", dlm->name,
-@@ -666,6 +663,13 @@ void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
- __builtin_return_address(0));
- }
-
-+void dlm_lockres_grab_inflight_ref(struct dlm_ctxt *dlm,
-+ struct dlm_lock_resource *res)
-+{
-+ assert_spin_locked(&res->spinlock);
-+ __dlm_lockres_grab_inflight_ref(dlm, res);
-+}
-+
- void dlm_lockres_drop_inflight_ref(struct dlm_ctxt *dlm,
- struct dlm_lock_resource *res)
- {
-@@ -855,10 +859,8 @@ lookup:
- /* finally add the lockres to its hash bucket */
- __dlm_insert_lockres(dlm, res);
-
-- /* Grab inflight ref to pin the resource */
-- spin_lock(&res->spinlock);
-- dlm_lockres_grab_inflight_ref(dlm, res);
-- spin_unlock(&res->spinlock);
-+ /* since this lockres is new it doesn't not require the spinlock */
-+ __dlm_lockres_grab_inflight_ref(dlm, res);
-
- /* get an extra ref on the mle in case this is a BLOCK
- * if so, the creator of the BLOCK may try to put the last
-diff --git a/fs/partitions/check.c b/fs/partitions/check.c
-index 1ef15cc..18c58e5 100644
---- a/fs/partitions/check.c
-+++ b/fs/partitions/check.c
-@@ -361,6 +361,7 @@ static const struct attribute_group *part_attr_groups[] = {
- static void part_release(struct device *dev)
- {
- struct hd_struct *p = dev_to_part(dev);
-+ blk_free_devt(dev->devt);
- free_part_stats(p);
- free_part_info(p);
- kfree(p);
-@@ -403,7 +404,6 @@ void delete_partition(struct gendisk *disk, int partno)
- rcu_assign_pointer(ptbl->last_lookup, NULL);
- kobject_put(part->holder_dir);
- device_del(part_to_dev(part));
-- blk_free_devt(part_devt(part));
-
- hd_struct_put(part);
- }
-diff --git a/include/linux/alarmtimer.h b/include/linux/alarmtimer.h
-index 975009e..9a9838a 100644
---- a/include/linux/alarmtimer.h
-+++ b/include/linux/alarmtimer.h
-@@ -48,6 +48,7 @@ int alarm_try_to_cancel(struct alarm *alarm);
- int alarm_cancel(struct alarm *alarm);
-
- u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
-+ktime_t alarm_expires_remaining(const struct alarm *alarm);
-
- /*
- * A alarmtimer is active, when it is enqueued into timerqueue or the
-diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h
-index ffbeb2c..5b6efef 100644
---- a/include/linux/ceph/messenger.h
-+++ b/include/linux/ceph/messenger.h
-@@ -92,7 +92,7 @@ struct ceph_msg {
- bool front_is_vmalloc;
- bool more_to_follow;
- bool needs_out_seq;
-- int front_max;
-+ int front_alloc_len;
- unsigned long ack_stamp; /* tx: when we were acked */
-
- struct ceph_msgpool *pool;
-diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
-index f5df3dc..f4e8578 100644
---- a/include/linux/jiffies.h
-+++ b/include/linux/jiffies.h
-@@ -259,23 +259,11 @@ extern unsigned long preset_lpj;
- #define SEC_JIFFIE_SC (32 - SHIFT_HZ)
- #endif
- #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29)
--#define USEC_JIFFIE_SC (SEC_JIFFIE_SC + 19)
- #define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\
- TICK_NSEC -1) / (u64)TICK_NSEC))
-
- #define NSEC_CONVERSION ((unsigned long)((((u64)1 << NSEC_JIFFIE_SC) +\
- TICK_NSEC -1) / (u64)TICK_NSEC))
--#define USEC_CONVERSION \
-- ((unsigned long)((((u64)NSEC_PER_USEC << USEC_JIFFIE_SC) +\
-- TICK_NSEC -1) / (u64)TICK_NSEC))
--/*
-- * USEC_ROUND is used in the timeval to jiffie conversion. See there
-- * for more details. It is the scaled resolution rounding value. Note
-- * that it is a 64-bit value. Since, when it is applied, we are already
-- * in jiffies (albit scaled), it is nothing but the bits we will shift
-- * off.
-- */
--#define USEC_ROUND (u64)(((u64)1 << USEC_JIFFIE_SC) - 1)
- /*
- * The maximum jiffie value is (MAX_INT >> 1). Here we translate that
- * into seconds. The 64-bit case will overflow if we are not careful,
-diff --git a/include/net/regulatory.h b/include/net/regulatory.h
-index eb7d3c2..c3c22e0 100644
---- a/include/net/regulatory.h
-+++ b/include/net/regulatory.h
-@@ -92,7 +92,7 @@ struct ieee80211_reg_rule {
-
- struct ieee80211_regdomain {
- u32 n_reg_rules;
-- char alpha2[2];
-+ char alpha2[3];
- struct ieee80211_reg_rule reg_rules[];
- };
-
-diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
-index ad03988..e0f1c91 100644
---- a/include/net/sctp/sctp.h
-+++ b/include/net/sctp/sctp.h
-@@ -523,6 +523,11 @@ static inline void sctp_assoc_pending_pmtu(struct sctp_association *asoc)
- asoc->pmtu_pending = 0;
- }
-
-+static inline bool sctp_chunk_pending(const struct sctp_chunk *chunk)
-+{
-+ return !list_empty(&chunk->list);
-+}
-+
- /* Walk through a list of TLV parameters. Don't trust the
- * individual parameter lengths and instead depend on
- * the chunk length to indicate when to stop. Make sure
-diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
-index 9148632..4d1be75 100644
---- a/include/net/sctp/sm.h
-+++ b/include/net/sctp/sm.h
-@@ -251,9 +251,9 @@ struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *,
- int, __be16);
- struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
- union sctp_addr *addr);
--int sctp_verify_asconf(const struct sctp_association *asoc,
-- struct sctp_paramhdr *param_hdr, void *chunk_end,
-- struct sctp_paramhdr **errp);
-+bool sctp_verify_asconf(const struct sctp_association *asoc,
-+ struct sctp_chunk *chunk, bool addr_param_needed,
-+ struct sctp_paramhdr **errp);
- struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
- struct sctp_chunk *asconf);
- int sctp_process_asconf_ack(struct sctp_association *asoc,
-diff --git a/init/Kconfig b/init/Kconfig
-index 43298f9..b8dc1de 100644
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -555,6 +555,7 @@ config LOG_BUF_SHIFT
- int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
- range 12 21
- default 17
-+ depends on PRINTK
- help
- Select kernel log buffer size as a power of 2.
- Examples:
-diff --git a/kernel/cgroup.c b/kernel/cgroup.c
-index 93fc15e..ffcf896 100644
---- a/kernel/cgroup.c
-+++ b/kernel/cgroup.c
-@@ -3871,6 +3871,11 @@ static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode)
- {
- struct cgroup *c_parent = dentry->d_parent->d_fsdata;
-
-+ /* Do not accept '\n' to prevent making /proc/<pid>/cgroup unparsable.
-+ */
-+ if (strchr(dentry->d_name.name, '\n'))
-+ return -EINVAL;
-+
- /* the vfs holds inode->i_mutex already */
- return cgroup_create(c_parent, dentry, mode | S_IFDIR);
- }
-diff --git a/kernel/events/core.c b/kernel/events/core.c
-index 14c111c..4a14895 100644
---- a/kernel/events/core.c
-+++ b/kernel/events/core.c
-@@ -1683,6 +1683,16 @@ retry:
- */
- if (ctx->is_active) {
- raw_spin_unlock_irq(&ctx->lock);
-+ /*
-+ * Reload the task pointer, it might have been changed by
-+ * a concurrent perf_event_context_sched_out().
-+ */
-+ task = ctx->task;
-+ /*
-+ * Reload the task pointer, it might have been changed by
-+ * a concurrent perf_event_context_sched_out().
-+ */
-+ task = ctx->task;
- goto retry;
- }
-
-@@ -7071,8 +7081,10 @@ int perf_event_init_task(struct task_struct *child)
-
- for_each_task_context_nr(ctxn) {
- ret = perf_event_init_context(child, ctxn);
-- if (ret)
-+ if (ret) {
-+ perf_event_free_task(child);
- return ret;
-+ }
- }
-
- return 0;
-diff --git a/kernel/fork.c b/kernel/fork.c
-index 13bba30..29b4604 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -1221,7 +1221,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
- goto bad_fork_cleanup_policy;
- retval = audit_alloc(p);
- if (retval)
-- goto bad_fork_cleanup_policy;
-+ goto bad_fork_cleanup_perf;
- /* copy all the process information */
- retval = copy_semundo(clone_flags, p);
- if (retval)
-@@ -1406,8 +1406,9 @@ bad_fork_cleanup_semundo:
- exit_sem(p);
- bad_fork_cleanup_audit:
- audit_free(p);
--bad_fork_cleanup_policy:
-+bad_fork_cleanup_perf:
- perf_event_free_task(p);
-+bad_fork_cleanup_policy:
- #ifdef CONFIG_NUMA
- mpol_put(p->mempolicy);
- bad_fork_cleanup_cgroup:
-diff --git a/kernel/futex.c b/kernel/futex.c
-index 1bb37d0..f31f190 100644
---- a/kernel/futex.c
-+++ b/kernel/futex.c
-@@ -2460,6 +2460,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags,
- * shared futexes. We need to compare the keys:
- */
- if (match_futex(&q.key, &key2)) {
-+ queue_unlock(&q, hb);
- ret = -EINVAL;
- goto out_put_keys;
- }
-diff --git a/kernel/time.c b/kernel/time.c
-index 73e416d..060f961 100644
---- a/kernel/time.c
-+++ b/kernel/time.c
-@@ -493,17 +493,20 @@ EXPORT_SYMBOL(usecs_to_jiffies);
- * that a remainder subtract here would not do the right thing as the
- * resolution values don't fall on second boundries. I.e. the line:
- * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
-+ * Note that due to the small error in the multiplier here, this
-+ * rounding is incorrect for sufficiently large values of tv_nsec, but
-+ * well formed timespecs should have tv_nsec < NSEC_PER_SEC, so we're
-+ * OK.
- *
- * Rather, we just shift the bits off the right.
- *
- * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
- * value to a scaled second value.
- */
--unsigned long
--timespec_to_jiffies(const struct timespec *value)
-+static unsigned long
-+__timespec_to_jiffies(unsigned long sec, long nsec)
- {
-- unsigned long sec = value->tv_sec;
-- long nsec = value->tv_nsec + TICK_NSEC - 1;
-+ nsec = nsec + TICK_NSEC - 1;
-
- if (sec >= MAX_SEC_IN_JIFFIES){
- sec = MAX_SEC_IN_JIFFIES;
-@@ -514,6 +517,13 @@ timespec_to_jiffies(const struct timespec *value)
- (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
-
- }
-+
-+unsigned long
-+timespec_to_jiffies(const struct timespec *value)
-+{
-+ return __timespec_to_jiffies(value->tv_sec, value->tv_nsec);
-+}
-+
- EXPORT_SYMBOL(timespec_to_jiffies);
-
- void
-@@ -530,31 +540,27 @@ jiffies_to_timespec(const unsigned long jiffies, struct timespec *value)
- }
- EXPORT_SYMBOL(jiffies_to_timespec);
-
--/* Same for "timeval"
-+/*
-+ * We could use a similar algorithm to timespec_to_jiffies (with a
-+ * different multiplier for usec instead of nsec). But this has a
-+ * problem with rounding: we can't exactly add TICK_NSEC - 1 to the
-+ * usec value, since it's not necessarily integral.
- *
-- * Well, almost. The problem here is that the real system resolution is
-- * in nanoseconds and the value being converted is in micro seconds.
-- * Also for some machines (those that use HZ = 1024, in-particular),
-- * there is a LARGE error in the tick size in microseconds.
--
-- * The solution we use is to do the rounding AFTER we convert the
-- * microsecond part. Thus the USEC_ROUND, the bits to be shifted off.
-- * Instruction wise, this should cost only an additional add with carry
-- * instruction above the way it was done above.
-+ * We could instead round in the intermediate scaled representation
-+ * (i.e. in units of 1/2^(large scale) jiffies) but that's also
-+ * perilous: the scaling introduces a small positive error, which
-+ * combined with a division-rounding-upward (i.e. adding 2^(scale) - 1
-+ * units to the intermediate before shifting) leads to accidental
-+ * overflow and overestimates.
-+ *
-+ * At the cost of one additional multiplication by a constant, just
-+ * use the timespec implementation.
- */
- unsigned long
- timeval_to_jiffies(const struct timeval *value)
- {
-- unsigned long sec = value->tv_sec;
-- long usec = value->tv_usec;
--
-- if (sec >= MAX_SEC_IN_JIFFIES){
-- sec = MAX_SEC_IN_JIFFIES;
-- usec = 0;
-- }
-- return (((u64)sec * SEC_CONVERSION) +
-- (((u64)usec * USEC_CONVERSION + USEC_ROUND) >>
-- (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
-+ return __timespec_to_jiffies(value->tv_sec,
-+ value->tv_usec * NSEC_PER_USEC);
- }
- EXPORT_SYMBOL(timeval_to_jiffies);
-
-diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
-index eb198a3..7eaf162 100644
---- a/kernel/time/alarmtimer.c
-+++ b/kernel/time/alarmtimer.c
-@@ -226,6 +226,12 @@ static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer)
-
- }
-
-+ktime_t alarm_expires_remaining(const struct alarm *alarm)
-+{
-+ struct alarm_base *base = &alarm_bases[alarm->type];
-+ return ktime_sub(alarm->node.expires, base->gettime());
-+}
-+
- #ifdef CONFIG_RTC_CLASS
- /**
- * alarmtimer_suspend - Suspend time callback
-@@ -442,18 +448,26 @@ static enum alarmtimer_type clock2alarm(clockid_t clockid)
- static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
- ktime_t now)
- {
-+ unsigned long flags;
- struct k_itimer *ptr = container_of(alarm, struct k_itimer,
- it.alarm.alarmtimer);
-- if (posix_timer_event(ptr, 0) != 0)
-- ptr->it_overrun++;
-+ enum alarmtimer_restart result = ALARMTIMER_NORESTART;
-+
-+ spin_lock_irqsave(&ptr->it_lock, flags);
-+ if ((ptr->it_sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_NONE) {
-+ if (posix_timer_event(ptr, 0) != 0)
-+ ptr->it_overrun++;
-+ }
-
- /* Re-add periodic timers */
- if (ptr->it.alarm.interval.tv64) {
- ptr->it_overrun += alarm_forward(alarm, now,
- ptr->it.alarm.interval);
-- return ALARMTIMER_RESTART;
-+ result = ALARMTIMER_RESTART;
- }
-- return ALARMTIMER_NORESTART;
-+ spin_unlock_irqrestore(&ptr->it_lock, flags);
-+
-+ return result;
- }
-
- /**
-@@ -519,18 +533,22 @@ static int alarm_timer_create(struct k_itimer *new_timer)
- * @new_timer: k_itimer pointer
- * @cur_setting: itimerspec data to fill
- *
-- * Copies the itimerspec data out from the k_itimer
-+ * Copies out the current itimerspec data
- */
- static void alarm_timer_get(struct k_itimer *timr,
- struct itimerspec *cur_setting)
- {
-- memset(cur_setting, 0, sizeof(struct itimerspec));
-+ ktime_t relative_expiry_time =
-+ alarm_expires_remaining(&(timr->it.alarm.alarmtimer));
-+
-+ if (ktime_to_ns(relative_expiry_time) > 0) {
-+ cur_setting->it_value = ktime_to_timespec(relative_expiry_time);
-+ } else {
-+ cur_setting->it_value.tv_sec = 0;
-+ cur_setting->it_value.tv_nsec = 0;
-+ }
-
-- cur_setting->it_interval =
-- ktime_to_timespec(timr->it.alarm.interval);
-- cur_setting->it_value =
-- ktime_to_timespec(timr->it.alarm.alarmtimer.node.expires);
-- return;
-+ cur_setting->it_interval = ktime_to_timespec(timr->it.alarm.interval);
- }
-
- /**
-diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
-index 4babd77..b252661 100644
---- a/kernel/trace/ring_buffer.c
-+++ b/kernel/trace/ring_buffer.c
-@@ -2847,7 +2847,7 @@ static void rb_iter_reset(struct ring_buffer_iter *iter)
- iter->head = cpu_buffer->reader_page->read;
-
- iter->cache_reader_page = iter->head_page;
-- iter->cache_read = iter->head;
-+ iter->cache_read = cpu_buffer->read;
-
- if (iter->head)
- iter->read_stamp = cpu_buffer->read_stamp;
-diff --git a/mm/migrate.c b/mm/migrate.c
-index 09d6a9d..7d26ea5 100644
---- a/mm/migrate.c
-+++ b/mm/migrate.c
-@@ -141,8 +141,11 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
-
- get_page(new);
- pte = pte_mkold(mk_pte(new, vma->vm_page_prot));
-+
-+ /* Recheck VMA as permissions can change since migration started */
- if (is_write_migration_entry(entry))
-- pte = pte_mkwrite(pte);
-+ pte = maybe_mkwrite(pte, vma);
-+
- #ifdef CONFIG_HUGETLB_PAGE
- if (PageHuge(new))
- pte = pte_mkhuge(pte);
-diff --git a/mm/percpu-vm.c b/mm/percpu-vm.c
-index 12a48a88..0539f6a 100644
---- a/mm/percpu-vm.c
-+++ b/mm/percpu-vm.c
-@@ -108,7 +108,7 @@ static int pcpu_alloc_pages(struct pcpu_chunk *chunk,
- int page_start, int page_end)
- {
- const gfp_t gfp = GFP_KERNEL | __GFP_HIGHMEM | __GFP_COLD;
-- unsigned int cpu;
-+ unsigned int cpu, tcpu;
- int i;
-
- for_each_possible_cpu(cpu) {
-@@ -116,14 +116,23 @@ static int pcpu_alloc_pages(struct pcpu_chunk *chunk,
- struct page **pagep = &pages[pcpu_page_idx(cpu, i)];
-
- *pagep = alloc_pages_node(cpu_to_node(cpu), gfp, 0);
-- if (!*pagep) {
-- pcpu_free_pages(chunk, pages, populated,
-- page_start, page_end);
-- return -ENOMEM;
-- }
-+ if (!*pagep)
-+ goto err;
- }
- }
- return 0;
-+
-+err:
-+ while (--i >= page_start)
-+ __free_page(pages[pcpu_page_idx(cpu, i)]);
-+
-+ for_each_possible_cpu(tcpu) {
-+ if (tcpu == cpu)
-+ break;
-+ for (i = page_start; i < page_end; i++)
-+ __free_page(pages[pcpu_page_idx(tcpu, i)]);
-+ }
-+ return -ENOMEM;
- }
-
- /**
-@@ -264,6 +273,7 @@ err:
- __pcpu_unmap_pages(pcpu_chunk_addr(chunk, tcpu, page_start),
- page_end - page_start);
- }
-+ pcpu_post_unmap_tlb_flush(chunk, page_start, page_end);
- return err;
- }
-
-diff --git a/mm/percpu.c b/mm/percpu.c
-index 5c29750..e29a1c4 100644
---- a/mm/percpu.c
-+++ b/mm/percpu.c
-@@ -1895,6 +1895,8 @@ void __init setup_per_cpu_areas(void)
-
- if (pcpu_setup_first_chunk(ai, fc) < 0)
- panic("Failed to initialize percpu areas.");
-+
-+ pcpu_free_alloc_info(ai);
- }
-
- #endif /* CONFIG_SMP */
-diff --git a/mm/shmem.c b/mm/shmem.c
-index 1371021..83efac6 100644
---- a/mm/shmem.c
-+++ b/mm/shmem.c
-@@ -1719,8 +1719,10 @@ static int shmem_rename(struct inode *old_dir, struct dentry *old_dentry, struct
-
- if (new_dentry->d_inode) {
- (void) shmem_unlink(new_dir, new_dentry);
-- if (they_are_dirs)
-+ if (they_are_dirs) {
-+ drop_nlink(new_dentry->d_inode);
- drop_nlink(old_dir);
-+ }
- } else if (they_are_dirs) {
- drop_nlink(old_dir);
- inc_nlink(new_dir);
-diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c
-index 1587dc6..9898d1f 100644
---- a/net/ceph/auth_x.c
-+++ b/net/ceph/auth_x.c
-@@ -13,8 +13,6 @@
- #include "auth_x.h"
- #include "auth_x_protocol.h"
-
--#define TEMP_TICKET_BUF_LEN 256
--
- static void ceph_x_validate_tickets(struct ceph_auth_client *ac, int *pneed);
-
- static int ceph_x_is_authenticated(struct ceph_auth_client *ac)
-@@ -64,7 +62,7 @@ static int ceph_x_encrypt(struct ceph_crypto_key *secret,
- }
-
- static int ceph_x_decrypt(struct ceph_crypto_key *secret,
-- void **p, void *end, void *obuf, size_t olen)
-+ void **p, void *end, void **obuf, size_t olen)
- {
- struct ceph_x_encrypt_header head;
- size_t head_len = sizeof(head);
-@@ -75,8 +73,14 @@ static int ceph_x_decrypt(struct ceph_crypto_key *secret,
- return -EINVAL;
-
- dout("ceph_x_decrypt len %d\n", len);
-- ret = ceph_decrypt2(secret, &head, &head_len, obuf, &olen,
-- *p, len);
-+ if (*obuf == NULL) {
-+ *obuf = kmalloc(len, GFP_NOFS);
-+ if (!*obuf)
-+ return -ENOMEM;
-+ olen = len;
-+ }
-+
-+ ret = ceph_decrypt2(secret, &head, &head_len, *obuf, &olen, *p, len);
- if (ret)
- return ret;
- if (head.struct_v != 1 || le64_to_cpu(head.magic) != CEPHX_ENC_MAGIC)
-@@ -129,139 +133,120 @@ static void remove_ticket_handler(struct ceph_auth_client *ac,
- kfree(th);
- }
-
--static int ceph_x_proc_ticket_reply(struct ceph_auth_client *ac,
-- struct ceph_crypto_key *secret,
-- void *buf, void *end)
-+static int process_one_ticket(struct ceph_auth_client *ac,
-+ struct ceph_crypto_key *secret,
-+ void **p, void *end)
- {
- struct ceph_x_info *xi = ac->private;
-- int num;
-- void *p = buf;
-+ int type;
-+ u8 tkt_struct_v, blob_struct_v;
-+ struct ceph_x_ticket_handler *th;
-+ void *dbuf = NULL;
-+ void *dp, *dend;
-+ int dlen;
-+ char is_enc;
-+ struct timespec validity;
-+ struct ceph_crypto_key old_key;
-+ void *ticket_buf = NULL;
-+ void *tp, *tpend;
-+ struct ceph_timespec new_validity;
-+ struct ceph_crypto_key new_session_key;
-+ struct ceph_buffer *new_ticket_blob;
-+ unsigned long new_expires, new_renew_after;
-+ u64 new_secret_id;
- int ret;
-- char *dbuf;
-- char *ticket_buf;
-- u8 reply_struct_v;
-
-- dbuf = kmalloc(TEMP_TICKET_BUF_LEN, GFP_NOFS);
-- if (!dbuf)
-- return -ENOMEM;
-+ ceph_decode_need(p, end, sizeof(u32) + 1, bad);
-
-- ret = -ENOMEM;
-- ticket_buf = kmalloc(TEMP_TICKET_BUF_LEN, GFP_NOFS);
-- if (!ticket_buf)
-- goto out_dbuf;
-+ type = ceph_decode_32(p);
-+ dout(" ticket type %d %s\n", type, ceph_entity_type_name(type));
-
-- ceph_decode_need(&p, end, 1 + sizeof(u32), bad);
-- reply_struct_v = ceph_decode_8(&p);
-- if (reply_struct_v != 1)
-+ tkt_struct_v = ceph_decode_8(p);
-+ if (tkt_struct_v != 1)
- goto bad;
-- num = ceph_decode_32(&p);
-- dout("%d tickets\n", num);
-- while (num--) {
-- int type;
-- u8 tkt_struct_v, blob_struct_v;
-- struct ceph_x_ticket_handler *th;
-- void *dp, *dend;
-- int dlen;
-- char is_enc;
-- struct timespec validity;
-- struct ceph_crypto_key old_key;
-- void *tp, *tpend;
-- struct ceph_timespec new_validity;
-- struct ceph_crypto_key new_session_key;
-- struct ceph_buffer *new_ticket_blob;
-- unsigned long new_expires, new_renew_after;
-- u64 new_secret_id;
--
-- ceph_decode_need(&p, end, sizeof(u32) + 1, bad);
--
-- type = ceph_decode_32(&p);
-- dout(" ticket type %d %s\n", type, ceph_entity_type_name(type));
--
-- tkt_struct_v = ceph_decode_8(&p);
-- if (tkt_struct_v != 1)
-- goto bad;
--
-- th = get_ticket_handler(ac, type);
-- if (IS_ERR(th)) {
-- ret = PTR_ERR(th);
-- goto out;
-- }
-
-- /* blob for me */
-- dlen = ceph_x_decrypt(secret, &p, end, dbuf,
-- TEMP_TICKET_BUF_LEN);
-- if (dlen <= 0) {
-- ret = dlen;
-- goto out;
-- }
-- dout(" decrypted %d bytes\n", dlen);
-- dend = dbuf + dlen;
-- dp = dbuf;
-+ th = get_ticket_handler(ac, type);
-+ if (IS_ERR(th)) {
-+ ret = PTR_ERR(th);
-+ goto out;
-+ }
-
-- tkt_struct_v = ceph_decode_8(&dp);
-- if (tkt_struct_v != 1)
-- goto bad;
-+ /* blob for me */
-+ dlen = ceph_x_decrypt(secret, p, end, &dbuf, 0);
-+ if (dlen <= 0) {
-+ ret = dlen;
-+ goto out;
-+ }
-+ dout(" decrypted %d bytes\n", dlen);
-+ dp = dbuf;
-+ dend = dp + dlen;
-
-- memcpy(&old_key, &th->session_key, sizeof(old_key));
-- ret = ceph_crypto_key_decode(&new_session_key, &dp, dend);
-- if (ret)
-- goto out;
-+ tkt_struct_v = ceph_decode_8(&dp);
-+ if (tkt_struct_v != 1)
-+ goto bad;
-
-- ceph_decode_copy(&dp, &new_validity, sizeof(new_validity));
-- ceph_decode_timespec(&validity, &new_validity);
-- new_expires = get_seconds() + validity.tv_sec;
-- new_renew_after = new_expires - (validity.tv_sec / 4);
-- dout(" expires=%lu renew_after=%lu\n", new_expires,
-- new_renew_after);
-+ memcpy(&old_key, &th->session_key, sizeof(old_key));
-+ ret = ceph_crypto_key_decode(&new_session_key, &dp, dend);
-+ if (ret)
-+ goto out;
-
-- /* ticket blob for service */
-- ceph_decode_8_safe(&p, end, is_enc, bad);
-- tp = ticket_buf;
-- if (is_enc) {
-- /* encrypted */
-- dout(" encrypted ticket\n");
-- dlen = ceph_x_decrypt(&old_key, &p, end, ticket_buf,
-- TEMP_TICKET_BUF_LEN);
-- if (dlen < 0) {
-- ret = dlen;
-- goto out;
-- }
-- dlen = ceph_decode_32(&tp);
-- } else {
-- /* unencrypted */
-- ceph_decode_32_safe(&p, end, dlen, bad);
-- ceph_decode_need(&p, end, dlen, bad);
-- ceph_decode_copy(&p, ticket_buf, dlen);
-+ ceph_decode_copy(&dp, &new_validity, sizeof(new_validity));
-+ ceph_decode_timespec(&validity, &new_validity);
-+ new_expires = get_seconds() + validity.tv_sec;
-+ new_renew_after = new_expires - (validity.tv_sec / 4);
-+ dout(" expires=%lu renew_after=%lu\n", new_expires,
-+ new_renew_after);
-+
-+ /* ticket blob for service */
-+ ceph_decode_8_safe(p, end, is_enc, bad);
-+ if (is_enc) {
-+ /* encrypted */
-+ dout(" encrypted ticket\n");
-+ dlen = ceph_x_decrypt(&old_key, p, end, &ticket_buf, 0);
-+ if (dlen < 0) {
-+ ret = dlen;
-+ goto out;
- }
-- tpend = tp + dlen;
-- dout(" ticket blob is %d bytes\n", dlen);
-- ceph_decode_need(&tp, tpend, 1 + sizeof(u64), bad);
-- blob_struct_v = ceph_decode_8(&tp);
-- new_secret_id = ceph_decode_64(&tp);
-- ret = ceph_decode_buffer(&new_ticket_blob, &tp, tpend);
-- if (ret)
-+ tp = ticket_buf;
-+ dlen = ceph_decode_32(&tp);
-+ } else {
-+ /* unencrypted */
-+ ceph_decode_32_safe(p, end, dlen, bad);
-+ ticket_buf = kmalloc(dlen, GFP_NOFS);
-+ if (!ticket_buf) {
-+ ret = -ENOMEM;
- goto out;
--
-- /* all is well, update our ticket */
-- ceph_crypto_key_destroy(&th->session_key);
-- if (th->ticket_blob)
-- ceph_buffer_put(th->ticket_blob);
-- th->session_key = new_session_key;
-- th->ticket_blob = new_ticket_blob;
-- th->validity = new_validity;
-- th->secret_id = new_secret_id;
-- th->expires = new_expires;
-- th->renew_after = new_renew_after;
-- dout(" got ticket service %d (%s) secret_id %lld len %d\n",
-- type, ceph_entity_type_name(type), th->secret_id,
-- (int)th->ticket_blob->vec.iov_len);
-- xi->have_keys |= th->service;
-+ }
-+ tp = ticket_buf;
-+ ceph_decode_need(p, end, dlen, bad);
-+ ceph_decode_copy(p, ticket_buf, dlen);
- }
-+ tpend = tp + dlen;
-+ dout(" ticket blob is %d bytes\n", dlen);
-+ ceph_decode_need(&tp, tpend, 1 + sizeof(u64), bad);
-+ blob_struct_v = ceph_decode_8(&tp);
-+ new_secret_id = ceph_decode_64(&tp);
-+ ret = ceph_decode_buffer(&new_ticket_blob, &tp, tpend);
-+ if (ret)
-+ goto out;
-+
-+ /* all is well, update our ticket */
-+ ceph_crypto_key_destroy(&th->session_key);
-+ if (th->ticket_blob)
-+ ceph_buffer_put(th->ticket_blob);
-+ th->session_key = new_session_key;
-+ th->ticket_blob = new_ticket_blob;
-+ th->validity = new_validity;
-+ th->secret_id = new_secret_id;
-+ th->expires = new_expires;
-+ th->renew_after = new_renew_after;
-+ dout(" got ticket service %d (%s) secret_id %lld len %d\n",
-+ type, ceph_entity_type_name(type), th->secret_id,
-+ (int)th->ticket_blob->vec.iov_len);
-+ xi->have_keys |= th->service;
-
-- ret = 0;
- out:
- kfree(ticket_buf);
--out_dbuf:
- kfree(dbuf);
- return ret;
-
-@@ -270,6 +255,34 @@ bad:
- goto out;
- }
-
-+static int ceph_x_proc_ticket_reply(struct ceph_auth_client *ac,
-+ struct ceph_crypto_key *secret,
-+ void *buf, void *end)
-+{
-+ void *p = buf;
-+ u8 reply_struct_v;
-+ u32 num;
-+ int ret;
-+
-+ ceph_decode_8_safe(&p, end, reply_struct_v, bad);
-+ if (reply_struct_v != 1)
-+ return -EINVAL;
-+
-+ ceph_decode_32_safe(&p, end, num, bad);
-+ dout("%d tickets\n", num);
-+
-+ while (num--) {
-+ ret = process_one_ticket(ac, secret, &p, end);
-+ if (ret)
-+ return ret;
-+ }
-+
-+ return 0;
-+
-+bad:
-+ return -EINVAL;
-+}
-+
- static int ceph_x_build_authorizer(struct ceph_auth_client *ac,
- struct ceph_x_ticket_handler *th,
- struct ceph_x_authorizer *au)
-@@ -563,13 +576,14 @@ static int ceph_x_verify_authorizer_reply(struct ceph_auth_client *ac,
- struct ceph_x_ticket_handler *th;
- int ret = 0;
- struct ceph_x_authorize_reply reply;
-+ void *preply = &reply;
- void *p = au->reply_buf;
- void *end = p + sizeof(au->reply_buf);
-
- th = get_ticket_handler(ac, au->service);
- if (IS_ERR(th))
- return PTR_ERR(th);
-- ret = ceph_x_decrypt(&th->session_key, &p, end, &reply, sizeof(reply));
-+ ret = ceph_x_decrypt(&th->session_key, &p, end, &preply, sizeof(reply));
- if (ret < 0)
- return ret;
- if (ret != sizeof(reply))
-diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
-index 20ba2d5..7a239f0 100644
---- a/net/ceph/messenger.c
-+++ b/net/ceph/messenger.c
-@@ -2423,7 +2423,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
- m->footer.middle_crc = 0;
- m->footer.data_crc = 0;
- m->footer.flags = 0;
-- m->front_max = front_len;
-+ m->front_alloc_len = front_len;
- m->front_is_vmalloc = false;
- m->more_to_follow = false;
- m->ack_stamp = 0;
-@@ -2594,8 +2594,8 @@ EXPORT_SYMBOL(ceph_msg_last_put);
-
- void ceph_msg_dump(struct ceph_msg *msg)
- {
-- pr_debug("msg_dump %p (front_max %d nr_pages %d)\n", msg,
-- msg->front_max, msg->nr_pages);
-+ pr_debug("msg_dump %p (front_alloc_len %d nr_pages %d)\n", msg,
-+ msg->front_alloc_len, msg->nr_pages);
- print_hex_dump(KERN_DEBUG, "header: ",
- DUMP_PREFIX_OFFSET, 16, 1,
- &msg->hdr, sizeof(msg->hdr), true);
-diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
-index 0b62dea..0c0859b 100644
---- a/net/ceph/mon_client.c
-+++ b/net/ceph/mon_client.c
-@@ -150,7 +150,7 @@ static int __open_session(struct ceph_mon_client *monc)
- /* initiatiate authentication handshake */
- ret = ceph_auth_build_hello(monc->auth,
- monc->m_auth->front.iov_base,
-- monc->m_auth->front_max);
-+ monc->m_auth->front_alloc_len);
- __send_prepared_auth_request(monc, ret);
- } else {
- dout("open_session mon%d already open\n", monc->cur_mon);
-@@ -194,7 +194,7 @@ static void __send_subscribe(struct ceph_mon_client *monc)
- int num;
-
- p = msg->front.iov_base;
-- end = p + msg->front_max;
-+ end = p + msg->front_alloc_len;
-
- num = 1 + !!monc->want_next_osdmap + !!monc->want_mdsmap;
- ceph_encode_32(&p, num);
-@@ -860,7 +860,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc,
- ret = ceph_handle_auth_reply(monc->auth, msg->front.iov_base,
- msg->front.iov_len,
- monc->m_auth->front.iov_base,
-- monc->m_auth->front_max);
-+ monc->m_auth->front_alloc_len);
- if (ret < 0) {
- monc->client->auth_err = ret;
- wake_up_all(&monc->client->auth_wq);
-@@ -887,7 +887,7 @@ static int __validate_auth(struct ceph_mon_client *monc)
- return 0;
-
- ret = ceph_build_auth(monc->auth, monc->m_auth->front.iov_base,
-- monc->m_auth->front_max);
-+ monc->m_auth->front_alloc_len);
- if (ret <= 0)
- return ret; /* either an error, or no need to authenticate */
- __send_prepared_auth_request(monc, ret);
-@@ -987,7 +987,15 @@ static struct ceph_msg *mon_alloc_msg(struct ceph_connection *con,
- if (!m) {
- pr_info("alloc_msg unknown type %d\n", type);
- *skip = 1;
-+ } else if (front_len > m->front_alloc_len) {
-+ pr_warning("mon_alloc_msg front %d > prealloc %d (%u#%llu)\n",
-+ front_len, m->front_alloc_len,
-+ (unsigned int)con->peer_name.type,
-+ le64_to_cpu(con->peer_name.num));
-+ ceph_msg_put(m);
-+ m = ceph_msg_new(type, front_len, GFP_NOFS, false);
- }
-+
- return m;
- }
-
-diff --git a/net/ipv4/route.c b/net/ipv4/route.c
-index d361dc0..8e79a9e 100644
---- a/net/ipv4/route.c
-+++ b/net/ipv4/route.c
-@@ -151,6 +151,9 @@ static void ipv4_link_failure(struct sk_buff *skb);
- static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu);
- static int rt_garbage_collect(struct dst_ops *ops);
-
-+static void __rt_garbage_collect(struct work_struct *w);
-+static DECLARE_WORK(rt_gc_worker, __rt_garbage_collect);
-+
- static void ipv4_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
- int how)
- {
-@@ -979,12 +982,13 @@ static void rt_emergency_hash_rebuild(struct net *net)
- and when load increases it reduces to limit cache size.
- */
-
--static int rt_garbage_collect(struct dst_ops *ops)
-+static void __do_rt_garbage_collect(int elasticity, int min_interval)
- {
- static unsigned long expire = RT_GC_TIMEOUT;
- static unsigned long last_gc;
- static int rover;
- static int equilibrium;
-+ static DEFINE_SPINLOCK(rt_gc_lock);
- struct rtable *rth;
- struct rtable __rcu **rthp;
- unsigned long now = jiffies;
-@@ -996,9 +1000,11 @@ static int rt_garbage_collect(struct dst_ops *ops)
- * do not make it too frequently.
- */
-
-+ spin_lock_bh(&rt_gc_lock);
-+
- RT_CACHE_STAT_INC(gc_total);
-
-- if (now - last_gc < ip_rt_gc_min_interval &&
-+ if (now - last_gc < min_interval &&
- entries < ip_rt_max_size) {
- RT_CACHE_STAT_INC(gc_ignored);
- goto out;
-@@ -1006,7 +1012,7 @@ static int rt_garbage_collect(struct dst_ops *ops)
-
- entries = dst_entries_get_slow(&ipv4_dst_ops);
- /* Calculate number of entries, which we want to expire now. */
-- goal = entries - (ip_rt_gc_elasticity << rt_hash_log);
-+ goal = entries - (elasticity << rt_hash_log);
- if (goal <= 0) {
- if (equilibrium < ipv4_dst_ops.gc_thresh)
- equilibrium = ipv4_dst_ops.gc_thresh;
-@@ -1023,7 +1029,7 @@ static int rt_garbage_collect(struct dst_ops *ops)
- equilibrium = entries - goal;
- }
-
-- if (now - last_gc >= ip_rt_gc_min_interval)
-+ if (now - last_gc >= min_interval)
- last_gc = now;
-
- if (goal <= 0) {
-@@ -1088,15 +1094,34 @@ static int rt_garbage_collect(struct dst_ops *ops)
- if (net_ratelimit())
- printk(KERN_WARNING "dst cache overflow\n");
- RT_CACHE_STAT_INC(gc_dst_overflow);
-- return 1;
-+ goto out;
-
- work_done:
-- expire += ip_rt_gc_min_interval;
-+ expire += min_interval;
- if (expire > ip_rt_gc_timeout ||
- dst_entries_get_fast(&ipv4_dst_ops) < ipv4_dst_ops.gc_thresh ||
- dst_entries_get_slow(&ipv4_dst_ops) < ipv4_dst_ops.gc_thresh)
- expire = ip_rt_gc_timeout;
--out: return 0;
-+out:
-+ spin_unlock_bh(&rt_gc_lock);
-+}
-+
-+static void __rt_garbage_collect(struct work_struct *w)
-+{
-+ __do_rt_garbage_collect(ip_rt_gc_elasticity, ip_rt_gc_min_interval);
-+}
-+
-+static int rt_garbage_collect(struct dst_ops *ops)
-+{
-+ if (!work_pending(&rt_gc_worker))
-+ schedule_work(&rt_gc_worker);
-+
-+ if (dst_entries_get_fast(&ipv4_dst_ops) >= ip_rt_max_size ||
-+ dst_entries_get_slow(&ipv4_dst_ops) >= ip_rt_max_size) {
-+ RT_CACHE_STAT_INC(gc_dst_overflow);
-+ return 1;
-+ }
-+ return 0;
- }
-
- /*
-@@ -1153,7 +1178,7 @@ static struct rtable *rt_intern_hash(unsigned hash, struct rtable *rt,
- unsigned long now;
- u32 min_score;
- int chain_length;
-- int attempts = !in_softirq();
-+ int attempts = 1;
-
- restart:
- chain_length = 0;
-@@ -1290,14 +1315,15 @@ restart:
- can be released. Try to shrink route cache,
- it is most likely it holds some neighbour records.
- */
-- if (attempts-- > 0) {
-- int saved_elasticity = ip_rt_gc_elasticity;
-- int saved_int = ip_rt_gc_min_interval;
-- ip_rt_gc_elasticity = 1;
-- ip_rt_gc_min_interval = 0;
-- rt_garbage_collect(&ipv4_dst_ops);
-- ip_rt_gc_min_interval = saved_int;
-- ip_rt_gc_elasticity = saved_elasticity;
-+ if (!in_softirq() && attempts-- > 0) {
-+ static DEFINE_SPINLOCK(lock);
-+
-+ if (spin_trylock(&lock)) {
-+ __do_rt_garbage_collect(1, 0);
-+ spin_unlock(&lock);
-+ } else {
-+ spin_unlock_wait(&lock);
-+ }
- goto restart;
- }
-
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index b9edff0..3afdd78 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -2443,8 +2443,18 @@ static void init_loopback(struct net_device *dev)
- if (sp_ifa->flags & (IFA_F_DADFAILED | IFA_F_TENTATIVE))
- continue;
-
-- if (sp_ifa->rt)
-- continue;
-+ if (sp_ifa->rt) {
-+ /* This dst has been added to garbage list when
-+ * lo device down, release this obsolete dst and
-+ * reallocate a new router for ifa.
-+ */
-+ if (sp_ifa->rt->dst.obsolete > 0) {
-+ dst_release(&sp_ifa->rt->dst);
-+ sp_ifa->rt = NULL;
-+ } else {
-+ continue;
-+ }
-+ }
-
- sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0);
-
-diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
-index f8bec1e..d131a95 100644
---- a/net/ipv6/udp.c
-+++ b/net/ipv6/udp.c
-@@ -1362,7 +1362,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features)
- fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen);
- fptr->nexthdr = nexthdr;
- fptr->reserved = 0;
-- ipv6_select_ident(fptr, (struct rt6_info *)skb_dst(skb));
-+ fptr->identification = skb_shinfo(skb)->ip6_frag_id;
-
- /* Fragment the skb. ipv6 header and the remaining fields of the
- * fragment header are updated in ipv6_gso_segment()
-diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
-index 437fb59..767bf4a 100644
---- a/net/l2tp/l2tp_ppp.c
-+++ b/net/l2tp/l2tp_ppp.c
-@@ -774,7 +774,8 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
- /* If PMTU discovery was enabled, use the MTU that was discovered */
- dst = sk_dst_get(tunnel->sock);
- if (dst != NULL) {
-- u32 pmtu = dst_mtu(__sk_dst_get(tunnel->sock));
-+ u32 pmtu = dst_mtu(dst);
-+
- if (pmtu != 0)
- session->mtu = session->mru = pmtu -
- PPPOL2TP_HEADER_OVERHEAD;
-diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
-index 29fa5ba..6422845 100644
---- a/net/netfilter/ipvs/ip_vs_conn.c
-+++ b/net/netfilter/ipvs/ip_vs_conn.c
-@@ -777,7 +777,6 @@ static void ip_vs_conn_expire(unsigned long data)
- ip_vs_control_del(cp);
-
- if (cp->flags & IP_VS_CONN_F_NFCT) {
-- ip_vs_conn_drop_conntrack(cp);
- /* Do not access conntracks during subsys cleanup
- * because nf_conntrack_find_get can not be used after
- * conntrack cleanup for the net.
-diff --git a/net/sctp/associola.c b/net/sctp/associola.c
-index da54d29..5b2d8e6 100644
---- a/net/sctp/associola.c
-+++ b/net/sctp/associola.c
-@@ -1638,6 +1638,8 @@ struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
- * ack chunk whose serial number matches that of the request.
- */
- list_for_each_entry(ack, &asoc->asconf_ack_list, transmitted_list) {
-+ if (sctp_chunk_pending(ack))
-+ continue;
- if (ack->subh.addip_hdr->serial == serial) {
- sctp_chunk_hold(ack);
- return ack;
-diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c
-index 397296f..32421ae 100644
---- a/net/sctp/inqueue.c
-+++ b/net/sctp/inqueue.c
-@@ -152,18 +152,9 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
- } else {
- /* Nothing to do. Next chunk in the packet, please. */
- ch = (sctp_chunkhdr_t *) chunk->chunk_end;
--
- /* Force chunk->skb->data to chunk->chunk_end. */
-- skb_pull(chunk->skb,
-- chunk->chunk_end - chunk->skb->data);
--
-- /* Verify that we have at least chunk headers
-- * worth of buffer left.
-- */
-- if (skb_headlen(chunk->skb) < sizeof(sctp_chunkhdr_t)) {
-- sctp_chunk_free(chunk);
-- chunk = queue->in_progress = NULL;
-- }
-+ skb_pull(chunk->skb, chunk->chunk_end - chunk->skb->data);
-+ /* We are guaranteed to pull a SCTP header. */
- }
- }
-
-@@ -199,24 +190,14 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
- skb_pull(chunk->skb, sizeof(sctp_chunkhdr_t));
- chunk->subh.v = NULL; /* Subheader is no longer valid. */
-
-- if (chunk->chunk_end < skb_tail_pointer(chunk->skb)) {
-+ if (chunk->chunk_end + sizeof(sctp_chunkhdr_t) <
-+ skb_tail_pointer(chunk->skb)) {
- /* This is not a singleton */
- chunk->singleton = 0;
- } else if (chunk->chunk_end > skb_tail_pointer(chunk->skb)) {
-- /* RFC 2960, Section 6.10 Bundling
-- *
-- * Partial chunks MUST NOT be placed in an SCTP packet.
-- * If the receiver detects a partial chunk, it MUST drop
-- * the chunk.
-- *
-- * Since the end of the chunk is past the end of our buffer
-- * (which contains the whole packet, we can freely discard
-- * the whole packet.
-- */
-- sctp_chunk_free(chunk);
-- chunk = queue->in_progress = NULL;
--
-- return NULL;
-+ /* Discard inside state machine. */
-+ chunk->pdiscard = 1;
-+ chunk->chunk_end = skb_tail_pointer(chunk->skb);
- } else {
- /* We are at the end of the packet, so mark the chunk
- * in case we need to send a SACK.
-diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
-index c95a3f2..d8d4704 100644
---- a/net/sctp/sm_make_chunk.c
-+++ b/net/sctp/sm_make_chunk.c
-@@ -3068,50 +3068,63 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
- return SCTP_ERROR_NO_ERROR;
- }
-
--/* Verify the ASCONF packet before we process it. */
--int sctp_verify_asconf(const struct sctp_association *asoc,
-- struct sctp_paramhdr *param_hdr, void *chunk_end,
-- struct sctp_paramhdr **errp) {
-- sctp_addip_param_t *asconf_param;
-+/* Verify the ASCONF packet before we process it. */
-+bool sctp_verify_asconf(const struct sctp_association *asoc,
-+ struct sctp_chunk *chunk, bool addr_param_needed,
-+ struct sctp_paramhdr **errp)
-+{
-+ sctp_addip_chunk_t *addip = (sctp_addip_chunk_t *) chunk->chunk_hdr;
- union sctp_params param;
-- int length, plen;
--
-- param.v = (sctp_paramhdr_t *) param_hdr;
-- while (param.v <= chunk_end - sizeof(sctp_paramhdr_t)) {
-- length = ntohs(param.p->length);
-- *errp = param.p;
-+ bool addr_param_seen = false;
-
-- if (param.v > chunk_end - length ||
-- length < sizeof(sctp_paramhdr_t))
-- return 0;
-+ sctp_walk_params(param, addip, addip_hdr.params) {
-+ size_t length = ntohs(param.p->length);
-
-+ *errp = param.p;
- switch (param.p->type) {
-+ case SCTP_PARAM_ERR_CAUSE:
-+ break;
-+ case SCTP_PARAM_IPV4_ADDRESS:
-+ if (length != sizeof(sctp_ipv4addr_param_t))
-+ return false;
-+ addr_param_seen = true;
-+ break;
-+ case SCTP_PARAM_IPV6_ADDRESS:
-+ if (length != sizeof(sctp_ipv6addr_param_t))
-+ return false;
-+ addr_param_seen = true;
-+ break;
- case SCTP_PARAM_ADD_IP:
- case SCTP_PARAM_DEL_IP:
- case SCTP_PARAM_SET_PRIMARY:
-- asconf_param = (sctp_addip_param_t *)param.v;
-- plen = ntohs(asconf_param->param_hdr.length);
-- if (plen < sizeof(sctp_addip_param_t) +
-- sizeof(sctp_paramhdr_t))
-- return 0;
-+ /* In ASCONF chunks, these need to be first. */
-+ if (addr_param_needed && !addr_param_seen)
-+ return false;
-+ length = ntohs(param.addip->param_hdr.length);
-+ if (length < sizeof(sctp_addip_param_t) +
-+ sizeof(sctp_paramhdr_t))
-+ return false;
- break;
- case SCTP_PARAM_SUCCESS_REPORT:
- case SCTP_PARAM_ADAPTATION_LAYER_IND:
- if (length != sizeof(sctp_addip_param_t))
-- return 0;
--
-+ return false;
- break;
- default:
-- break;
-+ /* This is unkown to us, reject! */
-+ return false;
- }
--
-- param.v += WORD_ROUND(length);
- }
-
-- if (param.v != chunk_end)
-- return 0;
-+ /* Remaining sanity checks. */
-+ if (addr_param_needed && !addr_param_seen)
-+ return false;
-+ if (!addr_param_needed && addr_param_seen)
-+ return false;
-+ if (param.v != chunk->chunk_end)
-+ return false;
-
-- return 1;
-+ return true;
- }
-
- /* Process an incoming ASCONF chunk with the next expected serial no. and
-@@ -3120,16 +3133,17 @@ int sctp_verify_asconf(const struct sctp_association *asoc,
- struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
- struct sctp_chunk *asconf)
- {
-+ sctp_addip_chunk_t *addip = (sctp_addip_chunk_t *) asconf->chunk_hdr;
-+ bool all_param_pass = true;
-+ union sctp_params param;
- sctp_addiphdr_t *hdr;
- union sctp_addr_param *addr_param;
- sctp_addip_param_t *asconf_param;
- struct sctp_chunk *asconf_ack;
--
- __be16 err_code;
- int length = 0;
- int chunk_len;
- __u32 serial;
-- int all_param_pass = 1;
-
- chunk_len = ntohs(asconf->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
- hdr = (sctp_addiphdr_t *)asconf->skb->data;
-@@ -3157,9 +3171,14 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
- goto done;
-
- /* Process the TLVs contained within the ASCONF chunk. */
-- while (chunk_len > 0) {
-+ sctp_walk_params(param, addip, addip_hdr.params) {
-+ /* Skip preceeding address parameters. */
-+ if (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
-+ param.p->type == SCTP_PARAM_IPV6_ADDRESS)
-+ continue;
-+
- err_code = sctp_process_asconf_param(asoc, asconf,
-- asconf_param);
-+ param.addip);
- /* ADDIP 4.1 A7)
- * If an error response is received for a TLV parameter,
- * all TLVs with no response before the failed TLV are
-@@ -3167,28 +3186,20 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
- * the failed response are considered unsuccessful unless
- * a specific success indication is present for the parameter.
- */
-- if (SCTP_ERROR_NO_ERROR != err_code)
-- all_param_pass = 0;
--
-+ if (err_code != SCTP_ERROR_NO_ERROR)
-+ all_param_pass = false;
- if (!all_param_pass)
-- sctp_add_asconf_response(asconf_ack,
-- asconf_param->crr_id, err_code,
-- asconf_param);
-+ sctp_add_asconf_response(asconf_ack, param.addip->crr_id,
-+ err_code, param.addip);
-
- /* ADDIP 4.3 D11) When an endpoint receiving an ASCONF to add
- * an IP address sends an 'Out of Resource' in its response, it
- * MUST also fail any subsequent add or delete requests bundled
- * in the ASCONF.
- */
-- if (SCTP_ERROR_RSRC_LOW == err_code)
-+ if (err_code == SCTP_ERROR_RSRC_LOW)
- goto done;
--
-- /* Move to the next ASCONF param. */
-- length = ntohs(asconf_param->param_hdr.length);
-- asconf_param = (void *)asconf_param + length;
-- chunk_len -= length;
- }
--
- done:
- asoc->peer.addip_serial++;
-
-diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
-index 5ac33b6..d02dd3c 100644
---- a/net/sctp/sm_statefuns.c
-+++ b/net/sctp/sm_statefuns.c
-@@ -163,6 +163,9 @@ sctp_chunk_length_valid(struct sctp_chunk *chunk,
- {
- __u16 chunk_length = ntohs(chunk->chunk_hdr->length);
-
-+ /* Previously already marked? */
-+ if (unlikely(chunk->pdiscard))
-+ return 0;
- if (unlikely(chunk_length < required_length))
- return 0;
-
-@@ -3516,9 +3519,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
- struct sctp_chunk *asconf_ack = NULL;
- struct sctp_paramhdr *err_param = NULL;
- sctp_addiphdr_t *hdr;
-- union sctp_addr_param *addr_param;
- __u32 serial;
-- int length;
-
- if (!sctp_vtag_verify(chunk, asoc)) {
- sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
-@@ -3543,17 +3544,8 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
- hdr = (sctp_addiphdr_t *)chunk->skb->data;
- serial = ntohl(hdr->serial);
-
-- addr_param = (union sctp_addr_param *)hdr->params;
-- length = ntohs(addr_param->p.length);
-- if (length < sizeof(sctp_paramhdr_t))
-- return sctp_sf_violation_paramlen(ep, asoc, type, arg,
-- (void *)addr_param, commands);
--
- /* Verify the ASCONF chunk before processing it. */
-- if (!sctp_verify_asconf(asoc,
-- (sctp_paramhdr_t *)((void *)addr_param + length),
-- (void *)chunk->chunk_end,
-- &err_param))
-+ if (!sctp_verify_asconf(asoc, chunk, true, &err_param))
- return sctp_sf_violation_paramlen(ep, asoc, type, arg,
- (void *)err_param, commands);
-
-@@ -3670,10 +3662,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
- rcvd_serial = ntohl(addip_hdr->serial);
-
- /* Verify the ASCONF-ACK chunk before processing it. */
-- if (!sctp_verify_asconf(asoc,
-- (sctp_paramhdr_t *)addip_hdr->params,
-- (void *)asconf_ack->chunk_end,
-- &err_param))
-+ if (!sctp_verify_asconf(asoc, asconf_ack, false, &err_param))
- return sctp_sf_violation_paramlen(ep, asoc, type, arg,
- (void *)err_param, commands);
-
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 6d4d263..cdf77a2 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -4804,6 +4804,9 @@ int cfg80211_testmode_reply(struct sk_buff *skb)
- void *hdr = ((void **)skb->cb)[1];
- struct nlattr *data = ((void **)skb->cb)[2];
-
-+ /* clear CB data for netlink core to own from now on */
-+ memset(skb->cb, 0, sizeof(skb->cb));
-+
- if (WARN_ON(!rdev->testmode_info)) {
- kfree_skb(skb);
- return -EINVAL;
-@@ -4830,6 +4833,9 @@ void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
- void *hdr = ((void **)skb->cb)[1];
- struct nlattr *data = ((void **)skb->cb)[2];
-
-+ /* clear CB data for netlink core to own from now on */
-+ memset(skb->cb, 0, sizeof(skb->cb));
-+
- nla_nest_end(skb, data);
- genlmsg_end(skb, hdr);
- genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0,
-diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
-index cf0d46e..7f00d34 100644
---- a/sound/core/pcm_lib.c
-+++ b/sound/core/pcm_lib.c
-@@ -1692,14 +1692,16 @@ static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
- {
- struct snd_pcm_hw_params *params = arg;
- snd_pcm_format_t format;
-- int channels, width;
-+ int channels;
-+ ssize_t frame_size;
-
- params->fifo_size = substream->runtime->hw.fifo_size;
- if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) {
- format = params_format(params);
- channels = params_channels(params);
-- width = snd_pcm_format_physical_width(format);
-- params->fifo_size /= width * channels;
-+ frame_size = snd_pcm_format_size(format, channels);
-+ if (frame_size > 0)
-+ params->fifo_size /= (unsigned)frame_size;
- }
- return 0;
- }
-diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index 491cdf0..d10a6ef 100644
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -789,6 +789,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)
- case 0x10ec0885:
- case 0x10ec0887:
- /*case 0x10ec0889:*/ /* this causes an SPDIF problem */
-+ case 0x10ec0900:
- alc889_coef_init(codec);
- break;
- case 0x10ec0888:
-@@ -4343,6 +4344,7 @@ static int patch_alc882(struct hda_codec *codec)
- switch (codec->vendor_id) {
- case 0x10ec0882:
- case 0x10ec0885:
-+ case 0x10ec0900:
- break;
- default:
- /* ALC883 and variants */