commit:     ded0e93a7c02f03de989cd13e4ae60e72db41e34
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Apr 12 19:01:43 2016 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Apr 12 19:01:43 2016 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=ded0e93a

Linux patch 3.14.66

 0000_README              |    4 +
 1065_linux-3.14.66.patch | 2248 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2252 insertions(+)

diff --git a/0000_README b/0000_README
index 1a5cf2c..ef1c717 100644
--- a/0000_README
+++ b/0000_README
@@ -302,6 +302,10 @@ Patch:  1064_linux-3.14.65.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.14.65
 
+Patch:  1065_linux-3.14.66.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.14.66
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1065_linux-3.14.66.patch b/1065_linux-3.14.66.patch
new file mode 100644
index 0000000..7abdb61
--- /dev/null
+++ b/1065_linux-3.14.66.patch
@@ -0,0 +1,2248 @@
+diff --git a/Makefile b/Makefile
+index a19c22a77728..9053bda13f60 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 14
+-SUBLEVEL = 65
++SUBLEVEL = 66
+ EXTRAVERSION =
+ NAME = Remembering Coco
+ 
+diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
+index 29880c9b324e..e22e57298522 100644
+--- a/arch/um/drivers/mconsole_kern.c
++++ b/arch/um/drivers/mconsole_kern.c
+@@ -133,7 +133,7 @@ void mconsole_proc(struct mc_request *req)
+       ptr += strlen("proc");
+       ptr = skip_spaces(ptr);
+ 
+-      file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY);
++      file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY, 0);
+       if (IS_ERR(file)) {
+               mconsole_reply(req, "Failed to open file", 1, 0);
+               printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file));
+diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
+index 1d2091a226bc..29559831c94f 100644
+--- a/arch/x86/include/asm/apic.h
++++ b/arch/x86/include/asm/apic.h
+@@ -699,8 +699,8 @@ static inline void entering_irq(void)
+ 
+ static inline void entering_ack_irq(void)
+ {
+-      ack_APIC_irq();
+       entering_irq();
++      ack_APIC_irq();
+ }
+ 
+ static inline void exiting_irq(void)
+diff --git a/arch/x86/kernel/cpu/perf_event.h 
b/arch/x86/kernel/cpu/perf_event.h
+index 7876c346ed1a..a614543d3ef5 100644
+--- a/arch/x86/kernel/cpu/perf_event.h
++++ b/arch/x86/kernel/cpu/perf_event.h
+@@ -445,6 +445,7 @@ struct x86_pmu {
+                       pebs_active     :1,
+                       pebs_broken     :1;
+       int             pebs_record_size;
++      int             pebs_buffer_size;
+       void            (*drain_pebs)(struct pt_regs *regs);
+       struct event_constraint *pebs_constraints;
+       void            (*pebs_aliases)(struct perf_event *event);
+@@ -703,6 +704,8 @@ void intel_pmu_lbr_init_atom(void);
+ 
+ void intel_pmu_lbr_init_snb(void);
+ 
++void intel_pmu_pebs_data_source_nhm(void);
++
+ int intel_pmu_setup_lbr_filter(struct perf_event *event);
+ 
+ int p4_pmu_init(void);
+diff --git a/arch/x86/kernel/cpu/perf_event_intel.c 
b/arch/x86/kernel/cpu/perf_event_intel.c
+index d4c0a0e46040..61cd5200608d 100644
+--- a/arch/x86/kernel/cpu/perf_event_intel.c
++++ b/arch/x86/kernel/cpu/perf_event_intel.c
+@@ -2411,6 +2411,7 @@ __init int intel_pmu_init(void)
+               intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] =
+                       X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1);
+ 
++              intel_pmu_pebs_data_source_nhm();
+               x86_add_quirk(intel_nehalem_quirk);
+ 
+               pr_cont("Nehalem events, ");
+@@ -2472,6 +2473,7 @@ __init int intel_pmu_init(void)
+               intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] =
+                       X86_CONFIG(.event=0xb1, .umask=0x3f, .inv=1, .cmask=1);
+ 
++              intel_pmu_pebs_data_source_nhm();
+               pr_cont("Westmere events, ");
+               break;
+ 
+diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c 
b/arch/x86/kernel/cpu/perf_event_intel_ds.c
+index ae96cfa5eddd..da5f0b60a716 100644
+--- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
++++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
+@@ -51,7 +51,8 @@ union intel_x86_pebs_dse {
+ #define OP_LH (P(OP, LOAD) | P(LVL, HIT))
+ #define SNOOP_NONE_MISS (P(SNOOP, NONE) | P(SNOOP, MISS))
+ 
+-static const u64 pebs_data_source[] = {
++/* Version for Sandy Bridge and later */
++static u64 pebs_data_source[] = {
+       P(OP, LOAD) | P(LVL, MISS) | P(LVL, L3) | P(SNOOP, NA),/* 0x00:ukn L3 */
+       OP_LH | P(LVL, L1)  | P(SNOOP, NONE),   /* 0x01: L1 local */
+       OP_LH | P(LVL, LFB) | P(SNOOP, NONE),   /* 0x02: LFB hit */
+@@ -70,6 +71,14 @@ static const u64 pebs_data_source[] = {
+       OP_LH | P(LVL, UNC) | P(SNOOP, NONE), /* 0x0f: uncached */
+ };
+ 
++/* Patch up minor differences in the bits */
++void __init intel_pmu_pebs_data_source_nhm(void)
++{
++      pebs_data_source[0x05] = OP_LH | P(LVL, L3)  | P(SNOOP, HIT);
++      pebs_data_source[0x06] = OP_LH | P(LVL, L3)  | P(SNOOP, HITM);
++      pebs_data_source[0x07] = OP_LH | P(LVL, L3)  | P(SNOOP, HITM);
++}
++
+ static u64 precise_store_data(u64 status)
+ {
+       union intel_x86_pebs_dse dse;
+@@ -241,7 +250,7 @@ static int alloc_pebs_buffer(int cpu)
+       if (!x86_pmu.pebs)
+               return 0;
+ 
+-      buffer = kzalloc_node(PEBS_BUFFER_SIZE, GFP_KERNEL, node);
++      buffer = kzalloc_node(x86_pmu.pebs_buffer_size, GFP_KERNEL, node);
+       if (unlikely(!buffer))
+               return -ENOMEM;
+ 
+@@ -258,7 +267,7 @@ static int alloc_pebs_buffer(int cpu)
+               per_cpu(insn_buffer, cpu) = ibuffer;
+       }
+ 
+-      max = PEBS_BUFFER_SIZE / x86_pmu.pebs_record_size;
++      max = x86_pmu.pebs_buffer_size / x86_pmu.pebs_record_size;
+ 
+       ds->pebs_buffer_base = (u64)(unsigned long)buffer;
+       ds->pebs_index = ds->pebs_buffer_base;
+@@ -1047,6 +1056,7 @@ void intel_ds_init(void)
+ 
+       x86_pmu.bts  = boot_cpu_has(X86_FEATURE_BTS);
+       x86_pmu.pebs = boot_cpu_has(X86_FEATURE_PEBS);
++      x86_pmu.pebs_buffer_size = PEBS_BUFFER_SIZE;
+       if (x86_pmu.pebs) {
+               char pebs_type = x86_pmu.intel_cap.pebs_trap ?  '+' : '-';
+               int format = x86_pmu.intel_cap.pebs_format;
+@@ -1055,6 +1065,14 @@ void intel_ds_init(void)
+               case 0:
+                       printk(KERN_CONT "PEBS fmt0%c, ", pebs_type);
+                       x86_pmu.pebs_record_size = sizeof(struct 
pebs_record_core);
++                      /*
++                       * Using >PAGE_SIZE buffers makes the WRMSR to
++                       * PERF_GLOBAL_CTRL in intel_pmu_enable_all()
++                       * mysteriously hang on Core2.
++                       *
++                       * As a workaround, we don't do this.
++                       */
++                      x86_pmu.pebs_buffer_size = PAGE_SIZE;
+                       x86_pmu.drain_pebs = intel_pmu_drain_pebs_core;
+                       break;
+ 
+diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
+index 4ddaf66ea35f..792621a32457 100644
+--- a/arch/x86/kernel/ioport.c
++++ b/arch/x86/kernel/ioport.c
+@@ -96,9 +96,14 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned 
long num, int turn_on)
+ SYSCALL_DEFINE1(iopl, unsigned int, level)
+ {
+       struct pt_regs *regs = current_pt_regs();
+-      unsigned int old = (regs->flags >> 12) & 3;
+       struct thread_struct *t = &current->thread;
+ 
++      /*
++       * Careful: the IOPL bits in regs->flags are undefined under Xen PV
++       * and changing them has no effect.
++       */
++      unsigned int old = t->iopl >> X86_EFLAGS_IOPL_BIT;
++
+       if (level > 3)
+               return -EINVAL;
+       /* Trying to gain more privileges? */
+@@ -106,8 +111,9 @@ SYSCALL_DEFINE1(iopl, unsigned int, level)
+               if (!capable(CAP_SYS_RAWIO))
+                       return -EPERM;
+       }
+-      regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
+-      t->iopl = level << 12;
++      regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) |
++              (level << X86_EFLAGS_IOPL_BIT);
++      t->iopl = level << X86_EFLAGS_IOPL_BIT;
+       set_iopl_mask(t->iopl);
+ 
+       return 0;
+diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c
+index 1406ffde3e35..b0a706d063cb 100644
+--- a/arch/x86/kvm/i8254.c
++++ b/arch/x86/kvm/i8254.c
+@@ -244,7 +244,7 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier 
*kian)
+                * PIC is being reset.  Handle it gracefully here
+                */
+               atomic_inc(&ps->pending);
+-      else if (value > 0)
++      else if (value > 0 && ps->reinject)
+               /* in this case, we had multiple outstanding pit interrupts
+                * that we needed to inject.  Reinject
+                */
+@@ -287,7 +287,9 @@ static void pit_do_work(struct kthread_work *work)
+        * last one has been acked.
+        */
+       spin_lock(&ps->inject_lock);
+-      if (ps->irq_ack) {
++      if (!ps->reinject)
++              inject = 1;
++      else if (ps->irq_ack) {
+               ps->irq_ack = 0;
+               inject = 1;
+       }
+@@ -316,10 +318,10 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer 
*data)
+       struct kvm_kpit_state *ps = container_of(data, struct kvm_kpit_state, 
timer);
+       struct kvm_pit *pt = ps->kvm->arch.vpit;
+ 
+-      if (ps->reinject || !atomic_read(&ps->pending)) {
++      if (ps->reinject)
+               atomic_inc(&ps->pending);
+-              queue_kthread_work(&pt->worker, &pt->expired);
+-      }
++
++      queue_kthread_work(&pt->worker, &pt->expired);
+ 
+       if (ps->is_periodic) {
+               hrtimer_add_expires_ns(&ps->timer, ps->period);
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index b6fc5fc64cef..397a3ec62f78 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -6423,6 +6423,7 @@ static int handle_invept(struct kvm_vcpu *vcpu)
+       if (!(types & (1UL << type))) {
+               nested_vmx_failValid(vcpu,
+                               VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
++              skip_emulated_instruction(vcpu);
+               return 1;
+       }
+ 
+diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S
+index aeeb3cc8a410..288b61f080fe 100644
+--- a/arch/xtensa/kernel/head.S
++++ b/arch/xtensa/kernel/head.S
+@@ -123,7 +123,7 @@ ENTRY(_startup)
+       wsr     a0, icountlevel
+ 
+       .set    _index, 0
+-      .rept   XCHAL_NUM_DBREAK - 1
++      .rept   XCHAL_NUM_DBREAK
+       wsr     a0, SREG_DBREAKC + _index
+       .set    _index, _index + 1
+       .endr
+diff --git a/arch/xtensa/platforms/iss/console.c 
b/arch/xtensa/platforms/iss/console.c
+index 70cb408bc20d..92d785fefb6d 100644
+--- a/arch/xtensa/platforms/iss/console.c
++++ b/arch/xtensa/platforms/iss/console.c
+@@ -100,21 +100,23 @@ static void rs_poll(unsigned long priv)
+ {
+       struct tty_port *port = (struct tty_port *)priv;
+       int i = 0;
++      int rd = 1;
+       unsigned char c;
+ 
+       spin_lock(&timer_lock);
+ 
+       while (simc_poll(0)) {
+-              simc_read(0, &c, 1);
++              rd = simc_read(0, &c, 1);
++              if (rd <= 0)
++                      break;
+               tty_insert_flip_char(port, c, TTY_NORMAL);
+               i++;
+       }
+ 
+       if (i)
+               tty_flip_buffer_push(port);
+-
+-
+-      mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
++      if (rd)
++              mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
+       spin_unlock(&timer_lock);
+ }
+ 
+diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
+index 2a09de8d6d71..6be90f0b3730 100644
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -81,6 +81,7 @@ static const struct usb_device_id ath3k_table[] = {
+       { USB_DEVICE(0x0489, 0xe05f) },
+       { USB_DEVICE(0x0489, 0xe076) },
+       { USB_DEVICE(0x0489, 0xe078) },
++      { USB_DEVICE(0x0489, 0xe095) },
+       { USB_DEVICE(0x04c5, 0x1330) },
+       { USB_DEVICE(0x04CA, 0x3004) },
+       { USB_DEVICE(0x04CA, 0x3005) },
+@@ -89,6 +90,7 @@ static const struct usb_device_id ath3k_table[] = {
+       { USB_DEVICE(0x04CA, 0x3008) },
+       { USB_DEVICE(0x04CA, 0x300b) },
+       { USB_DEVICE(0x04CA, 0x3010) },
++      { USB_DEVICE(0x04CA, 0x3014) },
+       { USB_DEVICE(0x0930, 0x0219) },
+       { USB_DEVICE(0x0930, 0x021c) },
+       { USB_DEVICE(0x0930, 0x0220) },
+@@ -109,9 +111,11 @@ static const struct usb_device_id ath3k_table[] = {
+       { USB_DEVICE(0x13d3, 0x3362) },
+       { USB_DEVICE(0x13d3, 0x3375) },
+       { USB_DEVICE(0x13d3, 0x3393) },
++      { USB_DEVICE(0x13d3, 0x3395) },
+       { USB_DEVICE(0x13d3, 0x3402) },
+       { USB_DEVICE(0x13d3, 0x3408) },
+       { USB_DEVICE(0x13d3, 0x3432) },
++      { USB_DEVICE(0x13d3, 0x3472) },
+       { USB_DEVICE(0x13d3, 0x3474) },
+ 
+       /* Atheros AR5BBU12 with sflash firmware */
+@@ -139,6 +143,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
+       { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
+@@ -147,6 +152,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
+       { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
+@@ -167,9 +173,11 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
+       { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
+ 
+       /* Atheros AR5BBU22 with sflash firmware */
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index 5d5e99902475..8b82282bab8a 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -159,6 +159,7 @@ static const struct usb_device_id blacklist_table[] = {
+       { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
+@@ -167,6 +168,7 @@ static const struct usb_device_id blacklist_table[] = {
+       { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
+@@ -187,9 +189,11 @@ static const struct usb_device_id blacklist_table[] = {
+       { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
+ 
+       /* Atheros AR5BBU12 with sflash firmware */
+diff --git a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c 
b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
+index 8e162ad82085..5c93afb1841a 100644
+--- a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
++++ b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c
+@@ -201,6 +201,39 @@ static int ccp_aes_cmac_digest(struct ahash_request *req)
+       return ccp_aes_cmac_finup(req);
+ }
+ 
++static int ccp_aes_cmac_export(struct ahash_request *req, void *out)
++{
++      struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
++      struct ccp_aes_cmac_exp_ctx state;
++
++      state.null_msg = rctx->null_msg;
++      memcpy(state.iv, rctx->iv, sizeof(state.iv));
++      state.buf_count = rctx->buf_count;
++      memcpy(state.buf, rctx->buf, sizeof(state.buf));
++
++      /* 'out' may not be aligned so memcpy from local variable */
++      memcpy(out, &state, sizeof(state));
++
++      return 0;
++}
++
++static int ccp_aes_cmac_import(struct ahash_request *req, const void *in)
++{
++      struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
++      struct ccp_aes_cmac_exp_ctx state;
++
++      /* 'in' may not be aligned so memcpy to local variable */
++      memcpy(&state, in, sizeof(state));
++
++      memset(rctx, 0, sizeof(*rctx));
++      rctx->null_msg = state.null_msg;
++      memcpy(rctx->iv, state.iv, sizeof(rctx->iv));
++      rctx->buf_count = state.buf_count;
++      memcpy(rctx->buf, state.buf, sizeof(rctx->buf));
++
++      return 0;
++}
++
+ static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key,
+                          unsigned int key_len)
+ {
+@@ -332,10 +365,13 @@ int ccp_register_aes_cmac_algs(struct list_head *head)
+       alg->final = ccp_aes_cmac_final;
+       alg->finup = ccp_aes_cmac_finup;
+       alg->digest = ccp_aes_cmac_digest;
++      alg->export = ccp_aes_cmac_export;
++      alg->import = ccp_aes_cmac_import;
+       alg->setkey = ccp_aes_cmac_setkey;
+ 
+       halg = &alg->halg;
+       halg->digestsize = AES_BLOCK_SIZE;
++      halg->statesize = sizeof(struct ccp_aes_cmac_exp_ctx);
+ 
+       base = &halg->base;
+       snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "cmac(aes)");
+diff --git a/drivers/crypto/ccp/ccp-crypto-sha.c 
b/drivers/crypto/ccp/ccp-crypto-sha.c
+index 3867290b3531..bdbb5865a50f 100644
+--- a/drivers/crypto/ccp/ccp-crypto-sha.c
++++ b/drivers/crypto/ccp/ccp-crypto-sha.c
+@@ -257,6 +257,43 @@ static int ccp_sha_digest(struct ahash_request *req)
+       return ccp_sha_finup(req);
+ }
+ 
++static int ccp_sha_export(struct ahash_request *req, void *out)
++{
++      struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
++      struct ccp_sha_exp_ctx state;
++
++      state.type = rctx->type;
++      state.msg_bits = rctx->msg_bits;
++      state.first = rctx->first;
++      memcpy(state.ctx, rctx->ctx, sizeof(state.ctx));
++      state.buf_count = rctx->buf_count;
++      memcpy(state.buf, rctx->buf, sizeof(state.buf));
++
++      /* 'out' may not be aligned so memcpy from local variable */
++      memcpy(out, &state, sizeof(state));
++
++      return 0;
++}
++
++static int ccp_sha_import(struct ahash_request *req, const void *in)
++{
++      struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req);
++      struct ccp_sha_exp_ctx state;
++
++      /* 'in' may not be aligned so memcpy to local variable */
++      memcpy(&state, in, sizeof(state));
++
++      memset(rctx, 0, sizeof(*rctx));
++      rctx->type = state.type;
++      rctx->msg_bits = state.msg_bits;
++      rctx->first = state.first;
++      memcpy(rctx->ctx, state.ctx, sizeof(rctx->ctx));
++      rctx->buf_count = state.buf_count;
++      memcpy(rctx->buf, state.buf, sizeof(rctx->buf));
++
++      return 0;
++}
++
+ static int ccp_sha_setkey(struct crypto_ahash *tfm, const u8 *key,
+                         unsigned int key_len)
+ {
+@@ -469,9 +506,12 @@ static int ccp_register_sha_alg(struct list_head *head,
+       alg->final = ccp_sha_final;
+       alg->finup = ccp_sha_finup;
+       alg->digest = ccp_sha_digest;
++      alg->export = ccp_sha_export;
++      alg->import = ccp_sha_import;
+ 
+       halg = &alg->halg;
+       halg->digestsize = def->digest_size;
++      halg->statesize = sizeof(struct ccp_sha_exp_ctx);
+ 
+       base = &halg->base;
+       snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", def->name);
+diff --git a/drivers/crypto/ccp/ccp-crypto.h b/drivers/crypto/ccp/ccp-crypto.h
+index b222231b6169..79bcc3581092 100644
+--- a/drivers/crypto/ccp/ccp-crypto.h
++++ b/drivers/crypto/ccp/ccp-crypto.h
+@@ -132,6 +132,15 @@ struct ccp_aes_cmac_req_ctx {
+       struct ccp_cmd cmd;
+ };
+ 
++struct ccp_aes_cmac_exp_ctx {
++      unsigned int null_msg;
++
++      u8 iv[AES_BLOCK_SIZE];
++
++      unsigned int buf_count;
++      u8 buf[AES_BLOCK_SIZE];
++};
++
+ /***** SHA related defines *****/
+ #define MAX_SHA_CONTEXT_SIZE  SHA256_DIGEST_SIZE
+ #define MAX_SHA_BLOCK_SIZE    SHA256_BLOCK_SIZE
+@@ -174,6 +183,19 @@ struct ccp_sha_req_ctx {
+       struct ccp_cmd cmd;
+ };
+ 
++struct ccp_sha_exp_ctx {
++      enum ccp_sha_type type;
++
++      u64 msg_bits;
++
++      unsigned int first;
++
++      u8 ctx[MAX_SHA_CONTEXT_SIZE];
++
++      unsigned int buf_count;
++      u8 buf[MAX_SHA_BLOCK_SIZE];
++};
++
+ /***** Common Context Structure *****/
+ struct ccp_ctx {
+       int (*complete)(struct crypto_async_request *req, int ret);
+diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
+index 278603c373ca..d39e7482586c 100644
+--- a/drivers/edac/amd64_edac.c
++++ b/drivers/edac/amd64_edac.c
+@@ -1294,7 +1294,7 @@ static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, 
u8 range,
+       u64 chan_off;
+       u64 dram_base           = get_dram_base(pvt, range);
+       u64 hole_off            = f10_dhar_offset(pvt);
+-      u64 dct_sel_base_off    = (pvt->dct_sel_hi & 0xFFFFFC00) << 16;
++      u64 dct_sel_base_off    = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16;
+ 
+       if (hi_rng) {
+               /*
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
+index e7bfd5502410..eeb1369110ac 100644
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c
+@@ -895,8 +895,6 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, 
int action, int panel_mo
+                       else
+                               args.v1.ucLaneNum = 4;
+ 
+-                      if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && 
(dp_clock == 270000))
+-                              args.v1.ucConfig |= 
ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
+                       switch (radeon_encoder->encoder_id) {
+                       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
+                               args.v1.ucConfig = 
ATOM_ENCODER_CONFIG_V2_TRANSMITTER1;
+@@ -913,6 +911,10 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, 
int action, int panel_mo
+                               args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB;
+                       else
+                               args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
++
++                      if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && 
(dp_clock == 270000))
++                              args.v1.ucConfig |= 
ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ;
++
+                       break;
+               case 2:
+               case 3:
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index 51f18bf75fa6..66346c4e4104 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1761,6 +1761,7 @@ static const struct hid_device_id 
hid_have_special_driver[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
USB_DEVICE_ID_LOGITECH_ELITE_KBD) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
++      { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
USB_DEVICE_ID_LOGITECH_DUAL_ACTION) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) 
},
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 
USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
+diff --git a/drivers/input/misc/ati_remote2.c 
b/drivers/input/misc/ati_remote2.c
+index f63341f20b91..e8c6a4842e91 100644
+--- a/drivers/input/misc/ati_remote2.c
++++ b/drivers/input/misc/ati_remote2.c
+@@ -817,26 +817,49 @@ static int ati_remote2_probe(struct usb_interface 
*interface, const struct usb_d
+ 
+       ar2->udev = udev;
+ 
++      /* Sanity check, first interface must have an endpoint */
++      if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) {
++              dev_err(&interface->dev,
++                      "%s(): interface 0 must have an endpoint\n", __func__);
++              r = -ENODEV;
++              goto fail1;
++      }
+       ar2->intf[0] = interface;
+       ar2->ep[0] = &alt->endpoint[0].desc;
+ 
++      /* Sanity check, the device must have two interfaces */
+       ar2->intf[1] = usb_ifnum_to_if(udev, 1);
++      if ((udev->actconfig->desc.bNumInterfaces < 2) || !ar2->intf[1]) {
++              dev_err(&interface->dev, "%s(): need 2 interfaces, found %d\n",
++                      __func__, udev->actconfig->desc.bNumInterfaces);
++              r = -ENODEV;
++              goto fail1;
++      }
++
+       r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2);
+       if (r)
+               goto fail1;
++
++      /* Sanity check, second interface must have an endpoint */
+       alt = ar2->intf[1]->cur_altsetting;
++      if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) {
++              dev_err(&interface->dev,
++                      "%s(): interface 1 must have an endpoint\n", __func__);
++              r = -ENODEV;
++              goto fail2;
++      }
+       ar2->ep[1] = &alt->endpoint[0].desc;
+ 
+       r = ati_remote2_urb_init(ar2);
+       if (r)
+-              goto fail2;
++              goto fail3;
+ 
+       ar2->channel_mask = channel_mask;
+       ar2->mode_mask = mode_mask;
+ 
+       r = ati_remote2_setup(ar2, ar2->channel_mask);
+       if (r)
+-              goto fail2;
++              goto fail3;
+ 
+       usb_make_path(udev, ar2->phys, sizeof(ar2->phys));
+       strlcat(ar2->phys, "/input0", sizeof(ar2->phys));
+@@ -845,11 +868,11 @@ static int ati_remote2_probe(struct usb_interface 
*interface, const struct usb_d
+ 
+       r = sysfs_create_group(&udev->dev.kobj, &ati_remote2_attr_group);
+       if (r)
+-              goto fail2;
++              goto fail3;
+ 
+       r = ati_remote2_input_init(ar2);
+       if (r)
+-              goto fail3;
++              goto fail4;
+ 
+       usb_set_intfdata(interface, ar2);
+ 
+@@ -857,10 +880,11 @@ static int ati_remote2_probe(struct usb_interface 
*interface, const struct usb_d
+ 
+       return 0;
+ 
+- fail3:
++ fail4:
+       sysfs_remove_group(&udev->dev.kobj, &ati_remote2_attr_group);
+- fail2:
++ fail3:
+       ati_remote2_urb_cleanup(ar2);
++ fail2:
+       usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]);
+  fail1:
+       kfree(ar2);
+diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c
+index e204f26b0011..77164dc1bedd 100644
+--- a/drivers/input/misc/ims-pcu.c
++++ b/drivers/input/misc/ims-pcu.c
+@@ -1433,6 +1433,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface 
*intf, struct ims_pcu *pc
+ 
+       pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev,
+                                        union_desc->bMasterInterface0);
++      if (!pcu->ctrl_intf)
++              return -EINVAL;
+ 
+       alt = pcu->ctrl_intf->cur_altsetting;
+       pcu->ep_ctrl = &alt->endpoint[0].desc;
+@@ -1440,6 +1442,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface 
*intf, struct ims_pcu *pc
+ 
+       pcu->data_intf = usb_ifnum_to_if(pcu->udev,
+                                        union_desc->bSlaveInterface0);
++      if (!pcu->data_intf)
++              return -EINVAL;
+ 
+       alt = pcu->data_intf->cur_altsetting;
+       if (alt->desc.bNumEndpoints != 2) {
+diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c
+index 63b539d3daba..84909a12ff36 100644
+--- a/drivers/input/misc/powermate.c
++++ b/drivers/input/misc/powermate.c
+@@ -307,6 +307,9 @@ static int powermate_probe(struct usb_interface *intf, 
const struct usb_device_i
+       int error = -ENOMEM;
+ 
+       interface = intf->cur_altsetting;
++      if (interface->desc.bNumEndpoints < 1)
++              return -EINVAL;
++
+       endpoint = &interface->endpoint[0].desc;
+       if (!usb_endpoint_is_int_in(endpoint))
+               return -EIO;
+diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
+index 1b6beb1e3142..51ec648738f4 100644
+--- a/drivers/md/bcache/super.c
++++ b/drivers/md/bcache/super.c
+@@ -1388,6 +1388,9 @@ static void cache_set_flush(struct closure *cl)
+       struct btree *b;
+       unsigned i;
+ 
++      if (!c)
++              closure_return(cl);
++
+       bch_cache_accounting_destroy(&c->accounting);
+ 
+       kobject_put(&c->internal);
+diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
+index 849ad39f547b..79870f4b318d 100644
+--- a/drivers/md/multipath.c
++++ b/drivers/md/multipath.c
+@@ -131,7 +131,9 @@ static void multipath_make_request(struct mddev *mddev, 
struct bio * bio)
+       }
+       multipath = conf->multipaths + mp_bh->path;
+ 
+-      mp_bh->bio = *bio;
++      bio_init(&mp_bh->bio);
++      __bio_clone_fast(&mp_bh->bio, bio);
++
+       mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset;
+       mp_bh->bio.bi_bdev = multipath->rdev->bdev;
+       mp_bh->bio.bi_rw |= REQ_FAILFAST_TRANSPORT;
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 1c829a0b234b..49386766c4e0 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -6166,8 +6166,8 @@ static int run(struct mddev *mddev)
+               }
+ 
+               if (discard_supported &&
+-                 mddev->queue->limits.max_discard_sectors >= stripe &&
+-                 mddev->queue->limits.discard_granularity >= stripe)
++                  mddev->queue->limits.max_discard_sectors >= (stripe >> 9) &&
++                  mddev->queue->limits.discard_granularity >= stripe)
+                       queue_flag_set_unlocked(QUEUE_FLAG_DISCARD,
+                                               mddev->queue);
+               else
+diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511.c
+index ee618942cb8e..d68f742ab885 100644
+--- a/drivers/media/i2c/adv7511.c
++++ b/drivers/media/i2c/adv7511.c
+@@ -827,12 +827,23 @@ static void adv7511_dbg_dump_edid(int lvl, int debug, 
struct v4l2_subdev *sd, in
+       }
+ }
+ 
++static void adv7511_notify_no_edid(struct v4l2_subdev *sd)
++{
++      struct adv7511_state *state = get_adv7511_state(sd);
++      struct adv7511_edid_detect ed;
++
++      /* We failed to read the EDID, so send an event for this. */
++      ed.present = false;
++      ed.segment = adv7511_rd(sd, 0xc4);
++      v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
++      v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x0);
++}
++
+ static void adv7511_edid_handler(struct work_struct *work)
+ {
+       struct delayed_work *dwork = to_delayed_work(work);
+       struct adv7511_state *state = container_of(dwork, struct adv7511_state, 
edid_handler);
+       struct v4l2_subdev *sd = &state->sd;
+-      struct adv7511_edid_detect ed;
+ 
+       v4l2_dbg(1, debug, sd, "%s:\n", __func__);
+ 
+@@ -857,9 +868,7 @@ static void adv7511_edid_handler(struct work_struct *work)
+       }
+ 
+       /* We failed to read the EDID, so send an event for this. */
+-      ed.present = false;
+-      ed.segment = adv7511_rd(sd, 0xc4);
+-      v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
++      adv7511_notify_no_edid(sd);
+       v4l2_dbg(1, debug, sd, "%s: no edid found\n", __func__);
+ }
+ 
+@@ -930,7 +939,6 @@ static void adv7511_check_monitor_present_status(struct 
v4l2_subdev *sd)
+       /* update read only ctrls */
+       v4l2_ctrl_s_ctrl(state->hotplug_ctrl, adv7511_have_hotplug(sd) ? 0x1 : 
0x0);
+       v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, adv7511_have_rx_sense(sd) ? 0x1 
: 0x0);
+-      v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 
0x0);
+ 
+       if ((status & MASK_ADV7511_HPD_DETECT) && ((status & 
MASK_ADV7511_MSEN_DETECT) || state->edid.segments)) {
+               v4l2_dbg(1, debug, sd, "%s: hotplug and (rx-sense or edid)\n", 
__func__);
+@@ -960,6 +968,7 @@ static void adv7511_check_monitor_present_status(struct 
v4l2_subdev *sd)
+               }
+               adv7511_s_power(sd, false);
+               memset(&state->edid, 0, sizeof(struct adv7511_state_edid));
++              adv7511_notify_no_edid(sd);
+       }
+ }
+ 
+@@ -1036,6 +1045,7 @@ static bool adv7511_check_edid_status(struct v4l2_subdev 
*sd)
+               }
+               /* one more segment read ok */
+               state->edid.segments = segment + 1;
++              v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x1);
+               if (((state->edid.data[0x7e] >> 1) + 1) > state->edid.segments) 
{
+                       /* Request next EDID segment */
+                       v4l2_dbg(1, debug, sd, "%s: request segment %d\n", 
__func__, state->edid.segments);
+@@ -1055,7 +1065,6 @@ static bool adv7511_check_edid_status(struct v4l2_subdev 
*sd)
+               ed.present = true;
+               ed.segment = 0;
+               state->edid_detect_counter++;
+-              v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 
0x1 : 0x0);
+               v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed);
+               return ed.present;
+       }
+diff --git a/drivers/media/pci/bt8xx/bttv-driver.c 
b/drivers/media/pci/bt8xx/bttv-driver.c
+index afcd53bfcf8e..fa65262e7fe1 100644
+--- a/drivers/media/pci/bt8xx/bttv-driver.c
++++ b/drivers/media/pci/bt8xx/bttv-driver.c
+@@ -2333,6 +2333,19 @@ static int bttv_g_fmt_vid_overlay(struct file *file, 
void *priv,
+       return 0;
+ }
+ 
++static void bttv_get_width_mask_vid_cap(const struct bttv_format *fmt,
++                                      unsigned int *width_mask,
++                                      unsigned int *width_bias)
++{
++      if (fmt->flags & FORMAT_FLAGS_PLANAR) {
++              *width_mask = ~15; /* width must be a multiple of 16 pixels */
++              *width_bias = 8;   /* nearest */
++      } else {
++              *width_mask = ~3; /* width must be a multiple of 4 pixels */
++              *width_bias = 2;  /* nearest */
++      }
++}
++
+ static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
+                                               struct v4l2_format *f)
+ {
+@@ -2342,6 +2355,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void 
*priv,
+       enum v4l2_field field;
+       __s32 width, height;
+       __s32 height2;
++      unsigned int width_mask, width_bias;
+       int rc;
+ 
+       fmt = format_by_fourcc(f->fmt.pix.pixelformat);
+@@ -2374,9 +2388,9 @@ static int bttv_try_fmt_vid_cap(struct file *file, void 
*priv,
+       width = f->fmt.pix.width;
+       height = f->fmt.pix.height;
+ 
++      bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias);
+       rc = limit_scaled_size_lock(fh, &width, &height, field,
+-                             /* width_mask: 4 pixels */ ~3,
+-                             /* width_bias: nearest */ 2,
++                             width_mask, width_bias,
+                              /* adjust_size */ 1,
+                              /* adjust_crop */ 0);
+       if (0 != rc)
+@@ -2409,6 +2423,7 @@ static int bttv_s_fmt_vid_cap(struct file *file, void 
*priv,
+       struct bttv_fh *fh = priv;
+       struct bttv *btv = fh->btv;
+       __s32 width, height;
++      unsigned int width_mask, width_bias;
+       enum v4l2_field field;
+ 
+       retval = bttv_switch_type(fh, f->type);
+@@ -2423,9 +2438,10 @@ static int bttv_s_fmt_vid_cap(struct file *file, void 
*priv,
+       height = f->fmt.pix.height;
+       field = f->fmt.pix.field;
+ 
++      fmt = format_by_fourcc(f->fmt.pix.pixelformat);
++      bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias);
+       retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field,
+-                             /* width_mask: 4 pixels */ ~3,
+-                             /* width_bias: nearest */ 2,
++                             width_mask, width_bias,
+                              /* adjust_size */ 1,
+                              /* adjust_crop */ 1);
+       if (0 != retval)
+@@ -2433,8 +2449,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void 
*priv,
+ 
+       f->fmt.pix.field = field;
+ 
+-      fmt = format_by_fourcc(f->fmt.pix.pixelformat);
+-
+       /* update our state informations */
+       fh->fmt              = fmt;
+       fh->cap.field        = f->fmt.pix.field;
+diff --git a/drivers/media/pci/saa7134/saa7134-video.c 
b/drivers/media/pci/saa7134/saa7134-video.c
+index 40396e8b16a8..b338db3c7185 100644
+--- a/drivers/media/pci/saa7134/saa7134-video.c
++++ b/drivers/media/pci/saa7134/saa7134-video.c
+@@ -1342,10 +1342,13 @@ static int saa7134_g_fmt_vid_cap(struct file *file, 
void *priv,
+       f->fmt.pix.height       = dev->height;
+       f->fmt.pix.field        = dev->cap.field;
+       f->fmt.pix.pixelformat  = dev->fmt->fourcc;
+-      f->fmt.pix.bytesperline =
+-              (f->fmt.pix.width * dev->fmt->depth) >> 3;
++      if (dev->fmt->planar)
++              f->fmt.pix.bytesperline = f->fmt.pix.width;
++      else
++              f->fmt.pix.bytesperline =
++                      (f->fmt.pix.width * dev->fmt->depth) / 8;
+       f->fmt.pix.sizeimage =
+-              f->fmt.pix.height * f->fmt.pix.bytesperline;
++              (f->fmt.pix.height * f->fmt.pix.width * dev->fmt->depth) / 8;
+       f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
+       f->fmt.pix.priv = 0;
+       return 0;
+@@ -1424,10 +1427,13 @@ static int saa7134_try_fmt_vid_cap(struct file *file, 
void *priv,
+       if (f->fmt.pix.height > maxh)
+               f->fmt.pix.height = maxh;
+       f->fmt.pix.width &= ~0x03;
+-      f->fmt.pix.bytesperline =
+-              (f->fmt.pix.width * fmt->depth) >> 3;
++      if (fmt->planar)
++              f->fmt.pix.bytesperline = f->fmt.pix.width;
++      else
++              f->fmt.pix.bytesperline =
++                      (f->fmt.pix.width * fmt->depth) / 8;
+       f->fmt.pix.sizeimage =
+-              f->fmt.pix.height * f->fmt.pix.bytesperline;
++              (f->fmt.pix.height * f->fmt.pix.width * fmt->depth) / 8;
+       f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
+       f->fmt.pix.priv = 0;
+ 
+diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c
+index abf365ab025d..73c12c8d125d 100644
+--- a/drivers/media/usb/pwc/pwc-if.c
++++ b/drivers/media/usb/pwc/pwc-if.c
+@@ -91,6 +91,7 @@ static const struct usb_device_id pwc_device_table [] = {
+       { USB_DEVICE(0x0471, 0x0312) },
+       { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */
+       { USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */
++      { USB_DEVICE(0x0471, 0x032C) }, /* Philips SPC 880NC PC Camera */
+       { USB_DEVICE(0x069A, 0x0001) }, /* Askey */
+       { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */
+       { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */
+@@ -799,6 +800,11 @@ static int usb_pwc_probe(struct usb_interface *intf, 
const struct usb_device_id
+                       name = "Philips SPC 900NC webcam";
+                       type_id = 740;
+                       break;
++              case 0x032C:
++                      PWC_INFO("Philips SPC 880NC USB webcam detected.\n");
++                      name = "Philips SPC 880NC webcam";
++                      type_id = 740;
++                      break;
+               default:
+                       return -ENODEV;
+                       break;
+diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c 
b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
+index 2bece37d0228..61c2cd3be109 100644
+--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
++++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
+@@ -392,7 +392,8 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, 
struct v4l2_buffer32 __user
+               get_user(kp->index, &up->index) ||
+               get_user(kp->type, &up->type) ||
+               get_user(kp->flags, &up->flags) ||
+-              get_user(kp->memory, &up->memory))
++              get_user(kp->memory, &up->memory) ||
++              get_user(kp->length, &up->length))
+                       return -EFAULT;
+ 
+       if (V4L2_TYPE_IS_OUTPUT(kp->type))
+@@ -404,9 +405,6 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, 
struct v4l2_buffer32 __user
+                       return -EFAULT;
+ 
+       if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) {
+-              if (get_user(kp->length, &up->length))
+-                      return -EFAULT;
+-
+               num_planes = kp->length;
+               if (num_planes == 0) {
+                       kp->m.planes = NULL;
+@@ -439,16 +437,14 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, 
struct v4l2_buffer32 __user
+       } else {
+               switch (kp->memory) {
+               case V4L2_MEMORY_MMAP:
+-                      if (get_user(kp->length, &up->length) ||
+-                              get_user(kp->m.offset, &up->m.offset))
++                      if (get_user(kp->m.offset, &up->m.offset))
+                               return -EFAULT;
+                       break;
+               case V4L2_MEMORY_USERPTR:
+                       {
+                       compat_long_t tmp;
+ 
+-                      if (get_user(kp->length, &up->length) ||
+-                          get_user(tmp, &up->m.userptr))
++                      if (get_user(tmp, &up->m.userptr))
+                               return -EFAULT;
+ 
+                       kp->m.userptr = (unsigned long)compat_ptr(tmp);
+@@ -490,7 +486,8 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, 
struct v4l2_buffer32 __user
+               copy_to_user(&up->timecode, &kp->timecode, sizeof(struct 
v4l2_timecode)) ||
+               put_user(kp->sequence, &up->sequence) ||
+               put_user(kp->reserved2, &up->reserved2) ||
+-              put_user(kp->reserved, &up->reserved))
++              put_user(kp->reserved, &up->reserved) ||
++              put_user(kp->length, &up->length))
+                       return -EFAULT;
+ 
+       if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) {
+@@ -513,13 +510,11 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, 
struct v4l2_buffer32 __user
+       } else {
+               switch (kp->memory) {
+               case V4L2_MEMORY_MMAP:
+-                      if (put_user(kp->length, &up->length) ||
+-                              put_user(kp->m.offset, &up->m.offset))
++                      if (put_user(kp->m.offset, &up->m.offset))
+                               return -EFAULT;
+                       break;
+               case V4L2_MEMORY_USERPTR:
+-                      if (put_user(kp->length, &up->length) ||
+-                              put_user(kp->m.userptr, &up->m.userptr))
++                      if (put_user(kp->m.userptr, &up->m.userptr))
+                               return -EFAULT;
+                       break;
+               case V4L2_MEMORY_OVERLAY:
+diff --git a/drivers/mtd/onenand/onenand_base.c 
b/drivers/mtd/onenand/onenand_base.c
+index 1de33b5d3903..fdfde0271d23 100644
+--- a/drivers/mtd/onenand/onenand_base.c
++++ b/drivers/mtd/onenand/onenand_base.c
+@@ -2606,6 +2606,7 @@ static int onenand_default_block_markbad(struct mtd_info 
*mtd, loff_t ofs)
+  */
+ static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
+ {
++      struct onenand_chip *this = mtd->priv;
+       int ret;
+ 
+       ret = onenand_block_isbad(mtd, ofs);
+@@ -2617,7 +2618,7 @@ static int onenand_block_markbad(struct mtd_info *mtd, 
loff_t ofs)
+       }
+ 
+       onenand_get_device(mtd, FL_WRITING);
+-      ret = mtd_block_markbad(mtd, ofs);
++      ret = this->block_markbad(mtd, ofs);
+       onenand_release_device(mtd);
+       return ret;
+ }
+diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c
+index 24b6dddd7f2f..16219162566b 100644
+--- a/drivers/net/irda/irtty-sir.c
++++ b/drivers/net/irda/irtty-sir.c
+@@ -430,16 +430,6 @@ static int irtty_open(struct tty_struct *tty)
+ 
+       /* Module stuff handled via irda_ldisc.owner - Jean II */
+ 
+-      /* First make sure we're not already connected. */
+-      if (tty->disc_data != NULL) {
+-              priv = tty->disc_data;
+-              if (priv && priv->magic == IRTTY_MAGIC) {
+-                      ret = -EEXIST;
+-                      goto out;
+-              }
+-              tty->disc_data = NULL;          /* ### */
+-      }
+-
+       /* stop the underlying  driver */
+       irtty_stop_receiver(tty, TRUE);
+       if (tty->ops->stop)
+diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c
+index 6d1f6ed3113f..d93bac129efc 100644
+--- a/drivers/net/rionet.c
++++ b/drivers/net/rionet.c
+@@ -280,7 +280,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, 
void *dev_id, int mbo
+       struct net_device *ndev = dev_id;
+       struct rionet_private *rnet = netdev_priv(ndev);
+ 
+-      spin_lock(&rnet->lock);
++      spin_lock(&rnet->tx_lock);
+ 
+       if (netif_msg_intr(rnet))
+               printk(KERN_INFO
+@@ -299,7 +299,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, 
void *dev_id, int mbo
+       if (rnet->tx_cnt < RIONET_TX_RING_SIZE)
+               netif_wake_queue(ndev);
+ 
+-      spin_unlock(&rnet->lock);
++      spin_unlock(&rnet->tx_lock);
+ }
+ 
+ static int rionet_open(struct net_device *ndev)
+diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
+index 5b428db6a150..146b13752572 100644
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -175,6 +175,9 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type 
type,
+       struct pci_bus_region region, inverted_region;
+       bool bar_too_big = false, bar_disabled = false;
+ 
++      if (dev->non_compliant_bars)
++              return 0;
++
+       mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
+ 
+       /* No printks while decoding is disabled! */
+@@ -1074,6 +1077,7 @@ int pci_cfg_space_size(struct pci_dev *dev)
+ int pci_setup_device(struct pci_dev *dev)
+ {
+       u32 class;
++      u16 cmd;
+       u8 hdr_type;
+       struct pci_slot *slot;
+       int pos = 0;
+@@ -1121,6 +1125,16 @@ int pci_setup_device(struct pci_dev *dev)
+       /* device class may be changed after fixup */
+       class = dev->class >> 8;
+ 
++      if (dev->non_compliant_bars) {
++              pci_read_config_word(dev, PCI_COMMAND, &cmd);
++              if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
++                      dev_info(&dev->dev, "device has non-compliant BARs; 
disabling IO/MEM decoding\n");
++                      cmd &= ~PCI_COMMAND_IO;
++                      cmd &= ~PCI_COMMAND_MEMORY;
++                      pci_write_config_word(dev, PCI_COMMAND, cmd);
++              }
++      }
++
+       switch (dev->hdr_type) {                    /* header type */
+       case PCI_HEADER_TYPE_NORMAL:                /* standard header */
+               if (class == PCI_CLASS_BRIDGE_PCI)
+diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
+index cab190af6345..6b32ddcefc11 100644
+--- a/drivers/scsi/aacraid/commsup.c
++++ b/drivers/scsi/aacraid/commsup.c
+@@ -83,9 +83,12 @@ static int fib_map_alloc(struct aac_dev *dev)
+ 
+ void aac_fib_map_free(struct aac_dev *dev)
+ {
+-      pci_free_consistent(dev->pdev,
+-        dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB),
+-        dev->hw_fib_va, dev->hw_fib_pa);
++      if (dev->hw_fib_va && dev->max_fib_size) {
++              pci_free_consistent(dev->pdev,
++              (dev->max_fib_size *
++              (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)),
++              dev->hw_fib_va, dev->hw_fib_pa);
++      }
+       dev->hw_fib_va = NULL;
+       dev->hw_fib_pa = 0;
+ }
+diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
+index 19ddd43a00cf..f4b9ac4ef16e 100644
+--- a/drivers/scsi/be2iscsi/be_main.c
++++ b/drivers/scsi/be2iscsi/be_main.c
+@@ -4432,6 +4432,7 @@ put_shost:
+       scsi_host_put(phba->shost);
+ free_kset:
+       iscsi_boot_destroy_kset(phba->boot_kset);
++      phba->boot_kset = NULL;
+       return -ENOMEM;
+ }
+ 
+diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
+index 128dc2f75186..2b7bc7df1edf 100644
+--- a/drivers/scsi/ipr.c
++++ b/drivers/scsi/ipr.c
+@@ -3946,13 +3946,17 @@ static ssize_t ipr_store_update_fw(struct device *dev,
+       struct ipr_sglist *sglist;
+       char fname[100];
+       char *src;
+-      int len, result, dnld_size;
++      char *endline;
++      int result, dnld_size;
+ 
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+ 
+-      len = snprintf(fname, 99, "%s", buf);
+-      fname[len-1] = '\0';
++      snprintf(fname, sizeof(fname), "%s", buf);
++
++      endline = strchr(fname, '\n');
++      if (endline)
++              *endline = '\0';
+ 
+       if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) {
+               dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", 
fname);
+diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
+index 0be16bf5f0cd..1f65e32db285 100644
+--- a/drivers/scsi/sg.c
++++ b/drivers/scsi/sg.c
+@@ -633,7 +633,8 @@ sg_write(struct file *filp, const char __user *buf, size_t 
count, loff_t * ppos)
+       else
+               hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : 
SG_DXFER_NONE;
+       hp->dxfer_len = mxsize;
+-      if (hp->dxfer_direction == SG_DXFER_TO_DEV)
++      if ((hp->dxfer_direction == SG_DXFER_TO_DEV) ||
++          (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV))
+               hp->dxferp = (char __user *)buf + cmd_size;
+       else
+               hp->dxferp = NULL;
+diff --git a/drivers/target/target_core_tmr.c 
b/drivers/target/target_core_tmr.c
+index 47a90d631a90..77c143854118 100644
+--- a/drivers/target/target_core_tmr.c
++++ b/drivers/target/target_core_tmr.c
+@@ -181,7 +181,6 @@ void core_tmr_abort_task(
+ 
+               if (!__target_check_io_state(se_cmd, se_sess, 0)) {
+                       spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+-                      target_put_sess_cmd(se_sess, se_cmd);
+                       goto out;
+               }
+ 
+diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
+index cbf927a67160..9ad3d263d5e1 100644
+--- a/drivers/target/target_core_transport.c
++++ b/drivers/target/target_core_transport.c
+@@ -2484,8 +2484,6 @@ void target_wait_for_sess_cmds(struct se_session 
*se_sess)
+ 
+       list_for_each_entry_safe(se_cmd, tmp_cmd,
+                               &se_sess->sess_wait_list, se_cmd_list) {
+-              list_del_init(&se_cmd->se_cmd_list);
+-
+               pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:"
+                       " %d\n", se_cmd, se_cmd->t_state,
+                       se_cmd->se_tfo->get_cmd_state(se_cmd));
+diff --git a/drivers/tty/serial/8250/8250_core.c 
b/drivers/tty/serial/8250/8250_core.c
+index 612dfc720738..9fffc7295af1 100644
+--- a/drivers/tty/serial/8250/8250_core.c
++++ b/drivers/tty/serial/8250/8250_core.c
+@@ -686,22 +686,16 @@ static int size_fifo(struct uart_8250_port *up)
+  */
+ static unsigned int autoconfig_read_divisor_id(struct uart_8250_port *p)
+ {
+-      unsigned char old_dll, old_dlm, old_lcr;
+-      unsigned int id;
++      unsigned char old_lcr;
++      unsigned int id, old_dl;
+ 
+       old_lcr = serial_in(p, UART_LCR);
+       serial_out(p, UART_LCR, UART_LCR_CONF_MODE_A);
++      old_dl = serial_dl_read(p);
++      serial_dl_write(p, 0);
++      id = serial_dl_read(p);
++      serial_dl_write(p, old_dl);
+ 
+-      old_dll = serial_in(p, UART_DLL);
+-      old_dlm = serial_in(p, UART_DLM);
+-
+-      serial_out(p, UART_DLL, 0);
+-      serial_out(p, UART_DLM, 0);
+-
+-      id = serial_in(p, UART_DLL) | serial_in(p, UART_DLM) << 8;
+-
+-      serial_out(p, UART_DLL, old_dll);
+-      serial_out(p, UART_DLM, old_dlm);
+       serial_out(p, UART_LCR, old_lcr);
+ 
+       return id;
+diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
+index 584514c7ed1f..b6f5c7d3737b 100644
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -1079,6 +1079,9 @@ static int acm_probe(struct usb_interface *intf,
+       if (quirks == NO_UNION_NORMAL) {
+               data_interface = usb_ifnum_to_if(usb_dev, 1);
+               control_interface = usb_ifnum_to_if(usb_dev, 0);
++              /* we would crash */
++              if (!data_interface || !control_interface)
++                      return -ENODEV;
+               goto skip_normal_probe;
+       }
+ 
+diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
+index 39c7cd6ffa4b..5c65f37536b0 100644
+--- a/drivers/usb/core/driver.c
++++ b/drivers/usb/core/driver.c
+@@ -494,11 +494,15 @@ static int usb_unbind_interface(struct device *dev)
+ int usb_driver_claim_interface(struct usb_driver *driver,
+                               struct usb_interface *iface, void *priv)
+ {
+-      struct device *dev = &iface->dev;
++      struct device *dev;
+       struct usb_device *udev;
+       int retval = 0;
+       int lpm_disable_error;
+ 
++      if (!iface)
++              return -ENODEV;
++
++      dev = &iface->dev;
+       if (dev->driver)
+               return -EBUSY;
+ 
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index 648e7eccdde9..f7fdc2c4f8b7 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -4079,7 +4079,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device 
*udev, int port1,
+ 
+       struct usb_device       *hdev = hub->hdev;
+       struct usb_hcd          *hcd = bus_to_hcd(hdev->bus);
+-      int                     i, j, retval;
++      int                     retries, operations, retval, i;
+       unsigned                delay = HUB_SHORT_RESET_TIME;
+       enum usb_device_speed   oldspeed = udev->speed;
+       const char              *speed;
+@@ -4181,7 +4181,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device 
*udev, int port1,
+        * first 8 bytes of the device descriptor to get the ep0 maxpacket
+        * value.
+        */
+-      for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) {
++      for (retries = 0; retries < GET_DESCRIPTOR_TRIES; (++retries, 
msleep(100))) {
+               bool did_new_scheme = false;
+ 
+               if (use_new_scheme(udev, retry_counter)) {
+@@ -4204,7 +4204,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device 
*udev, int port1,
+                        * 255 is for WUSB devices, we actually need to use
+                        * 512 (WUSB1.0[4.8.1]).
+                        */
+-                      for (j = 0; j < 3; ++j) {
++                      for (operations = 0; operations < 3; ++operations) {
+                               buf->bMaxPacketSize0 = 0;
+                               r = usb_control_msg(udev, usb_rcvaddr0pipe(),
+                                       USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
+@@ -4224,7 +4224,13 @@ hub_port_init (struct usb_hub *hub, struct usb_device 
*udev, int port1,
+                                               r = -EPROTO;
+                                       break;
+                               }
+-                              if (r == 0)
++                              /*
++                               * Some devices time out if they are powered on
++                               * when already connected. They need a second
++                               * reset. But only on the first attempt,
++                               * lest we get into a time out/reset loop
++                               */
++                              if (r == 0  || (r == -ETIMEDOUT && retries == 
0))
+                                       break;
+                       }
+                       udev->descriptor.bMaxPacketSize0 =
+@@ -4256,7 +4262,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device 
*udev, int port1,
+                * authorization will assign the final address.
+                */
+               if (udev->wusb == 0) {
+-                      for (j = 0; j < SET_ADDRESS_TRIES; ++j) {
++                      for (operations = 0; operations < SET_ADDRESS_TRIES; 
++operations) {
+                               retval = hub_set_address(udev, devnum);
+                               if (retval >= 0)
+                                       break;
+diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
+index 20bcfdd7eace..35d1457d84b1 100644
+--- a/drivers/usb/misc/iowarrior.c
++++ b/drivers/usb/misc/iowarrior.c
+@@ -791,6 +791,12 @@ static int iowarrior_probe(struct usb_interface 
*interface,
+       iface_desc = interface->cur_altsetting;
+       dev->product_id = le16_to_cpu(udev->descriptor.idProduct);
+ 
++      if (iface_desc->desc.bNumEndpoints < 1) {
++              dev_err(&interface->dev, "Invalid number of endpoints\n");
++              retval = -EINVAL;
++              goto error;
++      }
++
+       /* set up the endpoint information */
+       for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
+               endpoint = &iface_desc->endpoint[i].desc;
+diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
+index 3ce5c74b29e4..6f483b8a4f56 100644
+--- a/drivers/usb/serial/Kconfig
++++ b/drivers/usb/serial/Kconfig
+@@ -59,6 +59,7 @@ config USB_SERIAL_SIMPLE
+         driver.  Specifically, it supports:
+               - Suunto ANT+ USB device.
+               - Fundamental Software dongle.
++              - Google USB serial devices
+               - HP4x calculators
+               - a number of Motorola phones
+               - Siemens USB/MPI adapter.
+diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
+index 922723edd6b0..b689a2fd960c 100644
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -164,6 +164,7 @@ static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
+       { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */
+       { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */
++      { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */
+       { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */
+       { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
+       { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
+diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
+index bccb1223143a..81001d13774e 100644
+--- a/drivers/usb/serial/cypress_m8.c
++++ b/drivers/usb/serial/cypress_m8.c
+@@ -447,6 +447,11 @@ static int cypress_generic_port_probe(struct 
usb_serial_port *port)
+       struct usb_serial *serial = port->serial;
+       struct cypress_private *priv;
+ 
++      if (!port->interrupt_out_urb || !port->interrupt_in_urb) {
++              dev_err(&port->dev, "required endpoint is missing\n");
++              return -ENODEV;
++      }
++
+       priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+@@ -606,12 +611,6 @@ static int cypress_open(struct tty_struct *tty, struct 
usb_serial_port *port)
+               cypress_set_termios(tty, port, &priv->tmp_termios);
+ 
+       /* setup the port and start reading from the device */
+-      if (!port->interrupt_in_urb) {
+-              dev_err(&port->dev, "%s - interrupt_in_urb is empty!\n",
+-                      __func__);
+-              return -1;
+-      }
+-
+       usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
+               usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
+               port->interrupt_in_urb->transfer_buffer,
+diff --git a/drivers/usb/serial/digi_acceleport.c 
b/drivers/usb/serial/digi_acceleport.c
+index 8a23c53b946e..cd6df875163e 100644
+--- a/drivers/usb/serial/digi_acceleport.c
++++ b/drivers/usb/serial/digi_acceleport.c
+@@ -1252,8 +1252,27 @@ static int digi_port_init(struct usb_serial_port *port, 
unsigned port_num)
+ 
+ static int digi_startup(struct usb_serial *serial)
+ {
++      struct device *dev = &serial->interface->dev;
+       struct digi_serial *serial_priv;
+       int ret;
++      int i;
++
++      /* check whether the device has the expected number of endpoints */
++      if (serial->num_port_pointers < serial->type->num_ports + 1) {
++              dev_err(dev, "OOB endpoints missing\n");
++              return -ENODEV;
++      }
++
++      for (i = 0; i < serial->type->num_ports + 1 ; i++) {
++              if (!serial->port[i]->read_urb) {
++                      dev_err(dev, "bulk-in endpoint missing\n");
++                      return -ENODEV;
++              }
++              if (!serial->port[i]->write_urb) {
++                      dev_err(dev, "bulk-out endpoint missing\n");
++                      return -ENODEV;
++              }
++      }
+ 
+       serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL);
+       if (!serial_priv)
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index b5d8e2544b8f..fb3a832d86e3 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -1017,6 +1017,10 @@ static const struct usb_device_id id_table_combined[] = 
{
+       { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_DISPLAY_PID) },
+       { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_LITE_PID) },
+       { USB_DEVICE(FTDI_VID, CHETCO_SEASMART_ANALOG_PID) },
++      /* ICP DAS I-756xU devices */
++      { USB_DEVICE(ICPDAS_VID, ICPDAS_I7560U_PID) },
++      { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
++      { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
+       { }                                     /* Terminating entry */
+ };
+ 
+diff --git a/drivers/usb/serial/ftdi_sio_ids.h 
b/drivers/usb/serial/ftdi_sio_ids.h
+index 7850071c0ae1..334bc600282d 100644
+--- a/drivers/usb/serial/ftdi_sio_ids.h
++++ b/drivers/usb/serial/ftdi_sio_ids.h
+@@ -872,6 +872,14 @@
+ #define NOVITUS_BONO_E_PID            0x6010
+ 
+ /*
++ * ICPDAS I-756*U devices
++ */
++#define ICPDAS_VID                    0x1b5c
++#define ICPDAS_I7560U_PID             0x0103
++#define ICPDAS_I7561U_PID             0x0104
++#define ICPDAS_I7563U_PID             0x0105
++
++/*
+  * RT Systems programming cables for various ham radios
+  */
+ #define RTSYSTEMS_VID         0x2100  /* Vendor ID */
+diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c
+index fd707d6a10e2..89726f702202 100644
+--- a/drivers/usb/serial/mct_u232.c
++++ b/drivers/usb/serial/mct_u232.c
+@@ -376,14 +376,21 @@ static void mct_u232_msr_to_state(struct usb_serial_port 
*port,
+ 
+ static int mct_u232_port_probe(struct usb_serial_port *port)
+ {
++      struct usb_serial *serial = port->serial;
+       struct mct_u232_private *priv;
+ 
++      /* check first to simplify error handling */
++      if (!serial->port[1] || !serial->port[1]->interrupt_in_urb) {
++              dev_err(&port->dev, "expected endpoint missing\n");
++              return -ENODEV;
++      }
++
+       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+ 
+       /* Use second interrupt-in endpoint for reading. */
+-      priv->read_urb = port->serial->port[1]->interrupt_in_urb;
++      priv->read_urb = serial->port[1]->interrupt_in_urb;
+       priv->read_urb->context = port;
+ 
+       spin_lock_init(&priv->lock);
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 24366a2afea6..99c89d7fa1ad 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1818,6 +1818,8 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d02, 0xff, 0x00, 0x00) },
+       { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x02, 0x01) },
+       { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x7d03, 0xff, 0x00, 0x00) },
++      { USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7e19, 0xff),                     
/* D-Link DWM-221 B1 */
++        .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
+       { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* 
D-Link DWM-152/C1 */
+       { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* 
D-Link DWM-156/C1 */
+       { USB_DEVICE_INTERFACE_CLASS(0x2020, 0x4000, 0xff) },                /* 
OLICARD300 - MT6225 */
+diff --git a/drivers/usb/serial/usb-serial-simple.c 
b/drivers/usb/serial/usb-serial-simple.c
+index efb727a49262..5c19d3e7b4b8 100644
+--- a/drivers/usb/serial/usb-serial-simple.c
++++ b/drivers/usb/serial/usb-serial-simple.c
+@@ -51,6 +51,14 @@ DEVICE(funsoft, FUNSOFT_IDS);
+       { USB_DEVICE(0x8087, 0x0716) }
+ DEVICE(flashloader, FLASHLOADER_IDS);
+ 
++/* Google Serial USB SubClass */
++#define GOOGLE_IDS()                                          \
++      { USB_VENDOR_AND_INTERFACE_INFO(0x18d1,                 \
++                                      USB_CLASS_VENDOR_SPEC,  \
++                                      0x50,                   \
++                                      0x01) }
++DEVICE(google, GOOGLE_IDS);
++
+ /* ViVOpay USB Serial Driver */
+ #define VIVOPAY_IDS()                 \
+       { USB_DEVICE(0x1d5f, 0x1004) }  /* ViVOpay 8800 */
+@@ -86,6 +94,7 @@ static struct usb_serial_driver * const serial_drivers[] = {
+       &zio_device,
+       &funsoft_device,
+       &flashloader_device,
++      &google_device,
+       &vivopay_device,
+       &moto_modem_device,
+       &hp4x_device,
+@@ -98,6 +107,7 @@ static const struct usb_device_id id_table[] = {
+       ZIO_IDS(),
+       FUNSOFT_IDS(),
+       FLASHLOADER_IDS(),
++      GOOGLE_IDS(),
+       VIVOPAY_IDS(),
+       MOTO_IDS(),
+       HP4X_IDS(),
+diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c
+index 71e78ef4b736..3a75f3b53452 100644
+--- a/drivers/watchdog/rc32434_wdt.c
++++ b/drivers/watchdog/rc32434_wdt.c
+@@ -237,7 +237,7 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned 
int cmd,
+                       return -EINVAL;
+               /* Fall through */
+       case WDIOC_GETTIMEOUT:
+-              return copy_to_user(argp, &timeout, sizeof(int));
++              return copy_to_user(argp, &timeout, sizeof(int)) ? -EFAULT : 0;
+       default:
+               return -ENOTTY;
+       }
+diff --git a/fs/coredump.c b/fs/coredump.c
+index 72f97a56966f..09c201161bff 100644
+--- a/fs/coredump.c
++++ b/fs/coredump.c
+@@ -32,6 +32,9 @@
+ #include <linux/pipe_fs_i.h>
+ #include <linux/oom.h>
+ #include <linux/compat.h>
++#include <linux/sched.h>
++#include <linux/fs.h>
++#include <linux/path.h>
+ 
+ #include <asm/uaccess.h>
+ #include <asm/mmu_context.h>
+@@ -613,6 +616,8 @@ void do_coredump(const siginfo_t *siginfo)
+               }
+       } else {
+               struct inode *inode;
++              int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW |
++                               O_LARGEFILE | O_EXCL;
+ 
+               if (cprm.limit < binfmt->min_coredump)
+                       goto fail_unlock;
+@@ -651,10 +656,27 @@ void do_coredump(const siginfo_t *siginfo)
+                * what matters is that at least one of the two processes
+                * writes its coredump successfully, not which one.
+                */
+-              cprm.file = filp_open(cn.corename,
+-                               O_CREAT | 2 | O_NOFOLLOW |
+-                               O_LARGEFILE | O_EXCL,
+-                               0600);
++              if (need_suid_safe) {
++                      /*
++                       * Using user namespaces, normal user tasks can change
++                       * their current->fs->root to point to arbitrary
++                       * directories. Since the intention of the "only dump
++                       * with a fully qualified path" rule is to control where
++                       * coredumps may be placed using root privileges,
++                       * current->fs->root must not be used. Instead, use the
++                       * root directory of init_task.
++                       */
++                      struct path root;
++
++                      task_lock(&init_task);
++                      get_fs_root(init_task.fs, &root);
++                      task_unlock(&init_task);
++                      cprm.file = file_open_root(root.dentry, root.mnt,
++                              cn.corename, open_flags, 0600);
++                      path_put(&root);
++              } else {
++                      cprm.file = filp_open(cn.corename, open_flags, 0600);
++              }
+               if (IS_ERR(cprm.file))
+                       goto fail_unlock;
+ 
+diff --git a/fs/fhandle.c b/fs/fhandle.c
+index d59712dfa3e7..ca3c3dd01789 100644
+--- a/fs/fhandle.c
++++ b/fs/fhandle.c
+@@ -228,7 +228,7 @@ long do_handle_open(int mountdirfd,
+               path_put(&path);
+               return fd;
+       }
+-      file = file_open_root(path.dentry, path.mnt, "", open_flag);
++      file = file_open_root(path.dentry, path.mnt, "", open_flag, 0);
+       if (IS_ERR(file)) {
+               put_unused_fd(fd);
+               retval =  PTR_ERR(file);
+diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
+index ef5f39a73c51..84db6c78541c 100644
+--- a/fs/jbd2/journal.c
++++ b/fs/jbd2/journal.c
+@@ -1423,11 +1423,12 @@ out:
+ /**
+  * jbd2_mark_journal_empty() - Mark on disk journal as empty.
+  * @journal: The journal to update.
++ * @write_op: With which operation should we write the journal sb
+  *
+  * Update a journal's dynamic superblock fields to show that journal is empty.
+  * Write updated superblock to disk waiting for IO to complete.
+  */
+-static void jbd2_mark_journal_empty(journal_t *journal)
++static void jbd2_mark_journal_empty(journal_t *journal, int write_op)
+ {
+       journal_superblock_t *sb = journal->j_superblock;
+ 
+@@ -1445,7 +1446,7 @@ static void jbd2_mark_journal_empty(journal_t *journal)
+       sb->s_start    = cpu_to_be32(0);
+       read_unlock(&journal->j_state_lock);
+ 
+-      jbd2_write_superblock(journal, WRITE_FUA);
++      jbd2_write_superblock(journal, write_op);
+ 
+       /* Log is no longer empty */
+       write_lock(&journal->j_state_lock);
+@@ -1730,7 +1731,13 @@ int jbd2_journal_destroy(journal_t *journal)
+       if (journal->j_sb_buffer) {
+               if (!is_journal_aborted(journal)) {
+                       mutex_lock(&journal->j_checkpoint_mutex);
+-                      jbd2_mark_journal_empty(journal);
++
++                      write_lock(&journal->j_state_lock);
++                      journal->j_tail_sequence =
++                              ++journal->j_transaction_sequence;
++                      write_unlock(&journal->j_state_lock);
++
++                      jbd2_mark_journal_empty(journal, WRITE_FLUSH_FUA);
+                       mutex_unlock(&journal->j_checkpoint_mutex);
+               } else
+                       err = -EIO;
+@@ -1991,7 +1998,7 @@ int jbd2_journal_flush(journal_t *journal)
+        * the magic code for a fully-recovered superblock.  Any future
+        * commits of data to the journal will restore the current
+        * s_start value. */
+-      jbd2_mark_journal_empty(journal);
++      jbd2_mark_journal_empty(journal, WRITE_FUA);
+       mutex_unlock(&journal->j_checkpoint_mutex);
+       write_lock(&journal->j_state_lock);
+       J_ASSERT(!journal->j_running_transaction);
+@@ -2037,7 +2044,7 @@ int jbd2_journal_wipe(journal_t *journal, int write)
+       if (write) {
+               /* Lock to make assertions happy... */
+               mutex_lock(&journal->j_checkpoint_mutex);
+-              jbd2_mark_journal_empty(journal);
++              jbd2_mark_journal_empty(journal, WRITE_FUA);
+               mutex_unlock(&journal->j_checkpoint_mutex);
+       }
+ 
+diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c
+index e36d63ff1783..f90931335c6b 100644
+--- a/fs/ocfs2/dlm/dlmconvert.c
++++ b/fs/ocfs2/dlm/dlmconvert.c
+@@ -262,6 +262,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
+                                 struct dlm_lock *lock, int flags, int type)
+ {
+       enum dlm_status status;
++      u8 old_owner = res->owner;
+ 
+       mlog(0, "type=%d, convert_type=%d, busy=%d\n", lock->ml.type,
+            lock->ml.convert_type, res->state & DLM_LOCK_RES_IN_PROGRESS);
+@@ -287,6 +288,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
+               status = DLM_DENIED;
+               goto bail;
+       }
++
++      if (lock->ml.type == type && lock->ml.convert_type == LKM_IVMODE) {
++              mlog(0, "last convert request returned DLM_RECOVERING, but "
++                   "owner has already queued and sent ast to me. res %.*s, "
++                   "(cookie=%u:%llu, type=%d, conv=%d)\n",
++                   res->lockname.len, res->lockname.name,
++                   dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)),
++                   dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)),
++                   lock->ml.type, lock->ml.convert_type);
++              status = DLM_NORMAL;
++              goto bail;
++      }
++
+       res->state |= DLM_LOCK_RES_IN_PROGRESS;
+       /* move lock to local convert queue */
+       /* do not alter lock refcount.  switching lists. */
+@@ -316,11 +330,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm,
+       spin_lock(&res->spinlock);
+       res->state &= ~DLM_LOCK_RES_IN_PROGRESS;
+       lock->convert_pending = 0;
+-      /* if it failed, move it back to granted queue */
++      /* if it failed, move it back to granted queue.
++       * if master returns DLM_NORMAL and then down before sending ast,
++       * it may have already been moved to granted queue, reset to
++       * DLM_RECOVERING and retry convert */
+       if (status != DLM_NORMAL) {
+               if (status != DLM_NOTQUEUED)
+                       dlm_error(status);
+               dlm_revert_pending_convert(res, lock);
++      } else if ((res->state & DLM_LOCK_RES_RECOVERING) ||
++                      (old_owner != res->owner)) {
++              mlog(0, "res %.*s is in recovering or has been recovered.\n",
++                              res->lockname.len, res->lockname.name);
++              status = DLM_RECOVERING;
+       }
+ bail:
+       spin_unlock(&res->spinlock);
+diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
+index 4b93d96d244f..01be4e409a3f 100644
+--- a/fs/ocfs2/dlm/dlmrecovery.c
++++ b/fs/ocfs2/dlm/dlmrecovery.c
+@@ -2040,7 +2040,6 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt 
*dlm,
+                       dlm_lock_get(lock);
+                       if (lock->convert_pending) {
+                               /* move converting lock back to granted */
+-                              BUG_ON(i != DLM_CONVERTING_LIST);
+                               mlog(0, "node died with convert pending "
+                                    "on %.*s. move back to granted list.\n",
+                                    res->lockname.len, res->lockname.name);
+diff --git a/fs/open.c b/fs/open.c
+index 17679f2b2f1c..dbe5085f7d89 100644
+--- a/fs/open.c
++++ b/fs/open.c
+@@ -945,14 +945,12 @@ struct file *filp_open(const char *filename, int flags, 
umode_t mode)
+ EXPORT_SYMBOL(filp_open);
+ 
+ struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
+-                          const char *filename, int flags)
++                          const char *filename, int flags, umode_t mode)
+ {
+       struct open_flags op;
+-      int err = build_open_flags(flags, 0, &op);
++      int err = build_open_flags(flags, mode, &op);
+       if (err)
+               return ERR_PTR(err);
+-      if (flags & O_CREAT)
+-              return ERR_PTR(-EINVAL);
+       if (!filename && (flags & O_DIRECTORY))
+               if (!dentry->d_inode->i_op->lookup)
+                       return ERR_PTR(-ENOTDIR);
+diff --git a/fs/splice.c b/fs/splice.c
+index e64f59960ec5..cb29a106f71f 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -189,6 +189,9 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
+       unsigned int spd_pages = spd->nr_pages;
+       int ret, do_wakeup, page_nr;
+ 
++      if (!spd_pages)
++              return 0;
++
+       ret = 0;
+       do_wakeup = 0;
+       page_nr = 0;
+diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c
+index 01db96f60cf0..70433d8e11b8 100644
+--- a/fs/xfs/xfs_attr_list.c
++++ b/fs/xfs/xfs_attr_list.c
+@@ -205,8 +205,10 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context)
+                                       sbp->namelen,
+                                       sbp->valuelen,
+                                       &sbp->name[sbp->namelen]);
+-              if (error)
++              if (error) {
++                      kmem_free(sbuf);
+                       return error;
++              }
+               if (context->seen_enough)
+                       break;
+               cursor->offset++;
+@@ -452,14 +454,13 @@ xfs_attr3_leaf_list_int(
+                               args.rmtblkcnt = xfs_attr3_rmt_blocks(
+                                                       args.dp->i_mount, 
valuelen);
+                               retval = xfs_attr_rmtval_get(&args);
+-                              if (retval)
+-                                      return retval;
+-                              retval = context->put_listent(context,
+-                                              entry->flags,
+-                                              name_rmt->name,
+-                                              (int)name_rmt->namelen,
+-                                              valuelen,
+-                                              args.value);
++                              if (!retval)
++                                      retval = context->put_listent(context,
++                                                      entry->flags,
++                                                      name_rmt->name,
++                                                      (int)name_rmt->namelen,
++                                                      valuelen,
++                                                      args.value);
+                               kmem_free(args.value);
+                       } else {
+                               retval = context->put_listent(context,
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index 23b2a35d712e..42dd4c916781 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -2078,7 +2078,7 @@ extern long do_sys_open(int dfd, const char __user 
*filename, int flags,
+ extern struct file *file_open_name(struct filename *, int, umode_t);
+ extern struct file *filp_open(const char *, int, umode_t);
+ extern struct file *file_open_root(struct dentry *, struct vfsmount *,
+-                                 const char *, int);
++                                 const char *, int, umode_t);
+ extern struct file * dentry_open(const struct path *, int, const struct cred 
*);
+ extern int filp_close(struct file *, fl_owner_t id);
+ 
+diff --git a/include/linux/kernel.h b/include/linux/kernel.h
+index 196d1ea86df0..129438a741bb 100644
+--- a/include/linux/kernel.h
++++ b/include/linux/kernel.h
+@@ -595,7 +595,7 @@ do {                                                       
\
+ 
+ #define do_trace_printk(fmt, args...)                                 \
+ do {                                                                  \
+-      static const char *trace_printk_fmt                             \
++      static const char *trace_printk_fmt __used                      \
+               __attribute__((section("__trace_printk_fmt"))) =        \
+               __builtin_constant_p(fmt) ? fmt : NULL;                 \
+                                                                       \
+@@ -639,7 +639,7 @@ int __trace_printk(unsigned long ip, const char *fmt, ...);
+  */
+ 
+ #define trace_puts(str) ({                                            \
+-      static const char *trace_printk_fmt                             \
++      static const char *trace_printk_fmt __used                      \
+               __attribute__((section("__trace_printk_fmt"))) =        \
+               __builtin_constant_p(str) ? str : NULL;                 \
+                                                                       \
+@@ -661,7 +661,7 @@ extern void trace_dump_stack(int skip);
+ #define ftrace_vprintk(fmt, vargs)                                    \
+ do {                                                                  \
+       if (__builtin_constant_p(fmt)) {                                \
+-              static const char *trace_printk_fmt                     \
++              static const char *trace_printk_fmt __used              \
+                 __attribute__((section("__trace_printk_fmt"))) =      \
+                       __builtin_constant_p(fmt) ? fmt : NULL;         \
+                                                                       \
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index d662546f77d8..ecc6e129faa9 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -344,6 +344,7 @@ struct pci_dev {
+       unsigned int    __aer_firmware_first:1;
+       unsigned int    broken_intx_masking:1;
+       unsigned int    io_window_1k:1; /* Intel P2P bridge 1K I/O windows */
++      unsigned int    non_compliant_bars:1;   /* broken BARs; ignore them */
+       pci_dev_flags_t dev_flags;
+       atomic_t        enable_cnt;     /* pci_enable_device has been called */
+ 
+diff --git a/kernel/sched/core.c b/kernel/sched/core.c
+index 46afc8cd69dd..1ad2f185827e 100644
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -5064,6 +5064,7 @@ migration_call(struct notifier_block *nfb, unsigned long 
action, void *hcpu)
+ 
+       case CPU_UP_PREPARE:
+               rq->calc_load_update = calc_load_update;
++              account_reset_rq(rq);
+               break;
+ 
+       case CPU_ONLINE:
+diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
+index 675e147a86f2..3ecc6ce65517 100644
+--- a/kernel/sched/sched.h
++++ b/kernel/sched/sched.h
+@@ -1563,3 +1563,16 @@ static inline u64 irq_time_read(int cpu)
+ }
+ #endif /* CONFIG_64BIT */
+ #endif /* CONFIG_IRQ_TIME_ACCOUNTING */
++
++static inline void account_reset_rq(struct rq *rq)
++{
++#ifdef CONFIG_IRQ_TIME_ACCOUNTING
++      rq->prev_irq_time = 0;
++#endif
++#ifdef CONFIG_PARAVIRT
++      rq->prev_steal_time = 0;
++#endif
++#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING
++      rq->prev_steal_time_rq = 0;
++#endif
++}
+diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
+index 653cbbd9e7ad..b93763d780d6 100644
+--- a/kernel/sysctl_binary.c
++++ b/kernel/sysctl_binary.c
+@@ -1320,7 +1320,7 @@ static ssize_t binary_sysctl(const int *name, int nlen,
+       }
+ 
+       mnt = task_active_pid_ns(current)->proc_mnt;
+-      file = file_open_root(mnt->mnt_root, mnt, pathname, flags);
++      file = file_open_root(mnt->mnt_root, mnt, pathname, flags, 0);
+       result = PTR_ERR(file);
+       if (IS_ERR(file))
+               goto out_putname;
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index a2d62b3b90c7..6ea1b943fb1e 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -4457,7 +4457,10 @@ static ssize_t tracing_splice_read_pipe(struct file 
*filp,
+ 
+       spd.nr_pages = i;
+ 
+-      ret = splice_to_pipe(pipe, &spd);
++      if (i)
++              ret = splice_to_pipe(pipe, &spd);
++      else
++              ret = 0;
+ out:
+       splice_shrink_spd(&spd);
+       return ret;
+diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c
+index 2aefbee93a6d..56e083e26ca9 100644
+--- a/kernel/trace/trace_irqsoff.c
++++ b/kernel/trace/trace_irqsoff.c
+@@ -118,8 +118,12 @@ static int func_prolog_dec(struct trace_array *tr,
+               return 0;
+ 
+       local_save_flags(*flags);
+-      /* slight chance to get a false positive on tracing_cpu */
+-      if (!irqs_disabled_flags(*flags))
++      /*
++       * Slight chance to get a false positive on tracing_cpu,
++       * although I'm starting to think there isn't a chance.
++       * Leave this for now just to be paranoid.
++       */
++      if (!irqs_disabled_flags(*flags) && !preempt_count())
+               return 0;
+ 
+       *data = per_cpu_ptr(tr->trace_buffer.data, cpu);
+diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
+index 7c8cef653166..7b900474209d 100644
+--- a/kernel/trace/trace_printk.c
++++ b/kernel/trace/trace_printk.c
+@@ -292,6 +292,9 @@ static int t_show(struct seq_file *m, void *v)
+       const char *str = *fmt;
+       int i;
+ 
++      if (!*fmt)
++              return 0;
++
+       seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt);
+ 
+       /*
+diff --git a/scripts/coccinelle/iterators/use_after_iter.cocci 
b/scripts/coccinelle/iterators/use_after_iter.cocci
+index f085f5968c52..ce8cc9c006e5 100644
+--- a/scripts/coccinelle/iterators/use_after_iter.cocci
++++ b/scripts/coccinelle/iterators/use_after_iter.cocci
+@@ -123,7 +123,7 @@ list_remove_head(x,c,...)
+ |
+ sizeof(<+...c...+>)
+ |
+-&c->member
++ &c->member
+ |
+ c = E
+ |
+diff --git a/scripts/package/mkspec b/scripts/package/mkspec
+index 13957602f7ca..c92358d61e26 100755
+--- a/scripts/package/mkspec
++++ b/scripts/package/mkspec
+@@ -131,11 +131,11 @@ echo 'rm -rf $RPM_BUILD_ROOT'
+ echo ""
+ echo "%post"
+ echo "if [ -x /sbin/installkernel -a -r /boot/vmlinuz-$KERNELRELEASE -a -r 
/boot/System.map-$KERNELRELEASE ]; then"
+-echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm"
+-echo "cp /boot/System.map-$KERNELRELEASE /boot/System.map-$KERNELRELEASE-rpm"
++echo "cp /boot/vmlinuz-$KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm"
++echo "cp /boot/System.map-$KERNELRELEASE /boot/.System.map-$KERNELRELEASE-rpm"
+ echo "rm -f /boot/vmlinuz-$KERNELRELEASE /boot/System.map-$KERNELRELEASE"
+-echo "/sbin/installkernel $KERNELRELEASE /boot/vmlinuz-$KERNELRELEASE-rpm 
/boot/System.map-$KERNELRELEASE-rpm"
+-echo "rm -f /boot/vmlinuz-$KERNELRELEASE-rpm 
/boot/System.map-$KERNELRELEASE-rpm"
++echo "/sbin/installkernel $KERNELRELEASE /boot/.vmlinuz-$KERNELRELEASE-rpm 
/boot/.System.map-$KERNELRELEASE-rpm"
++echo "rm -f /boot/.vmlinuz-$KERNELRELEASE-rpm 
/boot/.System.map-$KERNELRELEASE-rpm"
+ echo "fi"
+ echo ""
+ echo "%files"
+diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c
+index eef182bea2ad..6d8151d949ca 100644
+--- a/sound/pci/hda/patch_cirrus.c
++++ b/sound/pci/hda/patch_cirrus.c
+@@ -177,8 +177,12 @@ static void cs_automute(struct hda_codec *codec)
+       snd_hda_gen_update_outputs(codec);
+ 
+       if (spec->gpio_eapd_hp || spec->gpio_eapd_speaker) {
+-              spec->gpio_data = spec->gen.hp_jack_present ?
+-                      spec->gpio_eapd_hp : spec->gpio_eapd_speaker;
++              if (spec->gen.automute_speaker)
++                      spec->gpio_data = spec->gen.hp_jack_present ?
++                              spec->gpio_eapd_hp : spec->gpio_eapd_speaker;
++              else
++                      spec->gpio_data =
++                              spec->gpio_eapd_hp | spec->gpio_eapd_speaker;
+               snd_hda_codec_write(codec, 0x01, 0,
+                                   AC_VERB_SET_GPIO_DATA, spec->gpio_data);
+       }
+diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
+index 08d8733604a2..339915647c9a 100644
+--- a/sound/pci/intel8x0.c
++++ b/sound/pci/intel8x0.c
+@@ -2884,6 +2884,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 
*chip)
+ 
+ static struct snd_pci_quirk intel8x0_clock_list[] = {
+       SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000),
++      SND_PCI_QUIRK(0x1014, 0x0581, "AD1981B", 48000),
+       SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100),
+       SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000),
+       SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000),
+diff --git a/sound/usb/clock.c b/sound/usb/clock.c
+index 86f80c60b21f..1329d7725196 100644
+--- a/sound/usb/clock.c
++++ b/sound/usb/clock.c
+@@ -283,6 +283,8 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, 
int iface,
+       unsigned char data[3];
+       int err, crate;
+ 
++      if (get_iface_desc(alts)->bNumEndpoints < 1)
++              return -EINVAL;
+       ep = get_endpoint(alts, 0)->bEndpointAddress;
+ 
+       /* if endpoint doesn't have sampling rate control, bail out */
+diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
+index 105ece3c14e3..c686ec8e8fa1 100644
+--- a/sound/usb/endpoint.c
++++ b/sound/usb/endpoint.c
+@@ -409,6 +409,9 @@ exit_clear:
+  *
+  * New endpoints will be added to chip->ep_list and must be freed by
+  * calling snd_usb_endpoint_free().
++ *
++ * For SND_USB_ENDPOINT_TYPE_SYNC, the caller needs to guarantee that
++ * bNumEndpoints > 1 beforehand.
+  */
+ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
+                                             struct usb_host_interface *alts,
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a82ec53b8fb3..aca30e600bde 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -1455,7 +1455,11 @@ static int snd_microii_spdif_default_get(struct 
snd_kcontrol *kcontrol,
+ 
+       /* use known values for that card: interface#1 altsetting#1 */
+       iface = usb_ifnum_to_if(mixer->chip->dev, 1);
++      if (!iface || iface->num_altsetting < 2)
++              return -EINVAL;
+       alts = &iface->altsetting[1];
++      if (get_iface_desc(alts)->bNumEndpoints < 1)
++              return -EINVAL;
+       ep = get_endpoint(alts, 0)->bEndpointAddress;
+ 
+       err = snd_usb_ctl_msg(mixer->chip->dev,
+diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
+index ede4b92710aa..d2fba888a485 100644
+--- a/sound/usb/pcm.c
++++ b/sound/usb/pcm.c
+@@ -159,6 +159,8 @@ static int init_pitch_v1(struct snd_usb_audio *chip, int 
iface,
+       unsigned char data[1];
+       int err;
+ 
++      if (get_iface_desc(alts)->bNumEndpoints < 1)
++              return -EINVAL;
+       ep = get_endpoint(alts, 0)->bEndpointAddress;
+ 
+       data[0] = 1;
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index 9a599b1bc6ba..2ad6ba95f02d 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -138,6 +138,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio 
*chip,
+               snd_printk(KERN_ERR "cannot memdup\n");
+               return -ENOMEM;
+       }
++      INIT_LIST_HEAD(&fp->list);
+       if (fp->nr_rates > MAX_NR_RATES) {
+               kfree(fp);
+               return -EINVAL;
+@@ -155,19 +156,20 @@ static int create_fixed_stream_quirk(struct 
snd_usb_audio *chip,
+       stream = (fp->endpoint & USB_DIR_IN)
+               ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
+       err = snd_usb_add_audio_stream(chip, stream, fp);
+-      if (err < 0) {
+-              kfree(fp);
+-              kfree(rate_table);
+-              return err;
+-      }
++      if (err < 0)
++              goto error;
+       if (fp->iface != 
get_iface_desc(&iface->altsetting[0])->bInterfaceNumber ||
+           fp->altset_idx >= iface->num_altsetting) {
+-              kfree(fp);
+-              kfree(rate_table);
+-              return -EINVAL;
++              err = -EINVAL;
++              goto error;
+       }
+       alts = &iface->altsetting[fp->altset_idx];
+       altsd = get_iface_desc(alts);
++      if (altsd->bNumEndpoints < 1) {
++              err = -EINVAL;
++              goto error;
++      }
++
+       fp->protocol = altsd->bInterfaceProtocol;
+ 
+       if (fp->datainterval == 0)
+@@ -178,6 +180,12 @@ static int create_fixed_stream_quirk(struct snd_usb_audio 
*chip,
+       snd_usb_init_pitch(chip, fp->iface, alts, fp);
+       snd_usb_init_sample_rate(chip, fp->iface, alts, fp, fp->rate_max);
+       return 0;
++
++ error:
++      list_del(&fp->list); /* unlink for avoiding double-free */
++      kfree(fp);
++      kfree(rate_table);
++      return err;
+ }
+ 
+ static int create_auto_pcm_quirk(struct snd_usb_audio *chip,
+@@ -450,6 +458,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip,
+       fp->ep_attr = get_endpoint(alts, 0)->bmAttributes;
+       fp->datainterval = 0;
+       fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
++      INIT_LIST_HEAD(&fp->list);
+ 
+       switch (fp->maxpacksize) {
+       case 0x120:
+@@ -473,6 +482,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip,
+               ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
+       err = snd_usb_add_audio_stream(chip, stream, fp);
+       if (err < 0) {
++              list_del(&fp->list); /* unlink for avoiding double-free */
+               kfree(fp);
+               return err;
+       }
+diff --git a/sound/usb/stream.c b/sound/usb/stream.c
+index 2fb71be5e100..f06c754c9783 100644
+--- a/sound/usb/stream.c
++++ b/sound/usb/stream.c
+@@ -315,7 +315,9 @@ static struct snd_pcm_chmap_elem *convert_chmap(int 
channels, unsigned int bits,
+ /*
+  * add this endpoint to the chip instance.
+  * if a stream with the same endpoint already exists, append to it.
+- * if not, create a new pcm stream.
++ * if not, create a new pcm stream. note, fp is added to the substream
++ * fmt_list and will be freed on the chip instance release. do not free
++ * fp or do remove it from the substream fmt_list to avoid double-free.
+  */
+ int snd_usb_add_audio_stream(struct snd_usb_audio *chip,
+                            int stream,
+@@ -662,6 +664,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio 
*chip, int iface_no)
+                                       * (fp->maxpacksize & 0x7ff);
+               fp->attributes = parse_uac_endpoint_attributes(chip, alts, 
protocol, iface_no);
+               fp->clock = clock;
++              INIT_LIST_HEAD(&fp->list);
+ 
+               /* some quirks for attributes here */
+ 
+@@ -710,6 +713,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio 
*chip, int iface_no)
+               snd_printdd(KERN_INFO "%d:%u:%d: add audio endpoint %#x\n", 
dev->devnum, iface_no, altno, fp->endpoint);
+               err = snd_usb_add_audio_stream(chip, stream, fp);
+               if (err < 0) {
++                      list_del(&fp->list); /* unlink for avoiding double-free 
*/
+                       kfree(fp->rate_table);
+                       kfree(fp->chmap);
+                       kfree(fp);
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index d7d950f51b55..9e5cd217ffaf 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -454,6 +454,16 @@ static struct kvm *kvm_create_vm(unsigned long type)
+       if (!kvm)
+               return ERR_PTR(-ENOMEM);
+ 
++      spin_lock_init(&kvm->mmu_lock);
++      atomic_inc(&current->mm->mm_count);
++      kvm->mm = current->mm;
++      kvm_eventfd_init(kvm);
++      mutex_init(&kvm->lock);
++      mutex_init(&kvm->irq_lock);
++      mutex_init(&kvm->slots_lock);
++      atomic_set(&kvm->users_count, 1);
++      INIT_LIST_HEAD(&kvm->devices);
++
+       r = kvm_arch_init_vm(kvm, type);
+       if (r)
+               goto out_err_nodisable;
+@@ -483,16 +493,6 @@ static struct kvm *kvm_create_vm(unsigned long type)
+                       goto out_err;
+       }
+ 
+-      spin_lock_init(&kvm->mmu_lock);
+-      kvm->mm = current->mm;
+-      atomic_inc(&kvm->mm->mm_count);
+-      kvm_eventfd_init(kvm);
+-      mutex_init(&kvm->lock);
+-      mutex_init(&kvm->irq_lock);
+-      mutex_init(&kvm->slots_lock);
+-      atomic_set(&kvm->users_count, 1);
+-      INIT_LIST_HEAD(&kvm->devices);
+-
+       r = kvm_init_mmu_notifier(kvm);
+       if (r)
+               goto out_err;
+@@ -512,6 +512,7 @@ out_err_nodisable:
+               kfree(kvm->buses[i]);
+       kfree(kvm->memslots);
+       kvm_arch_free_vm(kvm);
++      mmdrop(current->mm);
+       return ERR_PTR(r);
+ }
+ 

Reply via email to