commit:     05e153f62c470439f15a6039465f162032ea1643
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Mon Aug 22 23:27:31 2016 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Mon Aug 22 23:27:31 2016 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=05e153f6

Linux patch 3.18.40

 0000_README              |    4 +
 1039_linux-3.18.40.patch | 4290 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 4294 insertions(+)

diff --git a/0000_README b/0000_README
index 2568ef1..c85b470 100644
--- a/0000_README
+++ b/0000_README
@@ -199,6 +199,10 @@ Patch:  1038_linux-3.18.39.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.18.39
 
+Patch:  1039_linux-3.18.40.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.18.40
+
 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/1039_linux-3.18.40.patch b/1039_linux-3.18.40.patch
new file mode 100644
index 0000000..e19eec8
--- /dev/null
+++ b/1039_linux-3.18.40.patch
@@ -0,0 +1,4290 @@
+diff --git a/.mailmap b/.mailmap
+index 1ad68731fb47..cf92e1ea6fd3 100644
+--- a/.mailmap
++++ b/.mailmap
+@@ -78,6 +78,7 @@ Leonid I Ananiev <leonid.i.anan...@intel.com>
+ Linas Vepstas <li...@austin.ibm.com>
+ Mark Brown <broo...@sirena.org.uk>
+ Matthieu CASTET <castet.matth...@free.fr>
++Mauro Carvalho Chehab <mche...@kernel.org> <mauroche...@gmail.com> 
<mche...@infradead.org> <mche...@redhat.com> <m.che...@samsung.com> 
<mche...@osg.samsung.com> <mche...@s-opensource.com>
+ Mayuresh Janorkar <ma...@ti.com>
+ Michael Buesch <m...@bues.ch>
+ Michel Dänzer <mic...@tungstengraphics.com>
+diff --git a/CREDITS b/CREDITS
+index bb6278884f89..89d2297b70cb 100644
+--- a/CREDITS
++++ b/CREDITS
+@@ -636,6 +636,7 @@ D: Configure, Menuconfig, xconfig
+ 
+ N: Mauro Carvalho Chehab
+ E: m.che...@samsung.org
++E: mche...@osg.samsung.com
+ E: mche...@infradead.org
+ D: Media subsystem (V4L/DVB) drivers and core
+ D: EDAC drivers and EDAC 3.0 core rework
+diff --git a/Documentation/module-signing.txt 
b/Documentation/module-signing.txt
+index 09c2382ad055..e3af8c27eef2 100644
+--- a/Documentation/module-signing.txt
++++ b/Documentation/module-signing.txt
+@@ -239,3 +239,9 @@ Since the private key is used to sign modules, viruses and 
malware could use
+ the private key to sign modules and compromise the operating system.  The
+ private key must be either destroyed or moved to a secure location and not 
kept
+ in the root node of the kernel source tree.
++
++If you use the same private key to sign modules for multiple kernel
++configurations, you must ensure that the module version information is
++sufficient to prevent loading a module into a different kernel.  Either
++set CONFIG_MODVERSIONS=y or ensure that each configuration has a different
++kernel release string by changing EXTRAVERSION or CONFIG_LOCALVERSION.
+diff --git a/MAINTAINERS b/MAINTAINERS
+index f553cf7abe6a..bcfe54f2aa13 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -1828,7 +1828,8 @@ F:       include/net/ax25.h
+ F:    net/ax25/
+ 
+ AZ6007 DVB DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -2198,7 +2199,8 @@ F:       Documentation/filesystems/btrfs.txt
+ F:    fs/btrfs/
+ 
+ BTTV VIDEO4LINUX DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -2719,7 +2721,8 @@ F:       drivers/media/common/cx2341x*
+ F:    include/media/cx2341x*
+ 
+ CX88 VIDEO4LINUX DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -3402,7 +3405,8 @@ F:       fs/ecryptfs/
+ EDAC-CORE
+ M:    Doug Thompson <dougthomp...@xmission.com>
+ M:    Borislav Petkov <b...@alien8.de>
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-e...@vger.kernel.org
+ W:    bluesmoke.sourceforge.net
+ S:    Supported
+@@ -3451,7 +3455,8 @@ S:       Maintained
+ F:    drivers/edac/e7xxx_edac.c
+ 
+ EDAC-GHES
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-e...@vger.kernel.org
+ W:    bluesmoke.sourceforge.net
+ S:    Maintained
+@@ -3479,21 +3484,24 @@ S:     Maintained
+ F:    drivers/edac/i5000_edac.c
+ 
+ EDAC-I5400
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-e...@vger.kernel.org
+ W:    bluesmoke.sourceforge.net
+ S:    Maintained
+ F:    drivers/edac/i5400_edac.c
+ 
+ EDAC-I7300
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-e...@vger.kernel.org
+ W:    bluesmoke.sourceforge.net
+ S:    Maintained
+ F:    drivers/edac/i7300_edac.c
+ 
+ EDAC-I7CORE
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-e...@vger.kernel.org
+ W:    bluesmoke.sourceforge.net
+ S:    Maintained
+@@ -3536,7 +3544,8 @@ S:       Maintained
+ F:    drivers/edac/r82600_edac.c
+ 
+ EDAC-SBRIDGE
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-e...@vger.kernel.org
+ W:    bluesmoke.sourceforge.net
+ S:    Maintained
+@@ -3596,7 +3605,8 @@ S:       Maintained
+ F:    drivers/net/ethernet/ibm/ehea/
+ 
+ EM28XX VIDEO4LINUX DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -5962,7 +5972,8 @@ S:       Maintained
+ F:    drivers/media/radio/radio-maxiradio*
+ 
+ MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ P:    LinuxTV.org Project
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+@@ -8013,7 +8024,8 @@ S:       Odd Fixes
+ F:    drivers/media/i2c/saa6588*
+ 
+ SAA7134 VIDEO4LINUX DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -8471,7 +8483,8 @@ S:       Maintained
+ F:    drivers/media/radio/si4713/radio-usb-si4713.c
+ 
+ SIANO DVB DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -9160,7 +9173,8 @@ S:       Maintained
+ F:    drivers/media/i2c/tda9840*
+ 
+ TEA5761 TUNER DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -9168,7 +9182,8 @@ S:       Odd fixes
+ F:    drivers/media/tuners/tea5761.*
+ 
+ TEA5767 TUNER DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -9480,7 +9495,8 @@ F:       include/linux/shmem_fs.h
+ F:    mm/shmem.c
+ 
+ TM6000 VIDEO4LINUX DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+@@ -10301,7 +10317,8 @@ S:     Maintained
+ F:    arch/x86/kernel/cpu/mcheck/*
+ 
+ XC2028/3028 TUNER DRIVER
+-M:    Mauro Carvalho Chehab <mche...@osg.samsung.com>
++M:    Mauro Carvalho Chehab <mche...@s-opensource.com>
++M:    Mauro Carvalho Chehab <mche...@kernel.org>
+ L:    linux-me...@vger.kernel.org
+ W:    http://linuxtv.org
+ T:    git git://linuxtv.org/media_tree.git
+diff --git a/Makefile b/Makefile
+index 758b8efbb881..39e8b5638789 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 18
+-SUBLEVEL = 39
++SUBLEVEL = 40
+ EXTRAVERSION =
+ NAME = Diseased Newt
+ 
+diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
+index 7670f33b9ce2..b556b4ef9775 100644
+--- a/arch/arc/include/asm/pgtable.h
++++ b/arch/arc/include/asm/pgtable.h
+@@ -98,7 +98,7 @@
+ #define ___DEF (_PAGE_PRESENT | _PAGE_DEF_CACHEABLE)
+ 
+ /* Set of bits not changed in pte_modify */
+-#define _PAGE_CHG_MASK        (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED)
++#define _PAGE_CHG_MASK        (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED | 
_PAGE_SPECIAL)
+ 
+ /* More Abbrevaited helpers */
+ #define PAGE_U_NONE     __pgprot(___DEF)
+diff --git a/arch/arm/boot/dts/sun4i-a10-a1000.dts 
b/arch/arm/boot/dts/sun4i-a10-a1000.dts
+index 9e99ade35e37..0b43a186a36e 100644
+--- a/arch/arm/boot/dts/sun4i-a10-a1000.dts
++++ b/arch/arm/boot/dts/sun4i-a10-a1000.dts
+@@ -139,6 +139,7 @@
+               regulator-name = "emac-3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
++              startup-delay-us = <20000>;
+               enable-active-high;
+               gpio = <&pio 7 15 0>;
+       };
+diff --git a/arch/arm/boot/dts/sun4i-a10-hackberry.dts 
b/arch/arm/boot/dts/sun4i-a10-hackberry.dts
+index 891ea446abae..8ad4354b7feb 100644
+--- a/arch/arm/boot/dts/sun4i-a10-hackberry.dts
++++ b/arch/arm/boot/dts/sun4i-a10-hackberry.dts
+@@ -120,6 +120,7 @@
+               regulator-name = "emac-3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
++              startup-delay-us = <20000>;
+               enable-active-high;
+               gpio = <&pio 7 19 0>;
+       };
+diff --git a/arch/arm64/kernel/debug-monitors.c 
b/arch/arm64/kernel/debug-monitors.c
+index b056369fd47d..62c91b3b42e8 100644
+--- a/arch/arm64/kernel/debug-monitors.c
++++ b/arch/arm64/kernel/debug-monitors.c
+@@ -150,7 +150,6 @@ static int debug_monitors_init(void)
+       /* Clear the OS lock. */
+       on_each_cpu(clear_os_lock, NULL, 1);
+       isb();
+-      local_dbg_enable();
+ 
+       /* Register hotplug handler. */
+       __register_cpu_notifier(&os_lock_nb);
+diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
+index 0ef87896e4ae..a1f054549cb6 100644
+--- a/arch/arm64/kernel/smp.c
++++ b/arch/arm64/kernel/smp.c
+@@ -179,7 +179,6 @@ asmlinkage void secondary_start_kernel(void)
+       set_cpu_online(cpu, true);
+       complete(&cpu_running);
+ 
+-      local_dbg_enable();
+       local_irq_enable();
+       local_async_enable();
+ 
+diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
+index 4e778b13291b..302353d9150b 100644
+--- a/arch/arm64/mm/proc.S
++++ b/arch/arm64/mm/proc.S
+@@ -202,6 +202,8 @@ ENTRY(__cpu_setup)
+       mov     x0, #3 << 20
+       msr     cpacr_el1, x0                   // Enable FP/ASIMD
+       msr     mdscr_el1, xzr                  // Reset mdscr_el1
++      isb                                     // Unmask debug exceptions now,
++      enable_dbg                              // since this is per-cpu
+       /*
+        * Memory region attributes for LPAE:
+        *
+diff --git a/arch/metag/include/asm/cmpxchg_lnkget.h 
b/arch/metag/include/asm/cmpxchg_lnkget.h
+index 0154e2807ebb..2369ad394876 100644
+--- a/arch/metag/include/asm/cmpxchg_lnkget.h
++++ b/arch/metag/include/asm/cmpxchg_lnkget.h
+@@ -73,7 +73,7 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, 
unsigned long old,
+                     " DCACHE  [%2], %0\n"
+ #endif
+                     "2:\n"
+-                    : "=&d" (temp), "=&da" (retval)
++                    : "=&d" (temp), "=&d" (retval)
+                     : "da" (m), "bd" (old), "da" (new)
+                     : "cc"
+                     );
+diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
+index a8eb6575edc0..9a47c1233d2a 100644
+--- a/arch/mips/kernel/scall64-n32.S
++++ b/arch/mips/kernel/scall64-n32.S
+@@ -353,7 +353,7 @@ EXPORT(sysn32_call_table)
+       PTR     sys_ni_syscall                  /* available, was setaltroot */
+       PTR     sys_add_key
+       PTR     sys_request_key
+-      PTR     sys_keyctl                      /* 6245 */
++      PTR     compat_sys_keyctl               /* 6245 */
+       PTR     sys_set_thread_area
+       PTR     sys_inotify_init
+       PTR     sys_inotify_add_watch
+diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
+index 6f8db9f728e8..8be0757e34cd 100644
+--- a/arch/mips/kernel/scall64-o32.S
++++ b/arch/mips/kernel/scall64-o32.S
+@@ -491,7 +491,7 @@ EXPORT(sys32_call_table)
+       PTR     sys_ni_syscall                  /* available, was setaltroot */
+       PTR     sys_add_key                     /* 4280 */
+       PTR     sys_request_key
+-      PTR     sys_keyctl
++      PTR     compat_sys_keyctl
+       PTR     sys_set_thread_area
+       PTR     sys_inotify_init
+       PTR     sys_inotify_add_watch           /* 4285 */
+diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
+index 2a324f4cb1b9..08225a352477 100644
+--- a/arch/powerpc/kernel/tm.S
++++ b/arch/powerpc/kernel/tm.S
+@@ -110,17 +110,11 @@ _GLOBAL(tm_reclaim)
+       std     r3, STK_PARAM(R3)(r1)
+       SAVE_NVGPRS(r1)
+ 
+-      /* We need to setup MSR for VSX register save instructions.  Here we
+-       * also clear the MSR RI since when we do the treclaim, we won't have a
+-       * valid kernel pointer for a while.  We clear RI here as it avoids
+-       * adding another mtmsr closer to the treclaim.  This makes the region
+-       * maked as non-recoverable wider than it needs to be but it saves on
+-       * inserting another mtmsrd later.
+-       */
++      /* We need to setup MSR for VSX register save instructions. */
+       mfmsr   r14
+       mr      r15, r14
+       ori     r15, r15, MSR_FP
+-      li      r16, MSR_RI
++      li      r16, 0
+       ori     r16, r16, MSR_EE /* IRQs hard off */
+       andc    r15, r15, r16
+       oris    r15, r15, MSR_VEC@h
+@@ -176,7 +170,17 @@ dont_backup_fp:
+ 1:    tdeqi   r6, 0
+       EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,0
+ 
+-      /* The moment we treclaim, ALL of our GPRs will switch
++      /* Clear MSR RI since we are about to change r1, EE is already off. */
++      li      r4, 0
++      mtmsrd  r4, 1
++
++      /*
++       * BE CAREFUL HERE:
++       * At this point we can't take an SLB miss since we have MSR_RI
++       * off. Load only to/from the stack/paca which are in SLB bolted regions
++       * until we turn MSR RI back on.
++       *
++       * The moment we treclaim, ALL of our GPRs will switch
+        * to user register state.  (FPRs, CCR etc. also!)
+        * Use an sprg and a tm_scratch in the PACA to shuffle.
+        */
+@@ -197,6 +201,11 @@ dont_backup_fp:
+ 
+       /* Store the PPR in r11 and reset to decent value */
+       std     r11, GPR11(r1)                  /* Temporary stash */
++
++      /* Reset MSR RI so we can take SLB faults again */
++      li      r11, MSR_RI
++      mtmsrd  r11, 1
++
+       mfspr   r11, SPRN_PPR
+       HMT_MEDIUM
+ 
+@@ -329,8 +338,6 @@ _GLOBAL(__tm_recheckpoint)
+        */
+       subi    r7, r7, STACK_FRAME_OVERHEAD
+ 
+-      SET_SCRATCH0(r1)
+-
+       mfmsr   r6
+       /* R4 = original MSR to indicate whether thread used FP/Vector etc. */
+ 
+@@ -397,11 +404,6 @@ restore_gprs:
+       ld      r5, THREAD_TM_DSCR(r3)
+       ld      r6, THREAD_TM_PPR(r3)
+ 
+-      /* Clear the MSR RI since we are about to change R1.  EE is already off
+-       */
+-      li      r4, 0
+-      mtmsrd  r4, 1
+-
+       REST_GPR(0, r7)                         /* GPR0 */
+       REST_2GPRS(2, r7)                       /* GPR2-3 */
+       REST_GPR(4, r7)                         /* GPR4 */
+@@ -439,10 +441,34 @@ restore_gprs:
+       ld      r6, _CCR(r7)
+       mtcr    r6
+ 
+-      REST_GPR(1, r7)                         /* GPR1 */
+-      REST_GPR(5, r7)                         /* GPR5-7 */
+       REST_GPR(6, r7)
+-      ld      r7, GPR7(r7)
++
++      /*
++       * Store r1 and r5 on the stack so that we can access them
++       * after we clear MSR RI.
++       */
++
++      REST_GPR(5, r7)
++      std     r5, -8(r1)
++      ld      r5, GPR1(r7)
++      std     r5, -16(r1)
++
++      REST_GPR(7, r7)
++
++      /* Clear MSR RI since we are about to change r1. EE is already off */
++      li      r5, 0
++      mtmsrd  r5, 1
++
++      /*
++       * BE CAREFUL HERE:
++       * At this point we can't take an SLB miss since we have MSR_RI
++       * off. Load only to/from the stack/paca which are in SLB bolted regions
++       * until we turn MSR RI back on.
++       */
++
++      SET_SCRATCH0(r1)
++      ld      r5, -8(r1)
++      ld      r1, -16(r1)
+ 
+       /* Commit register state as checkpointed state: */
+       TRECHKPT
+diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S 
b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+index 4329ea316683..549d28fdc291 100644
+--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
++++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+@@ -632,112 +632,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
+ 
+ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+ BEGIN_FTR_SECTION
+-      b       skip_tm
+-END_FTR_SECTION_IFCLR(CPU_FTR_TM)
+-
+-      /* Turn on TM/FP/VSX/VMX so we can restore them. */
+-      mfmsr   r5
+-      li      r6, MSR_TM >> 32
+-      sldi    r6, r6, 32
+-      or      r5, r5, r6
+-      ori     r5, r5, MSR_FP
+-      oris    r5, r5, (MSR_VEC | MSR_VSX)@h
+-      mtmsrd  r5
+-
+-      /*
+-       * The user may change these outside of a transaction, so they must
+-       * always be context switched.
+-       */
+-      ld      r5, VCPU_TFHAR(r4)
+-      ld      r6, VCPU_TFIAR(r4)
+-      ld      r7, VCPU_TEXASR(r4)
+-      mtspr   SPRN_TFHAR, r5
+-      mtspr   SPRN_TFIAR, r6
+-      mtspr   SPRN_TEXASR, r7
+-
+-      ld      r5, VCPU_MSR(r4)
+-      rldicl. r5, r5, 64 - MSR_TS_S_LG, 62
+-      beq     skip_tm /* TM not active in guest */
+-
+-      /* Make sure the failure summary is set, otherwise we'll program check
+-       * when we trechkpt.  It's possible that this might have been not set
+-       * on a kvmppc_set_one_reg() call but we shouldn't let this crash the
+-       * host.
+-       */
+-      oris    r7, r7, (TEXASR_FS)@h
+-      mtspr   SPRN_TEXASR, r7
+-
+-      /*
+-       * We need to load up the checkpointed state for the guest.
+-       * We need to do this early as it will blow away any GPRs, VSRs and
+-       * some SPRs.
+-       */
+-
+-      mr      r31, r4
+-      addi    r3, r31, VCPU_FPRS_TM
+-      bl      load_fp_state
+-      addi    r3, r31, VCPU_VRS_TM
+-      bl      load_vr_state
+-      mr      r4, r31
+-      lwz     r7, VCPU_VRSAVE_TM(r4)
+-      mtspr   SPRN_VRSAVE, r7
+-
+-      ld      r5, VCPU_LR_TM(r4)
+-      lwz     r6, VCPU_CR_TM(r4)
+-      ld      r7, VCPU_CTR_TM(r4)
+-      ld      r8, VCPU_AMR_TM(r4)
+-      ld      r9, VCPU_TAR_TM(r4)
+-      mtlr    r5
+-      mtcr    r6
+-      mtctr   r7
+-      mtspr   SPRN_AMR, r8
+-      mtspr   SPRN_TAR, r9
+-
+-      /*
+-       * Load up PPR and DSCR values but don't put them in the actual SPRs
+-       * till the last moment to avoid running with userspace PPR and DSCR for
+-       * too long.
+-       */
+-      ld      r29, VCPU_DSCR_TM(r4)
+-      ld      r30, VCPU_PPR_TM(r4)
+-
+-      std     r2, PACATMSCRATCH(r13) /* Save TOC */
+-
+-      /* Clear the MSR RI since r1, r13 are all going to be foobar. */
+-      li      r5, 0
+-      mtmsrd  r5, 1
+-
+-      /* Load GPRs r0-r28 */
+-      reg = 0
+-      .rept   29
+-      ld      reg, VCPU_GPRS_TM(reg)(r31)
+-      reg = reg + 1
+-      .endr
+-
+-      mtspr   SPRN_DSCR, r29
+-      mtspr   SPRN_PPR, r30
+-
+-      /* Load final GPRs */
+-      ld      29, VCPU_GPRS_TM(29)(r31)
+-      ld      30, VCPU_GPRS_TM(30)(r31)
+-      ld      31, VCPU_GPRS_TM(31)(r31)
+-
+-      /* TM checkpointed state is now setup.  All GPRs are now volatile. */
+-      TRECHKPT
+-
+-      /* Now let's get back the state we need. */
+-      HMT_MEDIUM
+-      GET_PACA(r13)
+-      ld      r29, HSTATE_DSCR(r13)
+-      mtspr   SPRN_DSCR, r29
+-      ld      r4, HSTATE_KVM_VCPU(r13)
+-      ld      r1, HSTATE_HOST_R1(r13)
+-      ld      r2, PACATMSCRATCH(r13)
+-
+-      /* Set the MSR RI since we have our registers back. */
+-      li      r5, MSR_RI
+-      mtmsrd  r5, 1
+-skip_tm:
++      bl      kvmppc_restore_tm
++END_FTR_SECTION_IFSET(CPU_FTR_TM)
+ #endif
+ 
+       /* Load guest PMU registers */
+@@ -828,12 +724,6 @@ BEGIN_FTR_SECTION
+       /* Skip next section on POWER7 or PPC970 */
+       b       8f
+ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
+-      /* Turn on TM so we can access TFHAR/TFIAR/TEXASR */
+-      mfmsr   r8
+-      li      r0, 1
+-      rldimi  r8, r0, MSR_TM_LG, 63-MSR_TM_LG
+-      mtmsrd  r8
+-
+       /* Load up POWER8-specific registers */
+       ld      r5, VCPU_IAMR(r4)
+       lwz     r6, VCPU_PSPB(r4)
+@@ -1354,106 +1244,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
+ 
+ #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+ BEGIN_FTR_SECTION
+-      b       2f
+-END_FTR_SECTION_IFCLR(CPU_FTR_TM)
+-      /* Turn on TM. */
+-      mfmsr   r8
+-      li      r0, 1
+-      rldimi  r8, r0, MSR_TM_LG, 63-MSR_TM_LG
+-      mtmsrd  r8
+-
+-      ld      r5, VCPU_MSR(r9)
+-      rldicl. r5, r5, 64 - MSR_TS_S_LG, 62
+-      beq     1f      /* TM not active in guest. */
+-
+-      li      r3, TM_CAUSE_KVM_RESCHED
+-
+-      /* Clear the MSR RI since r1, r13 are all going to be foobar. */
+-      li      r5, 0
+-      mtmsrd  r5, 1
+-
+-      /* All GPRs are volatile at this point. */
+-      TRECLAIM(R3)
+-
+-      /* Temporarily store r13 and r9 so we have some regs to play with */
+-      SET_SCRATCH0(r13)
+-      GET_PACA(r13)
+-      std     r9, PACATMSCRATCH(r13)
+-      ld      r9, HSTATE_KVM_VCPU(r13)
+-
+-      /* Get a few more GPRs free. */
+-      std     r29, VCPU_GPRS_TM(29)(r9)
+-      std     r30, VCPU_GPRS_TM(30)(r9)
+-      std     r31, VCPU_GPRS_TM(31)(r9)
+-
+-      /* Save away PPR and DSCR soon so don't run with user values. */
+-      mfspr   r31, SPRN_PPR
+-      HMT_MEDIUM
+-      mfspr   r30, SPRN_DSCR
+-      ld      r29, HSTATE_DSCR(r13)
+-      mtspr   SPRN_DSCR, r29
+-
+-      /* Save all but r9, r13 & r29-r31 */
+-      reg = 0
+-      .rept   29
+-      .if (reg != 9) && (reg != 13)
+-      std     reg, VCPU_GPRS_TM(reg)(r9)
+-      .endif
+-      reg = reg + 1
+-      .endr
+-      /* ... now save r13 */
+-      GET_SCRATCH0(r4)
+-      std     r4, VCPU_GPRS_TM(13)(r9)
+-      /* ... and save r9 */
+-      ld      r4, PACATMSCRATCH(r13)
+-      std     r4, VCPU_GPRS_TM(9)(r9)
+-
+-      /* Reload stack pointer and TOC. */
+-      ld      r1, HSTATE_HOST_R1(r13)
+-      ld      r2, PACATOC(r13)
+-
+-      /* Set MSR RI now we have r1 and r13 back. */
+-      li      r5, MSR_RI
+-      mtmsrd  r5, 1
+-
+-      /* Save away checkpinted SPRs. */
+-      std     r31, VCPU_PPR_TM(r9)
+-      std     r30, VCPU_DSCR_TM(r9)
+-      mflr    r5
+-      mfcr    r6
+-      mfctr   r7
+-      mfspr   r8, SPRN_AMR
+-      mfspr   r10, SPRN_TAR
+-      std     r5, VCPU_LR_TM(r9)
+-      stw     r6, VCPU_CR_TM(r9)
+-      std     r7, VCPU_CTR_TM(r9)
+-      std     r8, VCPU_AMR_TM(r9)
+-      std     r10, VCPU_TAR_TM(r9)
+-
+-      /* Restore r12 as trap number. */
+-      lwz     r12, VCPU_TRAP(r9)
+-
+-      /* Save FP/VSX. */
+-      addi    r3, r9, VCPU_FPRS_TM
+-      bl      store_fp_state
+-      addi    r3, r9, VCPU_VRS_TM
+-      bl      store_vr_state
+-      mfspr   r6, SPRN_VRSAVE
+-      stw     r6, VCPU_VRSAVE_TM(r9)
+-1:
+-      /*
+-       * We need to save these SPRs after the treclaim so that the software
+-       * error code is recorded correctly in the TEXASR.  Also the user may
+-       * change these outside of a transaction, so they must always be
+-       * context switched.
+-       */
+-      mfspr   r5, SPRN_TFHAR
+-      mfspr   r6, SPRN_TFIAR
+-      mfspr   r7, SPRN_TEXASR
+-      std     r5, VCPU_TFHAR(r9)
+-      std     r6, VCPU_TFIAR(r9)
+-      std     r7, VCPU_TEXASR(r9)
+-2:
++      bl      kvmppc_save_tm
++END_FTR_SECTION_IFSET(CPU_FTR_TM)
+ #endif
+ 
+       /* Increment yield count if they have a VPA */
+@@ -2181,6 +1973,13 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206)
+       /* save FP state */
+       bl      kvmppc_save_fp
+ 
++#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
++BEGIN_FTR_SECTION
++      ld      r9, HSTATE_KVM_VCPU(r13)
++      bl      kvmppc_save_tm
++END_FTR_SECTION_IFSET(CPU_FTR_TM)
++#endif
++
+       /*
+        * Take a nap until a decrementer or external or doobell interrupt
+        * occurs, with PECE1, PECE0 and PECEDP set in LPCR. Also clear the
+@@ -2220,6 +2019,12 @@ kvm_end_cede:
+       /* Woken by external or decrementer interrupt */
+       ld      r1, HSTATE_HOST_R1(r13)
+ 
++#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
++BEGIN_FTR_SECTION
++      bl      kvmppc_restore_tm
++END_FTR_SECTION_IFSET(CPU_FTR_TM)
++#endif
++
+       /* load up FP state */
+       bl      kvmppc_load_fp
+ 
+@@ -2500,6 +2305,239 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
+       mr      r4,r31
+       blr
+ 
++#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
++/*
++ * Save transactional state and TM-related registers.
++ * Called with r9 pointing to the vcpu struct.
++ * This can modify all checkpointed registers, but
++ * restores r1, r2 and r9 (vcpu pointer) before exit.
++ */
++kvmppc_save_tm:
++      mflr    r0
++      std     r0, PPC_LR_STKOFF(r1)
++
++      /* Turn on TM. */
++      mfmsr   r8
++      li      r0, 1
++      rldimi  r8, r0, MSR_TM_LG, 63-MSR_TM_LG
++      mtmsrd  r8
++
++      ld      r5, VCPU_MSR(r9)
++      rldicl. r5, r5, 64 - MSR_TS_S_LG, 62
++      beq     1f      /* TM not active in guest. */
++
++      std     r1, HSTATE_HOST_R1(r13)
++      li      r3, TM_CAUSE_KVM_RESCHED
++
++      /* Clear the MSR RI since r1, r13 are all going to be foobar. */
++      li      r5, 0
++      mtmsrd  r5, 1
++
++      /* All GPRs are volatile at this point. */
++      TRECLAIM(R3)
++
++      /* Temporarily store r13 and r9 so we have some regs to play with */
++      SET_SCRATCH0(r13)
++      GET_PACA(r13)
++      std     r9, PACATMSCRATCH(r13)
++      ld      r9, HSTATE_KVM_VCPU(r13)
++
++      /* Get a few more GPRs free. */
++      std     r29, VCPU_GPRS_TM(29)(r9)
++      std     r30, VCPU_GPRS_TM(30)(r9)
++      std     r31, VCPU_GPRS_TM(31)(r9)
++
++      /* Save away PPR and DSCR soon so don't run with user values. */
++      mfspr   r31, SPRN_PPR
++      HMT_MEDIUM
++      mfspr   r30, SPRN_DSCR
++      ld      r29, HSTATE_DSCR(r13)
++      mtspr   SPRN_DSCR, r29
++
++      /* Save all but r9, r13 & r29-r31 */
++      reg = 0
++      .rept   29
++      .if (reg != 9) && (reg != 13)
++      std     reg, VCPU_GPRS_TM(reg)(r9)
++      .endif
++      reg = reg + 1
++      .endr
++      /* ... now save r13 */
++      GET_SCRATCH0(r4)
++      std     r4, VCPU_GPRS_TM(13)(r9)
++      /* ... and save r9 */
++      ld      r4, PACATMSCRATCH(r13)
++      std     r4, VCPU_GPRS_TM(9)(r9)
++
++      /* Reload stack pointer and TOC. */
++      ld      r1, HSTATE_HOST_R1(r13)
++      ld      r2, PACATOC(r13)
++
++      /* Set MSR RI now we have r1 and r13 back. */
++      li      r5, MSR_RI
++      mtmsrd  r5, 1
++
++      /* Save away checkpinted SPRs. */
++      std     r31, VCPU_PPR_TM(r9)
++      std     r30, VCPU_DSCR_TM(r9)
++      mflr    r5
++      mfcr    r6
++      mfctr   r7
++      mfspr   r8, SPRN_AMR
++      mfspr   r10, SPRN_TAR
++      std     r5, VCPU_LR_TM(r9)
++      stw     r6, VCPU_CR_TM(r9)
++      std     r7, VCPU_CTR_TM(r9)
++      std     r8, VCPU_AMR_TM(r9)
++      std     r10, VCPU_TAR_TM(r9)
++
++      /* Restore r12 as trap number. */
++      lwz     r12, VCPU_TRAP(r9)
++
++      /* Save FP/VSX. */
++      addi    r3, r9, VCPU_FPRS_TM
++      bl      store_fp_state
++      addi    r3, r9, VCPU_VRS_TM
++      bl      store_vr_state
++      mfspr   r6, SPRN_VRSAVE
++      stw     r6, VCPU_VRSAVE_TM(r9)
++1:
++      /*
++       * We need to save these SPRs after the treclaim so that the software
++       * error code is recorded correctly in the TEXASR.  Also the user may
++       * change these outside of a transaction, so they must always be
++       * context switched.
++       */
++      mfspr   r5, SPRN_TFHAR
++      mfspr   r6, SPRN_TFIAR
++      mfspr   r7, SPRN_TEXASR
++      std     r5, VCPU_TFHAR(r9)
++      std     r6, VCPU_TFIAR(r9)
++      std     r7, VCPU_TEXASR(r9)
++
++      ld      r0, PPC_LR_STKOFF(r1)
++      mtlr    r0
++      blr
++
++/*
++ * Restore transactional state and TM-related registers.
++ * Called with r4 pointing to the vcpu struct.
++ * This potentially modifies all checkpointed registers.
++ * It restores r1, r2, r4 from the PACA.
++ */
++kvmppc_restore_tm:
++      mflr    r0
++      std     r0, PPC_LR_STKOFF(r1)
++
++      /* Turn on TM/FP/VSX/VMX so we can restore them. */
++      mfmsr   r5
++      li      r6, MSR_TM >> 32
++      sldi    r6, r6, 32
++      or      r5, r5, r6
++      ori     r5, r5, MSR_FP
++      oris    r5, r5, (MSR_VEC | MSR_VSX)@h
++      mtmsrd  r5
++
++      /*
++       * The user may change these outside of a transaction, so they must
++       * always be context switched.
++       */
++      ld      r5, VCPU_TFHAR(r4)
++      ld      r6, VCPU_TFIAR(r4)
++      ld      r7, VCPU_TEXASR(r4)
++      mtspr   SPRN_TFHAR, r5
++      mtspr   SPRN_TFIAR, r6
++      mtspr   SPRN_TEXASR, r7
++
++      ld      r5, VCPU_MSR(r4)
++      rldicl. r5, r5, 64 - MSR_TS_S_LG, 62
++      beqlr           /* TM not active in guest */
++      std     r1, HSTATE_HOST_R1(r13)
++
++      /* Make sure the failure summary is set, otherwise we'll program check
++       * when we trechkpt.  It's possible that this might have been not set
++       * on a kvmppc_set_one_reg() call but we shouldn't let this crash the
++       * host.
++       */
++      oris    r7, r7, (TEXASR_FS)@h
++      mtspr   SPRN_TEXASR, r7
++
++      /*
++       * We need to load up the checkpointed state for the guest.
++       * We need to do this early as it will blow away any GPRs, VSRs and
++       * some SPRs.
++       */
++
++      mr      r31, r4
++      addi    r3, r31, VCPU_FPRS_TM
++      bl      load_fp_state
++      addi    r3, r31, VCPU_VRS_TM
++      bl      load_vr_state
++      mr      r4, r31
++      lwz     r7, VCPU_VRSAVE_TM(r4)
++      mtspr   SPRN_VRSAVE, r7
++
++      ld      r5, VCPU_LR_TM(r4)
++      lwz     r6, VCPU_CR_TM(r4)
++      ld      r7, VCPU_CTR_TM(r4)
++      ld      r8, VCPU_AMR_TM(r4)
++      ld      r9, VCPU_TAR_TM(r4)
++      mtlr    r5
++      mtcr    r6
++      mtctr   r7
++      mtspr   SPRN_AMR, r8
++      mtspr   SPRN_TAR, r9
++
++      /*
++       * Load up PPR and DSCR values but don't put them in the actual SPRs
++       * till the last moment to avoid running with userspace PPR and DSCR for
++       * too long.
++       */
++      ld      r29, VCPU_DSCR_TM(r4)
++      ld      r30, VCPU_PPR_TM(r4)
++
++      std     r2, PACATMSCRATCH(r13) /* Save TOC */
++
++      /* Clear the MSR RI since r1, r13 are all going to be foobar. */
++      li      r5, 0
++      mtmsrd  r5, 1
++
++      /* Load GPRs r0-r28 */
++      reg = 0
++      .rept   29
++      ld      reg, VCPU_GPRS_TM(reg)(r31)
++      reg = reg + 1
++      .endr
++
++      mtspr   SPRN_DSCR, r29
++      mtspr   SPRN_PPR, r30
++
++      /* Load final GPRs */
++      ld      29, VCPU_GPRS_TM(29)(r31)
++      ld      30, VCPU_GPRS_TM(30)(r31)
++      ld      31, VCPU_GPRS_TM(31)(r31)
++
++      /* TM checkpointed state is now setup.  All GPRs are now volatile. */
++      TRECHKPT
++
++      /* Now let's get back the state we need. */
++      HMT_MEDIUM
++      GET_PACA(r13)
++      ld      r29, HSTATE_DSCR(r13)
++      mtspr   SPRN_DSCR, r29
++      ld      r4, HSTATE_KVM_VCPU(r13)
++      ld      r1, HSTATE_HOST_R1(r13)
++      ld      r2, PACATMSCRATCH(r13)
++
++      /* Set the MSR RI since we have our registers back. */
++      li      r5, MSR_RI
++      mtmsrd  r5, 1
++
++      ld      r0, PPC_LR_STKOFF(r1)
++      mtlr    r0
++      blr
++#endif
++
+ /*
+  * We come here if we get any exception or interrupt while we are
+  * executing host real mode code while in guest MMU context.
+diff --git a/arch/powerpc/platforms/pseries/iommu.c 
b/arch/powerpc/platforms/pseries/iommu.c
+index e32e00976a94..05a2c9eefc08 100644
+--- a/arch/powerpc/platforms/pseries/iommu.c
++++ b/arch/powerpc/platforms/pseries/iommu.c
+@@ -825,7 +825,8 @@ machine_arch_initcall(pseries, find_existing_ddw_windows);
+ static int query_ddw(struct pci_dev *dev, const u32 *ddw_avail,
+                       struct ddw_query_response *query)
+ {
+-      struct eeh_dev *edev;
++      struct device_node *dn;
++      struct pci_dn *pdn;
+       u32 cfg_addr;
+       u64 buid;
+       int ret;
+@@ -836,11 +837,10 @@ static int query_ddw(struct pci_dev *dev, const u32 
*ddw_avail,
+        * Retrieve them from the pci device, not the node with the
+        * dma-window property
+        */
+-      edev = pci_dev_to_eeh_dev(dev);
+-      cfg_addr = edev->config_addr;
+-      if (edev->pe_config_addr)
+-              cfg_addr = edev->pe_config_addr;
+-      buid = edev->phb->buid;
++      dn = pci_device_to_OF_node(dev);
++      pdn = PCI_DN(dn);
++      buid = pdn->phb->buid;
++      cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
+ 
+       ret = rtas_call(ddw_avail[0], 3, 5, (u32 *)query,
+                 cfg_addr, BUID_HI(buid), BUID_LO(buid));
+@@ -854,7 +854,8 @@ static int create_ddw(struct pci_dev *dev, const u32 
*ddw_avail,
+                       struct ddw_create_response *create, int page_shift,
+                       int window_shift)
+ {
+-      struct eeh_dev *edev;
++      struct device_node *dn;
++      struct pci_dn *pdn;
+       u32 cfg_addr;
+       u64 buid;
+       int ret;
+@@ -865,11 +866,10 @@ static int create_ddw(struct pci_dev *dev, const u32 
*ddw_avail,
+        * Retrieve them from the pci device, not the node with the
+        * dma-window property
+        */
+-      edev = pci_dev_to_eeh_dev(dev);
+-      cfg_addr = edev->config_addr;
+-      if (edev->pe_config_addr)
+-              cfg_addr = edev->pe_config_addr;
+-      buid = edev->phb->buid;
++      dn = pci_device_to_OF_node(dev);
++      pdn = PCI_DN(dn);
++      buid = pdn->phb->buid;
++      cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
+ 
+       do {
+               /* extra outputs are LIOBN and dma-addr (hi, lo) */
+diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
+index 1b79ca67392f..35fde2a24751 100644
+--- a/arch/s390/mm/pgtable.c
++++ b/arch/s390/mm/pgtable.c
+@@ -207,7 +207,7 @@ EXPORT_SYMBOL_GPL(gmap_alloc);
+ static void gmap_flush_tlb(struct gmap *gmap)
+ {
+       if (MACHINE_HAS_IDTE)
+-              __tlb_flush_asce(gmap->mm, gmap->asce);
++              __tlb_flush_idte(gmap->asce);
+       else
+               __tlb_flush_global();
+ }
+@@ -246,7 +246,7 @@ void gmap_free(struct gmap *gmap)
+ 
+       /* Flush tlb. */
+       if (MACHINE_HAS_IDTE)
+-              __tlb_flush_asce(gmap->mm, gmap->asce);
++              __tlb_flush_idte(gmap->asce);
+       else
+               __tlb_flush_global();
+ 
+diff --git a/arch/x86/kernel/cpu/perf_event_intel.c 
b/arch/x86/kernel/cpu/perf_event_intel.c
+index df11583a9041..22fbeafa140b 100644
+--- a/arch/x86/kernel/cpu/perf_event_intel.c
++++ b/arch/x86/kernel/cpu/perf_event_intel.c
+@@ -2609,7 +2609,7 @@ __init int intel_pmu_init(void)
+                               c->idxmsk64 |= (1ULL << x86_pmu.num_counters) - 
1;
+                       }
+                       c->idxmsk64 &=
+-                              ~(~0UL << (INTEL_PMC_IDX_FIXED + 
x86_pmu.num_counters_fixed));
++                              ~(~0ULL << (INTEL_PMC_IDX_FIXED + 
x86_pmu.num_counters_fixed));
+                       c->weight = hweight64(c->idxmsk64);
+               }
+       }
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index d9c11f3f5b18..888eaab57fbc 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -7767,14 +7767,29 @@ static void vmx_load_vmcs01(struct kvm_vcpu *vcpu)
+       put_cpu();
+ }
+ 
++/*
++ * Ensure that the current vmcs of the logical processor is the
++ * vmcs01 of the vcpu before calling free_nested().
++ */
++static void vmx_free_vcpu_nested(struct kvm_vcpu *vcpu)
++{
++       struct vcpu_vmx *vmx = to_vmx(vcpu);
++       int r;
++
++       r = vcpu_load(vcpu);
++       BUG_ON(r);
++       vmx_load_vmcs01(vcpu);
++       free_nested(vmx);
++       vcpu_put(vcpu);
++}
++
+ static void vmx_free_vcpu(struct kvm_vcpu *vcpu)
+ {
+       struct vcpu_vmx *vmx = to_vmx(vcpu);
+ 
+       free_vpid(vmx);
+       leave_guest_mode(vcpu);
+-      vmx_load_vmcs01(vcpu);
+-      free_nested(vmx);
++      vmx_free_vcpu_nested(vcpu);
+       free_loaded_vmcs(vmx->loaded_vmcs);
+       kfree(vmx->guest_msrs);
+       kvm_vcpu_uninit(vcpu);
+diff --git a/arch/x86/syscalls/syscall_32.tbl 
b/arch/x86/syscalls/syscall_32.tbl
+index 9fe1b5d002f0..3d05d0080961 100644
+--- a/arch/x86/syscalls/syscall_32.tbl
++++ b/arch/x86/syscalls/syscall_32.tbl
+@@ -294,7 +294,7 @@
+ # 285 sys_setaltroot
+ 286   i386    add_key                 sys_add_key
+ 287   i386    request_key             sys_request_key
+-288   i386    keyctl                  sys_keyctl
++288   i386    keyctl                  sys_keyctl                      
compat_sys_keyctl
+ 289   i386    ioprio_set              sys_ioprio_set
+ 290   i386    ioprio_get              sys_ioprio_get
+ 291   i386    inotify_init            sys_inotify_init
+diff --git a/block/genhd.c b/block/genhd.c
+index c2fb3f7bdec4..40a06b934b1f 100644
+--- a/block/genhd.c
++++ b/block/genhd.c
+@@ -829,6 +829,7 @@ static void disk_seqf_stop(struct seq_file *seqf, void *v)
+       if (iter) {
+               class_dev_iter_exit(iter);
+               kfree(iter);
++              seqf->private = NULL;
+       }
+ }
+ 
+diff --git a/crypto/gcm.c b/crypto/gcm.c
+index 2e403f6138c1..ee3c29bd7ddb 100644
+--- a/crypto/gcm.c
++++ b/crypto/gcm.c
+@@ -716,7 +716,9 @@ static struct crypto_instance 
*crypto_gcm_alloc_common(struct rtattr **tb,
+ 
+       ghash_alg = crypto_find_alg(ghash_name, &crypto_ahash_type,
+                                   CRYPTO_ALG_TYPE_HASH,
+-                                  CRYPTO_ALG_TYPE_AHASH_MASK);
++                                  CRYPTO_ALG_TYPE_AHASH_MASK |
++                                  crypto_requires_sync(algt->type,
++                                                       algt->mask));
+       if (IS_ERR(ghash_alg))
+               return ERR_CAST(ghash_alg);
+ 
+diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c
+index 79ca2278c2a3..0ec7a6fa3d4d 100644
+--- a/crypto/scatterwalk.c
++++ b/crypto/scatterwalk.c
+@@ -68,7 +68,8 @@ static void scatterwalk_pagedone(struct scatter_walk *walk, 
int out,
+ 
+ void scatterwalk_done(struct scatter_walk *walk, int out, int more)
+ {
+-      if (!(scatterwalk_pagelen(walk) & (PAGE_SIZE - 1)) || !more)
++      if (!more || walk->offset >= walk->sg->offset + walk->sg->length ||
++          !(walk->offset & (PAGE_SIZE - 1)))
+               scatterwalk_pagedone(walk, out, more);
+ }
+ EXPORT_SYMBOL_GPL(scatterwalk_done);
+diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
+index cbea17da6fe6..036969223c16 100644
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -120,6 +120,8 @@ static const struct usb_device_id ath3k_table[] = {
+       { USB_DEVICE(0x13d3, 0x3432) },
+       { USB_DEVICE(0x13d3, 0x3472) },
+       { USB_DEVICE(0x13d3, 0x3474) },
++      { USB_DEVICE(0x13d3, 0x3487) },
++      { USB_DEVICE(0x13d3, 0x3490) },
+ 
+       /* Atheros AR5BBU12 with sflash firmware */
+       { USB_DEVICE(0x0489, 0xE02C) },
+@@ -184,6 +186,8 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
+       { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
+ 
+       /* Atheros AR5BBU22 with sflash firmware */
+       { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 },
+diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
+index b3334daab009..2dd73a3e95a2 100644
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -212,6 +212,8 @@ static const struct usb_device_id blacklist_table[] = {
+       { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
++      { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
+ 
+       /* Atheros AR5BBU12 with sflash firmware */
+       { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
+diff --git a/drivers/gpio/gpio-intel-mid.c b/drivers/gpio/gpio-intel-mid.c
+index aa28c65eb6b4..14945fd9d5e1 100644
+--- a/drivers/gpio/gpio-intel-mid.c
++++ b/drivers/gpio/gpio-intel-mid.c
+@@ -17,7 +17,6 @@
+  * Moorestown platform Langwell chip.
+  * Medfield platform Penwell chip.
+  * Clovertrail platform Cloverview chip.
+- * Merrifield platform Tangier chip.
+  */
+ 
+ #include <linux/module.h>
+@@ -64,10 +63,6 @@ enum GPIO_REG {
+ /* intel_mid gpio driver data */
+ struct intel_mid_gpio_ddata {
+       u16 ngpio;              /* number of gpio pins */
+-      u32 gplr_offset;        /* offset of first GPLR register from base */
+-      u32 flis_base;          /* base address of FLIS registers */
+-      u32 flis_len;           /* length of FLIS registers */
+-      u32 (*get_flis_offset)(int gpio);
+       u32 chip_irq_type;      /* chip interrupt type */
+ };
+ 
+@@ -257,15 +252,6 @@ static const struct intel_mid_gpio_ddata 
gpio_cloverview_core = {
+       .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE,
+ };
+ 
+-static const struct intel_mid_gpio_ddata gpio_tangier = {
+-      .ngpio = 192,
+-      .gplr_offset = 4,
+-      .flis_base = 0xff0c0000,
+-      .flis_len = 0x8000,
+-      .get_flis_offset = NULL,
+-      .chip_irq_type = INTEL_MID_IRQ_TYPE_EDGE,
+-};
+-
+ static const struct pci_device_id intel_gpio_ids[] = {
+       {
+               /* Lincroft */
+@@ -292,11 +278,6 @@ static const struct pci_device_id intel_gpio_ids[] = {
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08f7),
+               .driver_data = (kernel_ulong_t)&gpio_cloverview_core,
+       },
+-      {
+-              /* Tangier */
+-              PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1199),
+-              .driver_data = (kernel_ulong_t)&gpio_tangier,
+-      },
+       { 0 }
+ };
+ MODULE_DEVICE_TABLE(pci, intel_gpio_ids);
+diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
+index 16f7c4f2d8c8..6e2720ea7d45 100644
+--- a/drivers/gpio/gpio-pca953x.c
++++ b/drivers/gpio/gpio-pca953x.c
+@@ -76,7 +76,7 @@ MODULE_DEVICE_TABLE(i2c, pca953x_id);
+ #define MAX_BANK 5
+ #define BANK_SZ 8
+ 
+-#define NBANK(chip) (chip->gpio_chip.ngpio / BANK_SZ)
++#define NBANK(chip) DIV_ROUND_UP(chip->gpio_chip.ngpio, BANK_SZ)
+ 
+ struct pca953x_chip {
+       unsigned gpio_start;
+diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
+index 234e89c013dd..c2d76fed3abf 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -6526,14 +6526,12 @@ static void ironlake_init_pch_refclk(struct drm_device 
*dev)
+ {
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_encoder *encoder;
+-      int i;
+       u32 val, final;
+       bool has_lvds = false;
+       bool has_cpu_edp = false;
+       bool has_panel = false;
+       bool has_ck505 = false;
+       bool can_ssc = false;
+-      bool using_ssc_source = false;
+ 
+       /* We need to take the global config into account */
+       for_each_intel_encoder(dev, encoder) {
+@@ -6558,22 +6556,8 @@ static void ironlake_init_pch_refclk(struct drm_device 
*dev)
+               can_ssc = true;
+       }
+ 
+-      /* Check if any DPLLs are using the SSC source */
+-      for (i = 0; i < dev_priv->num_shared_dpll; i++) {
+-              u32 temp = I915_READ(PCH_DPLL(i));
+-
+-              if (!(temp & DPLL_VCO_ENABLE))
+-                      continue;
+-
+-              if ((temp & PLL_REF_INPUT_MASK) ==
+-                  PLLB_REF_INPUT_SPREADSPECTRUMIN) {
+-                      using_ssc_source = true;
+-                      break;
+-              }
+-      }
+-
+-      DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d using_ssc_source 
%d\n",
+-                    has_panel, has_lvds, has_ck505, using_ssc_source);
++      DRM_DEBUG_KMS("has_panel %d has_lvds %d has_ck505 %d\n",
++                    has_panel, has_lvds, has_ck505);
+ 
+       /* Ironlake: try to setup display ref clock before DPLL
+        * enabling. This is only under driver's control after
+@@ -6610,9 +6594,9 @@ static void ironlake_init_pch_refclk(struct drm_device 
*dev)
+                               final |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD;
+               } else
+                       final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
+-      } else if (using_ssc_source) {
+-              final |= DREF_SSC_SOURCE_ENABLE;
+-              final |= DREF_SSC1_ENABLE;
++      } else {
++              final |= DREF_SSC_SOURCE_DISABLE;
++              final |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
+       }
+ 
+       if (final == val)
+@@ -6658,7 +6642,7 @@ static void ironlake_init_pch_refclk(struct drm_device 
*dev)
+               POSTING_READ(PCH_DREF_CONTROL);
+               udelay(200);
+       } else {
+-              DRM_DEBUG_KMS("Disabling CPU source output\n");
++              DRM_DEBUG_KMS("Disabling SSC entirely\n");
+ 
+               val &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
+ 
+@@ -6669,20 +6653,16 @@ static void ironlake_init_pch_refclk(struct drm_device 
*dev)
+               POSTING_READ(PCH_DREF_CONTROL);
+               udelay(200);
+ 
+-              if (!using_ssc_source) {
+-                      DRM_DEBUG_KMS("Disabling SSC source\n");
+-
+-                      /* Turn off the SSC source */
+-                      val &= ~DREF_SSC_SOURCE_MASK;
+-                      val |= DREF_SSC_SOURCE_DISABLE;
++              /* Turn off the SSC source */
++              val &= ~DREF_SSC_SOURCE_MASK;
++              val |= DREF_SSC_SOURCE_DISABLE;
+ 
+-                      /* Turn off SSC1 */
+-                      val &= ~DREF_SSC1_ENABLE;
++              /* Turn off SSC1 */
++              val &= ~DREF_SSC1_ENABLE;
+ 
+-                      I915_WRITE(PCH_DREF_CONTROL, val);
+-                      POSTING_READ(PCH_DREF_CONTROL);
+-                      udelay(200);
+-              }
++              I915_WRITE(PCH_DREF_CONTROL, val);
++              POSTING_READ(PCH_DREF_CONTROL);
++              udelay(200);
+       }
+ 
+       BUG_ON(val != final);
+diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c 
b/drivers/gpu/drm/nouveau/nv04_fbcon.c
+index 7ab83f7f2763..ec974273d1e4 100644
+--- a/drivers/gpu/drm/nouveau/nv04_fbcon.c
++++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c
+@@ -107,11 +107,11 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct 
fb_image *image)
+                        ((image->dx + image->width) & 0xffff));
+       OUT_RING(chan, bg);
+       OUT_RING(chan, fg);
+-      OUT_RING(chan, (image->height << 16) | image->width);
++      OUT_RING(chan, (image->height << 16) | ALIGN(image->width, 8));
+       OUT_RING(chan, (image->height << 16) | image->width);
+       OUT_RING(chan, (image->dy << 16) | (image->dx & 0xffff));
+ 
+-      dsize = ALIGN(image->width * image->height, 32) >> 5;
++      dsize = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5;
+       while (dsize) {
+               int iter_len = dsize > 128 ? 128 : dsize;
+ 
+diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c 
b/drivers/gpu/drm/nouveau/nv50_fbcon.c
+index cb2a71ada99e..8462f72e8819 100644
+--- a/drivers/gpu/drm/nouveau/nv50_fbcon.c
++++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c
+@@ -125,7 +125,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct 
fb_image *image)
+       OUT_RING(chan, 0);
+       OUT_RING(chan, image->dy);
+ 
+-      dwords = ALIGN(image->width * image->height, 32) >> 5;
++      dwords = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5;
+       while (dwords) {
+               int push = dwords > 2047 ? 2047 : dwords;
+ 
+diff --git a/drivers/gpu/drm/nouveau/nvc0_fbcon.c 
b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
+index 69f760e8c54f..90552420c217 100644
+--- a/drivers/gpu/drm/nouveau/nvc0_fbcon.c
++++ b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
+@@ -125,7 +125,7 @@ nvc0_fbcon_imageblit(struct fb_info *info, const struct 
fb_image *image)
+       OUT_RING  (chan, 0);
+       OUT_RING  (chan, image->dy);
+ 
+-      dwords = ALIGN(image->width * image->height, 32) >> 5;
++      dwords = ALIGN(ALIGN(image->width, 8) * image->height, 32) >> 5;
+       while (dwords) {
+               int push = dwords > 2047 ? 2047 : dwords;
+ 
+diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
+index 07dd3523425a..e809d2574356 100644
+--- a/drivers/gpu/drm/radeon/atombios_encoders.c
++++ b/drivers/gpu/drm/radeon/atombios_encoders.c
+@@ -119,6 +119,7 @@ atombios_set_backlight_level(struct radeon_encoder 
*radeon_encoder, u8 level)
+               case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
+               case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
+               case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
++              case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
+                       if (dig->backlight_level == 0)
+                               atombios_dig_transmitter_setup(encoder, 
ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0);
+                       else {
+diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c 
b/drivers/gpu/drm/radeon/radeon_atombios.c
+index 882171b411f0..ad0f9c7882c4 100644
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c
+@@ -1128,7 +1128,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
+                   le16_to_cpu(firmware_info->info.usReferenceClock);
+               p1pll->reference_div = 0;
+ 
+-              if (crev < 2)
++              if ((frev < 2) && (crev < 2))
+                       p1pll->pll_out_min =
+                               
le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output);
+               else
+@@ -1137,7 +1137,7 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
+               p1pll->pll_out_max =
+                   le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output);
+ 
+-              if (crev >= 4) {
++              if (((frev < 2) && (crev >= 4)) || (frev >= 2)) {
+                       p1pll->lcd_pll_out_min =
+                               
le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100;
+                       if (p1pll->lcd_pll_out_min == 0)
+diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c 
b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
+index 8bc7d0bbd3c8..868247c22de4 100644
+--- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c
++++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
+@@ -10,6 +10,7 @@
+ #include <linux/slab.h>
+ #include <linux/acpi.h>
+ #include <linux/pci.h>
++#include <linux/delay.h>
+ 
+ #include "radeon_acpi.h"
+ 
+@@ -255,6 +256,10 @@ static int radeon_atpx_set_discrete_state(struct 
radeon_atpx *atpx, u8 state)
+               if (!info)
+                       return -EIO;
+               kfree(info);
++
++              /* 200ms delay is required after off */
++              if (state == 0)
++                      msleep(200);
+       }
+       return 0;
+ }
+diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c 
b/drivers/gpu/drm/radeon/radeon_connectors.c
+index 15f09068ac00..4f686bb6bad7 100644
+--- a/drivers/gpu/drm/radeon/radeon_connectors.c
++++ b/drivers/gpu/drm/radeon/radeon_connectors.c
+@@ -1949,7 +1949,6 @@ radeon_add_atom_connector(struct drm_device *dev,
+                                                          DRM_MODE_SCALE_NONE);
+                       /* no HPD on analog connectors */
+                       radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+-                      connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+                       connector->interlace_allowed = true;
+                       connector->doublescan_allowed = true;
+                       break;
+@@ -2180,8 +2179,10 @@ radeon_add_atom_connector(struct drm_device *dev,
+       }
+ 
+       if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
+-              if (i2c_bus->valid)
+-                      connector->polled = DRM_CONNECTOR_POLL_CONNECT;
++              if (i2c_bus->valid) {
++                      connector->polled = DRM_CONNECTOR_POLL_CONNECT |
++                                          DRM_CONNECTOR_POLL_DISCONNECT;
++              }
+       } else
+               connector->polled = DRM_CONNECTOR_POLL_HPD;
+ 
+@@ -2257,7 +2258,6 @@ radeon_add_legacy_connector(struct drm_device *dev,
+                                             1);
+               /* no HPD on analog connectors */
+               radeon_connector->hpd.hpd = RADEON_HPD_NONE;
+-              connector->polled = DRM_CONNECTOR_POLL_CONNECT;
+               connector->interlace_allowed = true;
+               connector->doublescan_allowed = true;
+               break;
+@@ -2342,10 +2342,13 @@ radeon_add_legacy_connector(struct drm_device *dev,
+       }
+ 
+       if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
+-              if (i2c_bus->valid)
+-                      connector->polled = DRM_CONNECTOR_POLL_CONNECT;
++              if (i2c_bus->valid) {
++                      connector->polled = DRM_CONNECTOR_POLL_CONNECT |
++                                          DRM_CONNECTOR_POLL_DISCONNECT;
++              }
+       } else
+               connector->polled = DRM_CONNECTOR_POLL_HPD;
++
+       connector->display_info.subpixel_order = subpixel_order;
+       drm_connector_register(connector);
+ }
+diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
+index e094c572b86e..1a2032c2c1fb 100644
+--- a/drivers/hid/uhid.c
++++ b/drivers/hid/uhid.c
+@@ -51,10 +51,26 @@ struct uhid_device {
+       u32 report_id;
+       u32 report_type;
+       struct uhid_event report_buf;
++      struct work_struct worker;
+ };
+ 
+ static struct miscdevice uhid_misc;
+ 
++static void uhid_device_add_worker(struct work_struct *work)
++{
++      struct uhid_device *uhid = container_of(work, struct uhid_device, 
worker);
++      int ret;
++
++      ret = hid_add_device(uhid->hid);
++      if (ret) {
++              hid_err(uhid->hid, "Cannot register HID device: error %d\n", 
ret);
++
++              hid_destroy_device(uhid->hid);
++              uhid->hid = NULL;
++              uhid->running = false;
++      }
++}
++
+ static void uhid_queue(struct uhid_device *uhid, struct uhid_event *ev)
+ {
+       __u8 newhead;
+@@ -498,18 +514,14 @@ static int uhid_dev_create2(struct uhid_device *uhid,
+       uhid->hid = hid;
+       uhid->running = true;
+ 
+-      ret = hid_add_device(hid);
+-      if (ret) {
+-              hid_err(hid, "Cannot register HID device\n");
+-              goto err_hid;
+-      }
++      /* Adding of a HID device is done through a worker, to allow HID drivers
++       * which use feature requests during .probe to work, without they would
++       * be blocked on devlock, which is held by uhid_char_write.
++       */
++      schedule_work(&uhid->worker);
+ 
+       return 0;
+ 
+-err_hid:
+-      hid_destroy_device(hid);
+-      uhid->hid = NULL;
+-      uhid->running = false;
+ err_free:
+       kfree(uhid->rd_data);
+       uhid->rd_data = NULL;
+@@ -550,6 +562,8 @@ static int uhid_dev_destroy(struct uhid_device *uhid)
+       uhid->running = false;
+       wake_up_interruptible(&uhid->report_wait);
+ 
++      cancel_work_sync(&uhid->worker);
++
+       hid_destroy_device(uhid->hid);
+       kfree(uhid->rd_data);
+ 
+@@ -612,6 +626,7 @@ static int uhid_char_open(struct inode *inode, struct file 
*file)
+       init_waitqueue_head(&uhid->waitq);
+       init_waitqueue_head(&uhid->report_wait);
+       uhid->running = false;
++      INIT_WORK(&uhid->worker, uhid_device_add_worker);
+ 
+       file->private_data = uhid;
+       nonseekable_open(inode, file);
+diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
+index 804d2e02010a..1889f0a6c4ca 100644
+--- a/drivers/input/serio/i8042.c
++++ b/drivers/input/serio/i8042.c
+@@ -1230,6 +1230,7 @@ static int __init i8042_create_kbd_port(void)
+       serio->start            = i8042_start;
+       serio->stop             = i8042_stop;
+       serio->close            = i8042_port_close;
++      serio->ps2_cmd_mutex    = &i8042_mutex;
+       serio->port_data        = port;
+       serio->dev.parent       = &i8042_platform_device->dev;
+       strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name));
+@@ -1323,21 +1324,6 @@ static void i8042_unregister_ports(void)
+       }
+ }
+ 
+-/*
+- * Checks whether port belongs to i8042 controller.
+- */
+-bool i8042_check_port_owner(const struct serio *port)
+-{
+-      int i;
+-
+-      for (i = 0; i < I8042_NUM_PORTS; i++)
+-              if (i8042_ports[i].serio == port)
+-                      return true;
+-
+-      return false;
+-}
+-EXPORT_SYMBOL(i8042_check_port_owner);
+-
+ static void i8042_free_irqs(void)
+ {
+       if (i8042_aux_irq_registered)
+diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c
+index 75516996db20..ded0c6f65c9f 100644
+--- a/drivers/input/serio/libps2.c
++++ b/drivers/input/serio/libps2.c
+@@ -56,19 +56,17 @@ EXPORT_SYMBOL(ps2_sendbyte);
+ 
+ void ps2_begin_command(struct ps2dev *ps2dev)
+ {
+-      mutex_lock(&ps2dev->cmd_mutex);
++      struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex;
+ 
+-      if (i8042_check_port_owner(ps2dev->serio))
+-              i8042_lock_chip();
++      mutex_lock(m);
+ }
+ EXPORT_SYMBOL(ps2_begin_command);
+ 
+ void ps2_end_command(struct ps2dev *ps2dev)
+ {
+-      if (i8042_check_port_owner(ps2dev->serio))
+-              i8042_unlock_chip();
++      struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex;
+ 
+-      mutex_unlock(&ps2dev->cmd_mutex);
++      mutex_unlock(m);
+ }
+ EXPORT_SYMBOL(ps2_end_command);
+ 
+diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
+index b257e46876d3..0f5e1820c92d 100644
+--- a/drivers/md/dm-flakey.c
++++ b/drivers/md/dm-flakey.c
+@@ -287,10 +287,16 @@ static int flakey_map(struct dm_target *ti, struct bio 
*bio)
+               pb->bio_submitted = true;
+ 
+               /*
+-               * Map reads as normal.
++               * Map reads as normal only if corrupt_bio_byte set.
+                */
+-              if (bio_data_dir(bio) == READ)
+-                      goto map_bio;
++              if (bio_data_dir(bio) == READ) {
++                      /* If flags were specified, only corrupt those that 
match. */
++                      if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == 
READ) &&
++                          all_corrupt_bio_flags_match(bio, fc))
++                              goto map_bio;
++                      else
++                              return -EIO;
++              }
+ 
+               /*
+                * Drop writes?
+@@ -328,12 +334,13 @@ static int flakey_end_io(struct dm_target *ti, struct 
bio *bio, int error)
+ 
+       /*
+        * Corrupt successful READs while in down state.
+-       * If flags were specified, only corrupt those that match.
+        */
+-      if (fc->corrupt_bio_byte && !error && pb->bio_submitted &&
+-          (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) &&
+-          all_corrupt_bio_flags_match(bio, fc))
+-              corrupt_bio_data(bio, fc);
++      if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) {
++              if (fc->corrupt_bio_byte)
++                      corrupt_bio_data(bio, fc);
++              else
++                      return -EIO;
++      }
+ 
+       return error;
+ }
+diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c 
b/drivers/media/dvb-core/dvb_ringbuffer.c
+index 1100e98a7b1d..7df7fb3738a0 100644
+--- a/drivers/media/dvb-core/dvb_ringbuffer.c
++++ b/drivers/media/dvb-core/dvb_ringbuffer.c
+@@ -55,7 +55,13 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void 
*data, size_t len)
+ 
+ int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf)
+ {
+-      return (rbuf->pread==rbuf->pwrite);
++      /* smp_load_acquire() to load write pointer on reader side
++       * this pairs with smp_store_release() in dvb_ringbuffer_write(),
++       * dvb_ringbuffer_write_user(), or dvb_ringbuffer_reset()
++       *
++       * for memory barriers also see Documentation/circular-buffers.txt
++       */
++      return (rbuf->pread == smp_load_acquire(&rbuf->pwrite));
+ }
+ 
+ 
+@@ -64,7 +70,12 @@ ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf)
+ {
+       ssize_t free;
+ 
+-      free = rbuf->pread - rbuf->pwrite;
++      /* ACCESS_ONCE() to load read pointer on writer side
++       * this pairs with smp_store_release() in dvb_ringbuffer_read(),
++       * dvb_ringbuffer_read_user(), dvb_ringbuffer_flush(),
++       * or dvb_ringbuffer_reset()
++       */
++      free = ACCESS_ONCE(rbuf->pread) - rbuf->pwrite;
+       if (free <= 0)
+               free += rbuf->size;
+       return free-1;
+@@ -76,7 +87,11 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)
+ {
+       ssize_t avail;
+ 
+-      avail = rbuf->pwrite - rbuf->pread;
++      /* smp_load_acquire() to load write pointer on reader side
++       * this pairs with smp_store_release() in dvb_ringbuffer_write(),
++       * dvb_ringbuffer_write_user(), or dvb_ringbuffer_reset()
++       */
++      avail = smp_load_acquire(&rbuf->pwrite) - rbuf->pread;
+       if (avail < 0)
+               avail += rbuf->size;
+       return avail;
+@@ -86,14 +101,25 @@ ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)
+ 
+ void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
+ {
+-      rbuf->pread = rbuf->pwrite;
++      /* dvb_ringbuffer_flush() counts as read operation
++       * smp_load_acquire() to load write pointer
++       * smp_store_release() to update read pointer, this ensures that the
++       * correct pointer is visible for subsequent dvb_ringbuffer_free()
++       * calls on other cpu cores
++       */
++      smp_store_release(&rbuf->pread, smp_load_acquire(&rbuf->pwrite));
+       rbuf->error = 0;
+ }
+ EXPORT_SYMBOL(dvb_ringbuffer_flush);
+ 
+ void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf)
+ {
+-      rbuf->pread = rbuf->pwrite = 0;
++      /* dvb_ringbuffer_reset() counts as read and write operation
++       * smp_store_release() to update read pointer
++       */
++      smp_store_release(&rbuf->pread, 0);
++      /* smp_store_release() to update write pointer */
++      smp_store_release(&rbuf->pwrite, 0);
+       rbuf->error = 0;
+ }
+ 
+@@ -119,12 +145,17 @@ ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer 
*rbuf, u8 __user *buf, si
+                       return -EFAULT;
+               buf += split;
+               todo -= split;
+-              rbuf->pread = 0;
++              /* smp_store_release() for read pointer update to ensure
++               * that buf is not overwritten until read is complete,
++               * this pairs with ACCESS_ONCE() in dvb_ringbuffer_free()
++               */
++              smp_store_release(&rbuf->pread, 0);
+       }
+       if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
+               return -EFAULT;
+ 
+-      rbuf->pread = (rbuf->pread + todo) % rbuf->size;
++      /* smp_store_release() to update read pointer, see above */
++      smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size);
+ 
+       return len;
+ }
+@@ -139,11 +170,16 @@ void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 
*buf, size_t len)
+               memcpy(buf, rbuf->data+rbuf->pread, split);
+               buf += split;
+               todo -= split;
+-              rbuf->pread = 0;
++              /* smp_store_release() for read pointer update to ensure
++               * that buf is not overwritten until read is complete,
++               * this pairs with ACCESS_ONCE() in dvb_ringbuffer_free()
++               */
++              smp_store_release(&rbuf->pread, 0);
+       }
+       memcpy(buf, rbuf->data+rbuf->pread, todo);
+ 
+-      rbuf->pread = (rbuf->pread + todo) % rbuf->size;
++      /* smp_store_release() to update read pointer, see above */
++      smp_store_release(&rbuf->pread, (rbuf->pread + todo) % rbuf->size);
+ }
+ 
+ 
+@@ -158,10 +194,16 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer 
*rbuf, const u8 *buf, size_t
+               memcpy(rbuf->data+rbuf->pwrite, buf, split);
+               buf += split;
+               todo -= split;
+-              rbuf->pwrite = 0;
++              /* smp_store_release() for write pointer update to ensure that
++               * written data is visible on other cpu cores before the pointer
++               * update, this pairs with smp_load_acquire() in
++               * dvb_ringbuffer_empty() or dvb_ringbuffer_avail()
++               */
++              smp_store_release(&rbuf->pwrite, 0);
+       }
+       memcpy(rbuf->data+rbuf->pwrite, buf, todo);
+-      rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
++      /* smp_store_release() for write pointer update, see above */
++      smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size);
+ 
+       return len;
+ }
+@@ -181,12 +223,18 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer 
*rbuf,
+                       return len - todo;
+               buf += split;
+               todo -= split;
+-              rbuf->pwrite = 0;
++              /* smp_store_release() for write pointer update to ensure that
++               * written data is visible on other cpu cores before the pointer
++               * update, this pairs with smp_load_acquire() in
++               * dvb_ringbuffer_empty() or dvb_ringbuffer_avail()
++               */
++              smp_store_release(&rbuf->pwrite, 0);
+       }
+       status = copy_from_user(rbuf->data+rbuf->pwrite, buf, todo);
+       if (status)
+               return len - todo;
+-      rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
++      /* smp_store_release() for write pointer update, see above */
++      smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size);
+ 
+       return len;
+ }
+diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c 
b/drivers/media/platform/s5p-mfc/s5p_mfc.c
+index 165bc86c5962..ebef91c35fce 100644
+--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c
++++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c
+@@ -1008,6 +1008,11 @@ static int match_child(struct device *dev, void *data)
+       return !strcmp(dev_name(dev), (char *)data);
+ }
+ 
++static void s5p_mfc_memdev_release(struct device *dev)
++{
++      dma_release_declared_memory(dev);
++}
++
+ static void *mfc_get_drv_data(struct platform_device *pdev);
+ 
+ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
+@@ -1020,6 +1025,9 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
+               mfc_err("Not enough memory\n");
+               return -ENOMEM;
+       }
++
++      dev_set_name(dev->mem_dev_l, "%s", "s5p-mfc-l");
++      dev->mem_dev_l->release = s5p_mfc_memdev_release;
+       device_initialize(dev->mem_dev_l);
+       of_property_read_u32_array(dev->plat_dev->dev.of_node,
+                       "samsung,mfc-l", mem_info, 2);
+@@ -1037,6 +1045,9 @@ static int s5p_mfc_alloc_memdevs(struct s5p_mfc_dev *dev)
+               mfc_err("Not enough memory\n");
+               return -ENOMEM;
+       }
++
++      dev_set_name(dev->mem_dev_r, "%s", "s5p-mfc-r");
++      dev->mem_dev_r->release = s5p_mfc_memdev_release;
+       device_initialize(dev->mem_dev_r);
+       of_property_read_u32_array(dev->plat_dev->dev.of_node,
+                       "samsung,mfc-r", mem_info, 2);
+diff --git a/drivers/media/rc/ir-rc5-decoder.c 
b/drivers/media/rc/ir-rc5-decoder.c
+index 84fa6e9b59a1..67314c034cdb 100644
+--- a/drivers/media/rc/ir-rc5-decoder.c
++++ b/drivers/media/rc/ir-rc5-decoder.c
+@@ -29,7 +29,7 @@
+ #define RC5_BIT_START         (1 * RC5_UNIT)
+ #define RC5_BIT_END           (1 * RC5_UNIT)
+ #define RC5X_SPACE            (4 * RC5_UNIT)
+-#define RC5_TRAILER           (10 * RC5_UNIT) /* In reality, approx 100 */
++#define RC5_TRAILER           (6 * RC5_UNIT) /* In reality, approx 100 */
+ 
+ enum rc5_state {
+       STATE_INACTIVE,
+diff --git a/drivers/media/usb/usbtv/usbtv-audio.c 
b/drivers/media/usb/usbtv/usbtv-audio.c
+index 78c12d22dfbb..5dab02432e82 100644
+--- a/drivers/media/usb/usbtv/usbtv-audio.c
++++ b/drivers/media/usb/usbtv/usbtv-audio.c
+@@ -278,6 +278,9 @@ static void snd_usbtv_trigger(struct work_struct *work)
+ {
+       struct usbtv *chip = container_of(work, struct usbtv, snd_trigger);
+ 
++      if (!chip->snd)
++              return;
++
+       if (atomic_read(&chip->snd_stream))
+               usbtv_audio_start(chip);
+       else
+@@ -378,6 +381,8 @@ err:
+ 
+ void usbtv_audio_free(struct usbtv *usbtv)
+ {
++      cancel_work_sync(&usbtv->snd_trigger);
++
+       if (usbtv->snd && usbtv->udev) {
+               snd_card_free(usbtv->snd);
+               usbtv->snd = NULL;
+diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
+index 5b5c62712814..2e2da0a4be1a 100644
+--- a/drivers/mtd/nand/nand_base.c
++++ b/drivers/mtd/nand/nand_base.c
+@@ -2424,7 +2424,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, 
loff_t to,
+               int cached = writelen > bytes && page != blockmask;
+               uint8_t *wbuf = buf;
+               int use_bufpoi;
+-              int part_pagewr = (column || writelen < (mtd->writesize - 1));
++              int part_pagewr = (column || writelen < mtd->writesize);
+ 
+               if (part_pagewr)
+                       use_bufpoi = 1;
+diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
+index 6e30a3c280d0..c3db383a9000 100644
+--- a/drivers/mtd/ubi/build.c
++++ b/drivers/mtd/ubi/build.c
+@@ -999,6 +999,9 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
+                       goto out_detach;
+       }
+ 
++      /* Make device "available" before it becomes accessible via sysfs */
++      ubi_devices[ubi_num] = ubi;
++
+       err = uif_init(ubi, &ref);
+       if (err)
+               goto out_detach;
+@@ -1043,7 +1046,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
+       wake_up_process(ubi->bgt_thread);
+       spin_unlock(&ubi->wl_lock);
+ 
+-      ubi_devices[ubi_num] = ubi;
+       ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL);
+       return ubi_num;
+ 
+@@ -1054,6 +1056,7 @@ out_uif:
+       ubi_assert(ref);
+       uif_close(ubi);
+ out_detach:
++      ubi_devices[ubi_num] = NULL;
+       ubi_wl_close(ubi);
+       ubi_free_internal_volumes(ubi);
+       vfree(ubi->vtbl);
+diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
+index 8330703c098f..96131eb34c9f 100644
+--- a/drivers/mtd/ubi/vmt.c
++++ b/drivers/mtd/ubi/vmt.c
+@@ -534,13 +534,6 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int 
reserved_pebs)
+               spin_unlock(&ubi->volumes_lock);
+       }
+ 
+-      /* Change volume table record */
+-      vtbl_rec = ubi->vtbl[vol_id];
+-      vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs);
+-      err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec);
+-      if (err)
+-              goto out_acc;
+-
+       if (pebs < 0) {
+               for (i = 0; i < -pebs; i++) {
+                       err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i);
+@@ -558,6 +551,24 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int 
reserved_pebs)
+               spin_unlock(&ubi->volumes_lock);
+       }
+ 
++      /*
++       * When we shrink a volume we have to flush all pending (erase) work.
++       * Otherwise it can happen that upon next attach UBI finds a LEB with
++       * lnum > highest_lnum and refuses to attach.
++       */
++      if (pebs < 0) {
++              err = ubi_wl_flush(ubi, vol_id, UBI_ALL);
++              if (err)
++                      goto out_acc;
++      }
++
++      /* Change volume table record */
++      vtbl_rec = ubi->vtbl[vol_id];
++      vtbl_rec.reserved_pebs = cpu_to_be32(reserved_pebs);
++      err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec);
++      if (err)
++              goto out_acc;
++
+       vol->reserved_pebs = reserved_pebs;
+       if (vol->vol_type == UBI_DYNAMIC_VOLUME) {
+               vol->used_ebs = reserved_pebs;
+diff --git a/drivers/of/base.c b/drivers/of/base.c
+index 469d2b7f47eb..4e0e8ee2d17f 100644
+--- a/drivers/of/base.c
++++ b/drivers/of/base.c
+@@ -111,6 +111,7 @@ static ssize_t of_node_property_read(struct file *filp, 
struct kobject *kobj,
+       return memory_read_from_buffer(buf, count, &offset, pp->value, 
pp->length);
+ }
+ 
++/* always return newly allocated name, caller must free after use */
+ static const char *safe_name(struct kobject *kobj, const char *orig_name)
+ {
+       const char *name = orig_name;
+@@ -125,9 +126,12 @@ static const char *safe_name(struct kobject *kobj, const 
char *orig_name)
+               name = kasprintf(GFP_KERNEL, "%s#%i", orig_name, ++i);
+       }
+ 
+-      if (name != orig_name)
++      if (name == orig_name) {
++              name = kstrdup(orig_name, GFP_KERNEL);
++      } else {
+               pr_warn("device-tree: Duplicate name in %s, renamed to 
\"%s\"\n",
+                       kobject_name(kobj), name);
++      }
+       return name;
+ }
+ 
+@@ -158,6 +162,7 @@ int __of_add_property_sysfs(struct device_node *np, struct 
property *pp)
+ int __of_attach_node_sysfs(struct device_node *np)
+ {
+       const char *name;
++      struct kobject *parent;
+       struct property *pp;
+       int rc;
+ 
+@@ -170,15 +175,16 @@ int __of_attach_node_sysfs(struct device_node *np)
+       np->kobj.kset = of_kset;
+       if (!np->parent) {
+               /* Nodes without parents are new top level trees */
+-              rc = kobject_add(&np->kobj, NULL, "%s",
+-                               safe_name(&of_kset->kobj, "base"));
++              name = safe_name(&of_kset->kobj, "base");
++              parent = NULL;
+       } else {
+               name = safe_name(&np->parent->kobj, kbasename(np->full_name));
+-              if (!name || !name[0])
+-                      return -EINVAL;
+-
+-              rc = kobject_add(&np->kobj, &np->parent->kobj, "%s", name);
++              parent = &np->parent->kobj;
+       }
++      if (!name)
++              return -ENOMEM;
++      rc = kobject_add(&np->kobj, parent, "%s", name);
++      kfree(name);
+       if (rc)
+               return rc;
+ 
+@@ -1709,6 +1715,12 @@ int __of_remove_property(struct device_node *np, struct 
property *prop)
+       return 0;
+ }
+ 
++void __of_sysfs_remove_bin_file(struct device_node *np, struct property *prop)
++{
++      sysfs_remove_bin_file(&np->kobj, &prop->attr);
++      kfree(prop->attr.attr.name);
++}
++
+ void __of_remove_property_sysfs(struct device_node *np, struct property *prop)
+ {
+       if (!IS_ENABLED(CONFIG_SYSFS))
+@@ -1716,7 +1728,7 @@ void __of_remove_property_sysfs(struct device_node *np, 
struct property *prop)
+ 
+       /* at early boot, bail here and defer setup to of_init() */
+       if (of_kset && of_node_is_attached(np))
+-              sysfs_remove_bin_file(&np->kobj, &prop->attr);
++              __of_sysfs_remove_bin_file(np, prop);
+ }
+ 
+ /**
+@@ -1786,7 +1798,7 @@ void __of_update_property_sysfs(struct device_node *np, 
struct property *newprop
+               return;
+ 
+       if (oldprop)
+-              sysfs_remove_bin_file(&np->kobj, &oldprop->attr);
++              __of_sysfs_remove_bin_file(np, oldprop);
+       __of_add_property_sysfs(np, newprop);
+ }
+ 
+diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
+index d4994177dec2..ab7374960393 100644
+--- a/drivers/of/dynamic.c
++++ b/drivers/of/dynamic.c
+@@ -55,7 +55,7 @@ void __of_detach_node_sysfs(struct device_node *np)
+       /* only remove properties if on sysfs */
+       if (of_node_is_attached(np)) {
+               for_each_property_of_node(np, pp)
+-                      sysfs_remove_bin_file(&np->kobj, &pp->attr);
++                      __of_sysfs_remove_bin_file(np, pp);
+               kobject_del(&np->kobj);
+       }
+ 
+diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
+index 858e0a5d9a11..21bf733eb4ad 100644
+--- a/drivers/of/of_private.h
++++ b/drivers/of/of_private.h
+@@ -81,6 +81,9 @@ extern int __of_attach_node_sysfs(struct device_node *np);
+ extern void __of_detach_node(struct device_node *np);
+ extern void __of_detach_node_sysfs(struct device_node *np);
+ 
++extern void __of_sysfs_remove_bin_file(struct device_node *np,
++                                     struct property *prop);
++
+ /* iterators for transactions, used for overlays */
+ /* forward iterator */
+ #define for_each_transaction_entry(_oft, _te) \
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index b6d646a97494..d89d4dac2c09 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -3060,13 +3060,15 @@ static void quirk_no_bus_reset(struct pci_dev *dev)
+ }
+ 
+ /*
+- * Atheros AR93xx chips do not behave after a bus reset.  The device will
+- * throw a Link Down error on AER-capable systems and regardless of AER,
+- * config space of the device is never accessible again and typically
+- * causes the system to hang or reset when access is attempted.
++ * Some Atheros AR9xxx and QCA988x chips do not behave after a bus reset.
++ * The device will throw a Link Down error on AER-capable systems and
++ * regardless of AER, config space of the device is never accessible again
++ * and typically causes the system to hang or reset when access is attempted.
+  * http://www.spinics.net/lists/linux-pci/msg34797.html
+  */
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0030, quirk_no_bus_reset);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset);
+ 
+ #ifdef CONFIG_ACPI
+ /*
+diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
+index 301386c4d85b..450d790c8bbf 100644
+--- a/drivers/platform/x86/hp-wmi.c
++++ b/drivers/platform/x86/hp-wmi.c
+@@ -723,6 +723,11 @@ static int __init hp_wmi_rfkill_setup(struct 
platform_device *device)
+       if (err)
+               return err;
+ 
++      err = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, &wireless,
++                                 sizeof(wireless), 0);
++      if (err)
++              return err;
++
+       if (wireless & 0x1) {
+               wifi_rfkill = rfkill_alloc("hp-wifi", &device->dev,
+                                          RFKILL_TYPE_WLAN,
+@@ -910,7 +915,7 @@ static int __init hp_wmi_bios_setup(struct platform_device 
*device)
+       gps_rfkill = NULL;
+       rfkill2_count = 0;
+ 
+-      if (hp_wmi_bios_2009_later() || hp_wmi_rfkill_setup(device))
++      if (hp_wmi_rfkill_setup(device))
+               hp_wmi_rfkill2_setup(device);
+ 
+       err = device_create_file(&device->dev, &dev_attr_display);
+diff --git a/drivers/target/iscsi/iscsi_target.c 
b/drivers/target/iscsi/iscsi_target.c
+index 0b1fdfe34c98..450fbad835e4 100644
+--- a/drivers/target/iscsi/iscsi_target.c
++++ b/drivers/target/iscsi/iscsi_target.c
+@@ -502,7 +502,8 @@ static void iscsit_aborted_task(struct iscsi_conn *conn, 
struct iscsi_cmd *cmd)
+       bool scsi_cmd = (cmd->iscsi_opcode == ISCSI_OP_SCSI_CMD);
+ 
+       spin_lock_bh(&conn->cmd_lock);
+-      if (!list_empty(&cmd->i_conn_node))
++      if (!list_empty(&cmd->i_conn_node) &&
++          !(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP))
+               list_del_init(&cmd->i_conn_node);
+       spin_unlock_bh(&conn->cmd_lock);
+ 
+@@ -4174,6 +4175,7 @@ transport_err:
+ 
+ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
+ {
++      LIST_HEAD(tmp_list);
+       struct iscsi_cmd *cmd = NULL, *cmd_tmp = NULL;
+       struct iscsi_session *sess = conn->sess;
+       /*
+@@ -4182,18 +4184,26 @@ static void iscsit_release_commands_from_conn(struct 
iscsi_conn *conn)
+        * has been reset -> returned sleeping pre-handler state.
+        */
+       spin_lock_bh(&conn->cmd_lock);
+-      list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, 
i_conn_node) {
++      list_splice_init(&conn->conn_cmd_list, &tmp_list);
+ 
++      list_for_each_entry(cmd, &tmp_list, i_conn_node) {
++              struct se_cmd *se_cmd = &cmd->se_cmd;
++
++              if (se_cmd->se_tfo != NULL) {
++                      spin_lock(&se_cmd->t_state_lock);
++                      se_cmd->transport_state |= CMD_T_FABRIC_STOP;
++                      spin_unlock(&se_cmd->t_state_lock);
++              }
++      }
++      spin_unlock_bh(&conn->cmd_lock);
++
++      list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) {
+               list_del_init(&cmd->i_conn_node);
+-              spin_unlock_bh(&conn->cmd_lock);
+ 
+               iscsit_increment_maxcmdsn(cmd, sess);
+-
+               iscsit_free_cmd(cmd, true);
+ 
+-              spin_lock_bh(&conn->cmd_lock);
+       }
+-      spin_unlock_bh(&conn->cmd_lock);
+ }
+ 
+ static void iscsit_stop_timers_for_cmds(
+diff --git a/drivers/target/iscsi/iscsi_target_login.c 
b/drivers/target/iscsi/iscsi_target_login.c
+index eb320e6eb93d..b06d3c0d2e66 100644
+--- a/drivers/target/iscsi/iscsi_target_login.c
++++ b/drivers/target/iscsi/iscsi_target_login.c
+@@ -1414,8 +1414,9 @@ static int __iscsi_target_login_thread(struct iscsi_np 
*np)
+       }
+       login->zero_tsih = zero_tsih;
+ 
+-      conn->sess->se_sess->sup_prot_ops =
+-              conn->conn_transport->iscsit_get_sup_prot_ops(conn);
++      if (conn->sess)
++              conn->sess->se_sess->sup_prot_ops =
++                      conn->conn_transport->iscsit_get_sup_prot_ops(conn);
+ 
+       tpg = conn->tpg;
+       if (!tpg) {
+diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
+index 1a487f9c2f78..837d464fa6da 100644
+--- a/drivers/target/target_core_transport.c
++++ b/drivers/target/target_core_transport.c
+@@ -2451,15 +2451,9 @@ static void target_release_cmd_kref(struct kref *kref)
+       struct se_session *se_sess = se_cmd->se_sess;
+       bool fabric_stop;
+ 
+-      if (list_empty(&se_cmd->se_cmd_list)) {
+-              spin_unlock(&se_sess->sess_cmd_lock);
+-              target_free_cmd_mem(se_cmd);
+-              se_cmd->se_tfo->release_cmd(se_cmd);
+-              return;
+-      }
+-
+       spin_lock(&se_cmd->t_state_lock);
+-      fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP);
++      fabric_stop = (se_cmd->transport_state & CMD_T_FABRIC_STOP) &&
++                    (se_cmd->transport_state & CMD_T_ABORTED);
+       spin_unlock(&se_cmd->t_state_lock);
+ 
+       if (se_cmd->cmd_wait_set || fabric_stop) {
+diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
+index b7213637f498..c751604d3856 100644
+--- a/drivers/tty/serial/samsung.c
++++ b/drivers/tty/serial/samsung.c
+@@ -1154,7 +1154,7 @@ static int s3c24xx_serial_init_port(struct 
s3c24xx_uart_port *ourport,
+               return -ENODEV;
+ 
+       if (port->mapbase != 0)
+-              return 0;
++              return -EINVAL;
+ 
+       /* setup info for port */
+       port->dev       = &platdev->dev;
+@@ -1204,14 +1204,15 @@ static int s3c24xx_serial_init_port(struct 
s3c24xx_uart_port *ourport,
+       if (IS_ERR(ourport->clk)) {
+               pr_err("%s: Controller clock not found\n",
+                               dev_name(&platdev->dev));
+-              return PTR_ERR(ourport->clk);
++              ret = PTR_ERR(ourport->clk);
++              goto err;
+       }
+ 
+       ret = clk_prepare_enable(ourport->clk);
+       if (ret) {
+               pr_err("uart: clock failed to prepare+enable: %d\n", ret);
+               clk_put(ourport->clk);
+-              return ret;
++              goto err;
+       }
+ 
+       /* Keep all interrupts masked and cleared */
+@@ -1227,7 +1228,12 @@ static int s3c24xx_serial_init_port(struct 
s3c24xx_uart_port *ourport,
+ 
+       /* reset the fifos (and setup the uart) */
+       s3c24xx_serial_resetport(port, cfg);
++
+       return 0;
++
++err:
++      port->mapbase = 0;
++      return ret;
+ }
+ 
+ #ifdef CONFIG_SAMSUNG_CLOCK
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 0673a5abc21d..6c7e47f67dd4 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -125,6 +125,12 @@ static const struct usb_device_id usb_quirk_list[] = {
+       { USB_DEVICE(0x04f3, 0x016f), .driver_info =
+                       USB_QUIRK_DEVICE_QUALIFIER },
+ 
++      { USB_DEVICE(0x04f3, 0x0381), .driver_info =
++                      USB_QUIRK_NO_LPM },
++
++      { USB_DEVICE(0x04f3, 0x21b8), .driver_info =
++                      USB_QUIRK_DEVICE_QUALIFIER },
++
+       /* Roland SC-8820 */
+       { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index d4f7b607fc61..37da0e8bac33 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -1931,6 +1931,10 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, 
struct dwc3_ep *dep,
+               return 1;
+       }
+ 
++      if (usb_endpoint_xfer_isoc(dep->endpoint.desc))
++              if ((event->status & DEPEVT_STATUS_IOC) &&
++                              (trb->ctrl & DWC3_TRB_CTRL_IOC))
++                      return 0;
+       return 1;
+ }
+ 
+diff --git a/drivers/usb/renesas_usbhs/fifo.c 
b/drivers/usb/renesas_usbhs/fifo.c
+index e5f429ee7a89..96bc405a5821 100644
+--- a/drivers/usb/renesas_usbhs/fifo.c
++++ b/drivers/usb/renesas_usbhs/fifo.c
+@@ -831,37 +831,47 @@ static void xfer_work(struct work_struct *work)
+ {
+       struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work);
+       struct usbhs_pipe *pipe = pkt->pipe;
+-      struct usbhs_fifo *fifo = usbhs_pipe_to_fifo(pipe);
++      struct usbhs_fifo *fifo;
+       struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
+       struct dma_async_tx_descriptor *desc;
+-      struct dma_chan *chan = usbhsf_dma_chan_get(fifo, pkt);
++      struct dma_chan *chan;
+       struct device *dev = usbhs_priv_to_dev(priv);
+       enum dma_transfer_direction dir;
++      unsigned long flags;
+ 
++      usbhs_lock(priv, flags);
++      fifo = usbhs_pipe_to_fifo(pipe);
++      if (!fifo)
++              goto xfer_work_end;
++
++      chan = usbhsf_dma_chan_get(fifo, pkt);
+       dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV;
+ 
+       desc = dmaengine_prep_slave_single(chan, pkt->dma + pkt->actual,
+                                       pkt->trans, dir,
+                                       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+       if (!desc)
+-              return;
++              goto xfer_work_end;
+ 
+       desc->callback          = usbhsf_dma_complete;
+       desc->callback_param    = pipe;
+ 
+       if (dmaengine_submit(desc) < 0) {
+               dev_err(dev, "Failed to submit dma descriptor\n");
+-              return;
++              goto xfer_work_end;
+       }
+ 
+       dev_dbg(dev, "  %s %d (%d/ %d)\n",
+               fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero);
+ 
+       usbhs_pipe_running(pipe, 1);
+-      usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans);
+-      usbhs_pipe_enable(pipe);
+       usbhsf_dma_start(pipe, fifo);
++      usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans);
+       dma_async_issue_pending(chan);
++      usbhs_pipe_enable(pipe);
++
++xfer_work_end:
++      usbhs_unlock(priv, flags);
+ }
+ 
+ /*
+diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c 
b/drivers/usb/renesas_usbhs/mod_gadget.c
+index e56bbb8ab9a0..9f5e9fbfaae5 100644
+--- a/drivers/usb/renesas_usbhs/mod_gadget.c
++++ b/drivers/usb/renesas_usbhs/mod_gadget.c
+@@ -578,6 +578,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
+       struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv);
+       struct usbhs_pipe *pipe;
+       int ret = -EIO;
++      unsigned long flags;
++
++      usbhs_lock(priv, flags);
+ 
+       /*
+        * if it already have pipe,
+@@ -586,7 +589,8 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
+       if (uep->pipe) {
+               usbhs_pipe_clear(uep->pipe);
+               usbhs_pipe_sequence_data0(uep->pipe);
+-              return 0;
++              ret = 0;
++              goto usbhsg_ep_enable_end;
+       }
+ 
+       pipe = usbhs_pipe_malloc(priv,
+@@ -614,6 +618,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
+               ret = 0;
+       }
+ 
++usbhsg_ep_enable_end:
++      usbhs_unlock(priv, flags);
++
+       return ret;
+ }
+ 
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index d67b687f20db..2477bf19a3b4 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -275,6 +275,7 @@ static void option_instat_callback(struct urb *urb);
+ #define TELIT_PRODUCT_LE922_USBCFG5           0x1045
+ #define TELIT_PRODUCT_LE920                   0x1200
+ #define TELIT_PRODUCT_LE910                   0x1201
++#define TELIT_PRODUCT_LE910_USBCFG4           0x1206
+ 
+ /* ZTE PRODUCTS */
+ #define ZTE_VENDOR_ID                         0x19d2
+@@ -1210,6 +1211,8 @@ static const struct usb_device_id option_ids[] = {
+               .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg0 },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910),
+               .driver_info = (kernel_ulong_t)&telit_le910_blacklist },
++      { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
++              .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920),
+               .driver_info = (kernel_ulong_t)&telit_le920_blacklist },
+       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 
0xff, 0xff) }, /* ZTE WCDMA products */
+diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
+index 440d78f39c01..0f9638e72b91 100644
+--- a/drivers/virtio/virtio_balloon.c
++++ b/drivers/virtio/virtio_balloon.c
+@@ -178,6 +178,8 @@ static void leak_balloon(struct virtio_balloon *vb, size_t 
num)
+       num = min(num, ARRAY_SIZE(vb->pfns));
+ 
+       mutex_lock(&vb->balloon_lock);
++      /* We can't release more pages than taken */
++      num = min(num, (size_t)vb->num_pages);
+       for (vb->num_pfns = 0; vb->num_pfns < num;
+            vb->num_pfns += VIRTIO_BALLOON_PAGES_PER_PAGE) {
+               page = balloon_page_dequeue(vb_dev_info);
+diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h
+index 3182273a3407..1418daa03d95 100644
+--- a/fs/cifs/cifs_fs_sb.h
++++ b/fs/cifs/cifs_fs_sb.h
+@@ -46,6 +46,9 @@
+ #define CIFS_MOUNT_CIFS_BACKUPUID 0x200000 /* backup intent bit for a user */
+ #define CIFS_MOUNT_CIFS_BACKUPGID 0x400000 /* backup intent bit for a group */
+ #define CIFS_MOUNT_MAP_SFM_CHR        0x800000 /* SFM/MAC mapping for illegal 
chars */
++#define CIFS_MOUNT_USE_PREFIX_PATH 0x1000000 /* make subpath with unaccessible
++                                            * root mountable
++                                            */
+ 
+ struct cifs_sb_info {
+       struct rb_root tlink_tree;
+@@ -67,5 +70,6 @@ struct cifs_sb_info {
+       struct backing_dev_info bdi;
+       struct delayed_work prune_tlinks;
+       struct rcu_head rcu;
++      char *prepath;
+ };
+ #endif                                /* _CIFS_FS_SB_H */
+diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
+index cee9889a6612..78404806a7f6 100644
+--- a/fs/cifs/cifsencrypt.c
++++ b/fs/cifs/cifsencrypt.c
+@@ -727,24 +727,26 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct 
nls_table *nls_cp)
+ 
+       memcpy(ses->auth_key.response + baselen, tiblob, tilen);
+ 
++      mutex_lock(&ses->server->srv_mutex);
++
+       rc = crypto_hmacmd5_alloc(ses->server);
+       if (rc) {
+               cifs_dbg(VFS, "could not crypto alloc hmacmd5 rc %d\n", rc);
+-              goto setup_ntlmv2_rsp_ret;
++              goto unlock;
+       }
+ 
+       /* calculate ntlmv2_hash */
+       rc = calc_ntlmv2_hash(ses, ntlmv2_hash, nls_cp);
+       if (rc) {
+               cifs_dbg(VFS, "could not get v2 hash rc %d\n", rc);
+-              goto setup_ntlmv2_rsp_ret;
++              goto unlock;
+       }
+ 
+       /* calculate first part of the client response (CR1) */
+       rc = CalcNTLMv2_response(ses, ntlmv2_hash);
+       if (rc) {
+               cifs_dbg(VFS, "Could not calculate CR1 rc: %d\n", rc);
+-              goto setup_ntlmv2_rsp_ret;
++              goto unlock;
+       }
+ 
+       /* now calculate the session key for NTLMv2 */
+@@ -753,13 +755,13 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct 
nls_table *nls_cp)
+       if (rc) {
+               cifs_dbg(VFS, "%s: Could not set NTLMV2 Hash as a key\n",
+                        __func__);
+-              goto setup_ntlmv2_rsp_ret;
++              goto unlock;
+       }
+ 
+       rc = crypto_shash_init(&ses->server->secmech.sdeschmacmd5->shash);
+       if (rc) {
+               cifs_dbg(VFS, "%s: Could not init hmacmd5\n", __func__);
+-              goto setup_ntlmv2_rsp_ret;
++              goto unlock;
+       }
+ 
+       rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
+@@ -767,7 +769,7 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct 
nls_table *nls_cp)
+               CIFS_HMAC_MD5_HASH_SIZE);
+       if (rc) {
+               cifs_dbg(VFS, "%s: Could not update with response\n", __func__);
+-              goto setup_ntlmv2_rsp_ret;
++              goto unlock;
+       }
+ 
+       rc = crypto_shash_final(&ses->server->secmech.sdeschmacmd5->shash,
+@@ -775,6 +777,8 @@ setup_ntlmv2_rsp(struct cifs_ses *ses, const struct 
nls_table *nls_cp)
+       if (rc)
+               cifs_dbg(VFS, "%s: Could not generate md5 hash\n", __func__);
+ 
++unlock:
++      mutex_unlock(&ses->server->srv_mutex);
+ setup_ntlmv2_rsp_ret:
+       kfree(tiblob);
+ 
+diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
+index 3e924abdd969..103e8b6604b1 100644
+--- a/fs/cifs/cifsfs.c
++++ b/fs/cifs/cifsfs.c
+@@ -678,6 +678,14 @@ cifs_do_mount(struct file_system_type *fs_type,
+               goto out_cifs_sb;
+       }
+ 
++      if (volume_info->prepath) {
++              cifs_sb->prepath = kstrdup(volume_info->prepath, GFP_KERNEL);
++              if (cifs_sb->prepath == NULL) {
++                      root = ERR_PTR(-ENOMEM);
++                      goto out_cifs_sb;
++              }
++      }
++
+       cifs_setup_cifs_sb(volume_info, cifs_sb);
+ 
+       rc = cifs_mount(cifs_sb, volume_info);
+@@ -716,7 +724,11 @@ cifs_do_mount(struct file_system_type *fs_type,
+               sb->s_flags |= MS_ACTIVE;
+       }
+ 
+-      root = cifs_get_root(volume_info, sb);
++      if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
++              root = dget(sb->s_root);
++      else
++              root = cifs_get_root(volume_info, sb);
++
+       if (IS_ERR(root))
+               goto out_super;
+ 
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index db97215a23b2..5093710e7660 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -3434,6 +3434,44 @@ cifs_get_volume_info(char *mount_data, const char 
*devname)
+       return volume_info;
+ }
+ 
++static int
++cifs_are_all_path_components_accessible(struct TCP_Server_Info *server,
++                                      unsigned int xid,
++                                      struct cifs_tcon *tcon,
++                                      struct cifs_sb_info *cifs_sb,
++                                      char *full_path)
++{
++      int rc;
++      char *s;
++      char sep, tmp;
++
++      sep = CIFS_DIR_SEP(cifs_sb);
++      s = full_path;
++
++      rc = server->ops->is_path_accessible(xid, tcon, cifs_sb, "");
++      while (rc == 0) {
++              /* skip separators */
++              while (*s == sep)
++                      s++;
++              if (!*s)
++                      break;
++              /* next separator */
++              while (*s && *s != sep)
++                      s++;
++
++              /*
++               * temporarily null-terminate the path at the end of
++               * the current component
++               */
++              tmp = *s;
++              *s = 0;
++              rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
++                                                   full_path);
++              *s = tmp;
++      }
++      return rc;
++}
++
+ int
+ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
+ {
+@@ -3560,6 +3598,16 @@ remote_path_check:
+                       kfree(full_path);
+                       goto mount_fail_check;
+               }
++
++              rc = cifs_are_all_path_components_accessible(server,
++                                                           xid, tcon, cifs_sb,
++                                                           full_path);
++              if (rc != 0) {
++                      cifs_dbg(VFS, "cannot query dirs between root and final 
path, "
++                               "enabling CIFS_MOUNT_USE_PREFIX_PATH\n");
++                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_USE_PREFIX_PATH;
++                      rc = 0;
++              }
+               kfree(full_path);
+       }
+ 
+@@ -3823,6 +3871,7 @@ cifs_umount(struct cifs_sb_info *cifs_sb)
+ 
+       bdi_destroy(&cifs_sb->bdi);
+       kfree(cifs_sb->mountdata);
++      kfree(cifs_sb->prepath);
+       call_rcu(&cifs_sb->rcu, delayed_free);
+ }
+ 
+diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
+index b72bc29cba23..ed7b6f7d5abe 100644
+--- a/fs/cifs/dir.c
++++ b/fs/cifs/dir.c
+@@ -84,6 +84,7 @@ build_path_from_dentry(struct dentry *direntry)
+       struct dentry *temp;
+       int namelen;
+       int dfsplen;
++      int pplen = 0;
+       char *full_path;
+       char dirsep;
+       struct cifs_sb_info *cifs_sb = CIFS_SB(direntry->d_sb);
+@@ -95,8 +96,12 @@ build_path_from_dentry(struct dentry *direntry)
+               dfsplen = strnlen(tcon->treeName, MAX_TREE_SIZE + 1);
+       else
+               dfsplen = 0;
++
++      if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
++              pplen = cifs_sb->prepath ? strlen(cifs_sb->prepath) + 1 : 0;
++
+ cifs_bp_rename_retry:
+-      namelen = dfsplen;
++      namelen = dfsplen + pplen;
+       seq = read_seqbegin(&rename_lock);
+       rcu_read_lock();
+       for (temp = direntry; !IS_ROOT(temp);) {
+@@ -137,7 +142,7 @@ cifs_bp_rename_retry:
+               }
+       }
+       rcu_read_unlock();
+-      if (namelen != dfsplen || read_seqretry(&rename_lock, seq)) {
++      if (namelen != dfsplen + pplen || read_seqretry(&rename_lock, seq)) {
+               cifs_dbg(FYI, "did not end path lookup where expected. 
namelen=%ddfsplen=%d\n",
+                        namelen, dfsplen);
+               /* presumably this is only possible if racing with a rename
+@@ -153,6 +158,17 @@ cifs_bp_rename_retry:
+          those safely to '/' if any are found in the middle of the prepath */
+       /* BB test paths to Windows with '/' in the midst of prepath */
+ 
++      if (pplen) {
++              int i;
++
++              cifs_dbg(FYI, "using cifs_sb prepath <%s>\n", cifs_sb->prepath);
++              memcpy(full_path+dfsplen+1, cifs_sb->prepath, pplen-1);
++              full_path[dfsplen] = '\\';
++              for (i = 0; i < pplen-1; i++)
++                      if (full_path[dfsplen+1+i] == '/')
++                              full_path[dfsplen+1+i] = CIFS_DIR_SEP(cifs_sb);
++      }
++
+       if (dfsplen) {
+               strncpy(full_path, tcon->treeName, dfsplen);
+               if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) {
+@@ -229,6 +245,13 @@ cifs_do_create(struct inode *inode, struct dentry 
*direntry, unsigned int xid,
+                               goto cifs_create_get_file_info;
+                       }
+ 
++                      if (S_ISDIR(newinode->i_mode)) {
++                              CIFSSMBClose(xid, tcon, fid->netfid);
++                              iput(newinode);
++                              rc = -EISDIR;
++                              goto out;
++                      }
++
+                       if (!S_ISREG(newinode->i_mode)) {
+                               /*
+                                * The server may allow us to open things like
+@@ -399,10 +422,14 @@ cifs_create_set_dentry:
+       if (rc != 0) {
+               cifs_dbg(FYI, "Create worked, get_inode_info failed rc = %d\n",
+                        rc);
+-              if (server->ops->close)
+-                      server->ops->close(xid, tcon, fid);
+-              goto out;
++              goto out_err;
+       }
++
++      if (S_ISDIR(newinode->i_mode)) {
++              rc = -EISDIR;
++              goto out_err;
++      }
++
+       d_drop(direntry);
+       d_add(direntry, newinode);
+ 
+@@ -410,6 +437,13 @@ out:
+       kfree(buf);
+       kfree(full_path);
+       return rc;
++
++out_err:
++      if (server->ops->close)
++              server->ops->close(xid, tcon, fid);
++      if (newinode)
++              iput(newinode);
++      goto out;
+ }
+ 
+ int
+diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
+index c88a8279e532..ff226cc6d391 100644
+--- a/fs/cifs/inode.c
++++ b/fs/cifs/inode.c
+@@ -958,10 +958,26 @@ struct inode *cifs_root_iget(struct super_block *sb)
+       struct inode *inode = NULL;
+       long rc;
+       struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
++      char *path = NULL;
++      int len;
++
++      if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_USE_PREFIX_PATH)
++          && cifs_sb->prepath) {
++              len = strlen(cifs_sb->prepath);
++              path = kzalloc(len + 2 /* leading sep + null */, GFP_KERNEL);
++              if (path == NULL)
++                      return ERR_PTR(-ENOMEM);
++              path[0] = '/';
++              memcpy(path+1, cifs_sb->prepath, len);
++      } else {
++              path = kstrdup("", GFP_KERNEL);
++              if (path == NULL)
++                      return ERR_PTR(-ENOMEM);
++      }
+ 
+       xid = get_xid();
+       if (tcon->unix_ext) {
+-              rc = cifs_get_inode_info_unix(&inode, "", sb, xid);
++              rc = cifs_get_inode_info_unix(&inode, path, sb, xid);
+               /* some servers mistakenly claim POSIX support */
+               if (rc != -EOPNOTSUPP)
+                       goto iget_no_retry;
+@@ -969,7 +985,8 @@ struct inode *cifs_root_iget(struct super_block *sb)
+               tcon->unix_ext = false;
+       }
+ 
+-      rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL);
++      convert_delimiter(path, CIFS_DIR_SEP(cifs_sb));
++      rc = cifs_get_inode_info(&inode, path, NULL, sb, xid, NULL);
+ 
+ iget_no_retry:
+       if (!inode) {
+@@ -998,6 +1015,7 @@ iget_no_retry:
+       }
+ 
+ out:
++      kfree(path);
+       /* can not call macro free_xid here since in a void func
+        * TODO: This is no longer true
+        */
+diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
+index 51f5251d7db5..aa68b34301ec 100644
+--- a/fs/cifs/smb2ops.c
++++ b/fs/cifs/smb2ops.c
+@@ -972,6 +972,9 @@ smb2_new_lease_key(struct cifs_fid *fid)
+       get_random_bytes(fid->lease_key, SMB2_LEASE_KEY_SIZE);
+ }
+ 
++#define SMB2_SYMLINK_STRUCT_SIZE \
++      (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp))
++
+ static int
+ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
+                  const char *full_path, char **target_path,
+@@ -984,7 +987,10 @@ smb2_query_symlink(const unsigned int xid, struct 
cifs_tcon *tcon,
+       struct cifs_fid fid;
+       struct smb2_err_rsp *err_buf = NULL;
+       struct smb2_symlink_err_rsp *symlink;
+-      unsigned int sub_len, sub_offset;
++      unsigned int sub_len;
++      unsigned int sub_offset;
++      unsigned int print_len;
++      unsigned int print_offset;
+ 
+       cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
+ 
+@@ -1005,11 +1011,33 @@ smb2_query_symlink(const unsigned int xid, struct 
cifs_tcon *tcon,
+               kfree(utf16_path);
+               return -ENOENT;
+       }
++
++      if (le32_to_cpu(err_buf->ByteCount) < sizeof(struct 
smb2_symlink_err_rsp) ||
++          get_rfc1002_length(err_buf) + 4 < SMB2_SYMLINK_STRUCT_SIZE) {
++              kfree(utf16_path);
++              return -ENOENT;
++      }
++
+       /* open must fail on symlink - reset rc */
+       rc = 0;
+       symlink = (struct smb2_symlink_err_rsp *)err_buf->ErrorData;
+       sub_len = le16_to_cpu(symlink->SubstituteNameLength);
+       sub_offset = le16_to_cpu(symlink->SubstituteNameOffset);
++      print_len = le16_to_cpu(symlink->PrintNameLength);
++      print_offset = le16_to_cpu(symlink->PrintNameOffset);
++
++      if (get_rfc1002_length(err_buf) + 4 <
++                      SMB2_SYMLINK_STRUCT_SIZE + sub_offset + sub_len) {
++              kfree(utf16_path);
++              return -ENOENT;
++      }
++
++      if (get_rfc1002_length(err_buf) + 4 <
++                      SMB2_SYMLINK_STRUCT_SIZE + print_offset + print_len) {
++              kfree(utf16_path);
++              return -ENOENT;
++      }
++
+       *target_path = cifs_strndup_from_utf16(
+                               (char *)symlink->PathBuffer + sub_offset,
+                               sub_len, true, cifs_sb->local_nls);
+diff --git a/fs/dcache.c b/fs/dcache.c
+index 7654509f398f..53ad17f9ea44 100644
+--- a/fs/dcache.c
++++ b/fs/dcache.c
+@@ -508,7 +508,7 @@ static void __dentry_kill(struct dentry *dentry)
+        * dentry_iput drops the locks, at which point nobody (except
+        * transient RCU lookups) can reach this dentry.
+        */
+-      BUG_ON((int)dentry->d_lockref.count > 0);
++      BUG_ON(dentry->d_lockref.count > 0);
+       this_cpu_dec(nr_dentry);
+       if (dentry->d_op && dentry->d_op->d_release)
+               dentry->d_op->d_release(dentry);
+@@ -552,7 +552,6 @@ static struct dentry *dentry_kill(struct dentry *dentry)
+ 
+ failed:
+       spin_unlock(&dentry->d_lock);
+-      cpu_relax();
+       return dentry; /* try again with same dentry */
+ }
+ 
+@@ -561,7 +560,7 @@ static inline struct dentry *lock_parent(struct dentry 
*dentry)
+       struct dentry *parent = dentry->d_parent;
+       if (IS_ROOT(dentry))
+               return NULL;
+-      if (unlikely((int)dentry->d_lockref.count < 0))
++      if (unlikely(dentry->d_lockref.count < 0))
+               return NULL;
+       if (likely(spin_trylock(&parent->d_lock)))
+               return parent;
+@@ -590,6 +589,110 @@ again:
+       return parent;
+ }
+ 
++/*
++ * Try to do a lockless dput(), and return whether that was successful.
++ *
++ * If unsuccessful, we return false, having already taken the dentry lock.
++ *
++ * The caller needs to hold the RCU read lock, so that the dentry is
++ * guaranteed to stay around even if the refcount goes down to zero!
++ */
++static inline bool fast_dput(struct dentry *dentry)
++{
++      int ret;
++      unsigned int d_flags;
++
++      /*
++       * If we have a d_op->d_delete() operation, we sould not
++       * let the dentry count go to zero, so use "put__or_lock".
++       */
++      if (unlikely(dentry->d_flags & DCACHE_OP_DELETE))
++              return lockref_put_or_lock(&dentry->d_lockref);
++
++      /*
++       * .. otherwise, we can try to just decrement the
++       * lockref optimistically.
++       */
++      ret = lockref_put_return(&dentry->d_lockref);
++
++      /*
++       * If the lockref_put_return() failed due to the lock being held
++       * by somebody else, the fast path has failed. We will need to
++       * get the lock, and then check the count again.
++       */
++      if (unlikely(ret < 0)) {
++              spin_lock(&dentry->d_lock);
++              if (dentry->d_lockref.count > 1) {
++                      dentry->d_lockref.count--;
++                      spin_unlock(&dentry->d_lock);
++                      return 1;
++              }
++              return 0;
++      }
++
++      /*
++       * If we weren't the last ref, we're done.
++       */
++      if (ret)
++              return 1;
++
++      /*
++       * Careful, careful. The reference count went down
++       * to zero, but we don't hold the dentry lock, so
++       * somebody else could get it again, and do another
++       * dput(), and we need to not race with that.
++       *
++       * However, there is a very special and common case
++       * where we don't care, because there is nothing to
++       * do: the dentry is still hashed, it does not have
++       * a 'delete' op, and it's referenced and already on
++       * the LRU list.
++       *
++       * NOTE! Since we aren't locked, these values are
++       * not "stable". However, it is sufficient that at
++       * some point after we dropped the reference the
++       * dentry was hashed and the flags had the proper
++       * value. Other dentry users may have re-gotten
++       * a reference to the dentry and change that, but
++       * our work is done - we can leave the dentry
++       * around with a zero refcount.
++       */
++      smp_rmb();
++      d_flags = ACCESS_ONCE(dentry->d_flags);
++      d_flags &= DCACHE_REFERENCED | DCACHE_LRU_LIST;
++
++      /* Nothing to do? Dropping the reference was all we needed? */
++      if (d_flags == (DCACHE_REFERENCED | DCACHE_LRU_LIST) && 
!d_unhashed(dentry))
++              return 1;
++
++      /*
++       * Not the fast normal case? Get the lock. We've already decremented
++       * the refcount, but we'll need to re-check the situation after
++       * getting the lock.
++       */
++      spin_lock(&dentry->d_lock);
++
++      /*
++       * Did somebody else grab a reference to it in the meantime, and
++       * we're no longer the last user after all? Alternatively, somebody
++       * else could have killed it and marked it dead. Either way, we
++       * don't need to do anything else.
++       */
++      if (dentry->d_lockref.count) {
++              spin_unlock(&dentry->d_lock);
++              return 1;
++      }
++
++      /*
++       * Re-get the reference we optimistically dropped. We hold the
++       * lock, and we just tested that it was zero, so we can just
++       * set it to 1.
++       */
++      dentry->d_lockref.count = 1;
++      return 0;
++}
++
++
+ /* 
+  * This is dput
+  *
+@@ -622,8 +725,16 @@ void dput(struct dentry *dentry)
+               return;
+ 
+ repeat:
+-      if (lockref_put_or_lock(&dentry->d_lockref))
++      might_sleep();
++
++      rcu_read_lock();
++      if (likely(fast_dput(dentry))) {
++              rcu_read_unlock();
+               return;
++      }
++
++      /* Slow case: now with the dentry lock held */
++      rcu_read_unlock();
+ 
+       /* Unreachable? Get rid of it */
+       if (unlikely(d_unhashed(dentry)))
+@@ -647,8 +758,10 @@ repeat:
+ 
+ kill_it:
+       dentry = dentry_kill(dentry);
+-      if (dentry)
++      if (dentry) {
++              cond_resched();
+               goto repeat;
++      }
+ }
+ EXPORT_SYMBOL(dput);
+ 
+@@ -813,7 +926,7 @@ static void shrink_dentry_list(struct list_head *list)
+                * We found an inuse dentry which was not removed from
+                * the LRU because of laziness during lookup. Do not free it.
+                */
+-              if ((int)dentry->d_lockref.count > 0) {
++              if (dentry->d_lockref.count > 0) {
+                       spin_unlock(&dentry->d_lock);
+                       if (parent)
+                               spin_unlock(&parent->d_lock);
+diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
+index 83a6f497c4e0..cb3860817fed 100644
+--- a/fs/ext4/balloc.c
++++ b/fs/ext4/balloc.c
+@@ -209,6 +209,9 @@ static int ext4_init_block_bitmap(struct super_block *sb,
+       memset(bh->b_data, 0, sb->s_blocksize);
+ 
+       bit_max = ext4_num_base_meta_clusters(sb, block_group);
++      if ((bit_max >> 3) >= bh->b_size)
++              return -EIO;
++
+       for (bit = 0; bit < bit_max; bit++)
+               ext4_set_bit(bit, bh->b_data);
+ 
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
+index b95c32096a68..e5b44dd2724e 100644
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -375,9 +375,13 @@ static int ext4_valid_extent(struct inode *inode, struct 
ext4_extent *ext)
+       ext4_fsblk_t block = ext4_ext_pblock(ext);
+       int len = ext4_ext_get_actual_len(ext);
+       ext4_lblk_t lblock = le32_to_cpu(ext->ee_block);
+-      ext4_lblk_t last = lblock + len - 1;
+ 
+-      if (len == 0 || lblock > last)
++      /*
++       * We allow neither:
++       *  - zero length
++       *  - overflow/wrap-around
++       */
++      if (lblock + len <= lblock)
+               return 0;
+       return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len);
+ }
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 6d7293082086..e5dc3007627a 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -207,9 +207,9 @@ void ext4_evict_inode(struct inode *inode)
+                * Note that directories do not have this problem because they
+                * don't use page cache.
+                */
+-              if (ext4_should_journal_data(inode) &&
+-                  (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) &&
+-                  inode->i_ino != EXT4_JOURNAL_INO) {
++              if (inode->i_ino != EXT4_JOURNAL_INO &&
++                  ext4_should_journal_data(inode) &&
++                  (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode))) {
+                       journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
+                       tid_t commit_tid = EXT4_I(inode)->i_datasync_tid;
+ 
+@@ -2441,13 +2441,36 @@ retry:
+                               done = true;
+                       }
+               }
+-              ext4_journal_stop(handle);
++              /*
++               * Caution: If the handle is synchronous,
++               * ext4_journal_stop() can wait for transaction commit
++               * to finish which may depend on writeback of pages to
++               * complete or on page lock to be released.  In that
++               * case, we have to wait until after after we have
++               * submitted all the IO, released page locks we hold,
++               * and dropped io_end reference (for extent conversion
++               * to be able to complete) before stopping the handle.
++               */
++              if (!ext4_handle_valid(handle) || handle->h_sync == 0) {
++                      ext4_journal_stop(handle);
++                      handle = NULL;
++              }
+               /* Submit prepared bio */
+               ext4_io_submit(&mpd.io_submit);
+               /* Unlock pages we didn't use */
+               mpage_release_unused_pages(&mpd, give_up_on_write);
+-              /* Drop our io_end reference we got from init */
+-              ext4_put_io_end(mpd.io_submit.io_end);
++              /*
++               * Drop our io_end reference we got from init. We have
++               * to be careful and use deferred io_end finishing if
++               * we are still holding the transaction as we can
++               * release the last reference to io_end which may end
++               * up doing unwritten extent conversion.
++               */
++              if (handle) {
++                      ext4_put_io_end_defer(mpd.io_submit.io_end);
++                      ext4_journal_stop(handle);
++              } else
++                      ext4_put_io_end(mpd.io_submit.io_end);
+ 
+               if (ret == -ENOSPC && sbi->s_journal) {
+                       /*
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index a5d94f263870..02711ffbb398 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -2204,6 +2204,16 @@ static void ext4_orphan_cleanup(struct super_block *sb,
+       while (es->s_last_orphan) {
+               struct inode *inode;
+ 
++              /*
++               * We may have encountered an error during cleanup; if
++               * so, skip the rest.
++               */
++              if (EXT4_SB(sb)->s_mount_state & EXT4_ERROR_FS) {
++                      jbd_debug(1, "Skipping orphan recovery on fs with 
errors.\n");
++                      es->s_last_orphan = 0;
++                      break;
++              }
++
+               inode = ext4_orphan_get(sb, le32_to_cpu(es->s_last_orphan));
+               if (IS_ERR(inode)) {
+                       es->s_last_orphan = 0;
+@@ -3668,6 +3678,13 @@ static int ext4_fill_super(struct super_block *sb, void 
*data, int silent)
+               goto failed_mount;
+       }
+ 
++      if (le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) > (blocksize / 4)) {
++              ext4_msg(sb, KERN_ERR,
++                       "Number of reserved GDT blocks insanely large: %d",
++                       le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks));
++              goto failed_mount;
++      }
++
+       if (sb->s_blocksize != blocksize) {
+               /* Validate the filesystem blocksize */
+               if (!sb_set_blocksize(sb, blocksize)) {
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index e2a2c14a90ee..8e2c5ccc09b1 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -454,6 +454,15 @@ static int fuse_flush(struct file *file, fl_owner_t id)
+       fuse_sync_writes(inode);
+       mutex_unlock(&inode->i_mutex);
+ 
++      if (test_bit(AS_ENOSPC, &file->f_mapping->flags) &&
++          test_and_clear_bit(AS_ENOSPC, &file->f_mapping->flags))
++              err = -ENOSPC;
++      if (test_bit(AS_EIO, &file->f_mapping->flags) &&
++          test_and_clear_bit(AS_EIO, &file->f_mapping->flags))
++              err = -EIO;
++      if (err)
++              return err;
++
+       req = fuse_get_req_nofail_nopages(fc, file);
+       memset(&inarg, 0, sizeof(inarg));
+       inarg.fh = ff->fh;
+@@ -499,6 +508,21 @@ int fuse_fsync_common(struct file *file, loff_t start, 
loff_t end,
+               goto out;
+ 
+       fuse_sync_writes(inode);
++
++      /*
++       * Due to implementation of fuse writeback
++       * filemap_write_and_wait_range() does not catch errors.
++       * We have to do this directly after fuse_sync_writes()
++       */
++      if (test_bit(AS_ENOSPC, &file->f_mapping->flags) &&
++          test_and_clear_bit(AS_ENOSPC, &file->f_mapping->flags))
++              err = -ENOSPC;
++      if (test_bit(AS_EIO, &file->f_mapping->flags) &&
++          test_and_clear_bit(AS_EIO, &file->f_mapping->flags))
++              err = -EIO;
++      if (err)
++              goto out;
++
+       err = sync_inode_metadata(inode, 1);
+       if (err)
+               goto out;
+diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
+index 9e3f6cfee2fb..230b424543ef 100644
+--- a/fs/fuse/inode.c
++++ b/fs/fuse/inode.c
+@@ -933,7 +933,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct 
fuse_req *req)
+       arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
+               FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK |
+               FUSE_SPLICE_WRITE | FUSE_SPLICE_MOVE | FUSE_SPLICE_READ |
+-              FUSE_FLOCK_LOCKS | FUSE_IOCTL_DIR | FUSE_AUTO_INVAL_DATA |
++              FUSE_FLOCK_LOCKS | FUSE_HAS_IOCTL_DIR | FUSE_AUTO_INVAL_DATA |
+               FUSE_DO_READDIRPLUS | FUSE_READDIRPLUS_AUTO | FUSE_ASYNC_DIO |
+               FUSE_WRITEBACK_CACHE | FUSE_NO_OPEN_SUPPORT;
+       req->in.h.opcode = FUSE_INIT;
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index 6067f2a0b493..395b93f43df5 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -1204,6 +1204,9 @@ int nfs_updatepage(struct file *file, struct page *page,
+       dprintk("NFS:       nfs_updatepage(%pD2 %d@%lld)\n",
+               file, count, (long long)(page_file_offset(page) + offset));
+ 
++      if (!count)
++              goto out;
++
+       if (nfs_can_extend_write(file, page, inode)) {
+               count = max(count + offset, nfs_page_length(page));
+               offset = 0;
+@@ -1214,7 +1217,7 @@ int nfs_updatepage(struct file *file, struct page *page,
+               nfs_set_pageerror(page);
+       else
+               __set_page_dirty_nobuffers(page);
+-
++out:
+       dprintk("NFS:       nfs_updatepage returns %d (isize %lld)\n",
+                       status, (long long)i_size_read(inode));
+       return status;
+diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c
+index ac54ea60b3f6..67bdb78216f3 100644
+--- a/fs/nfsd/nfs2acl.c
++++ b/fs/nfsd/nfs2acl.c
+@@ -104,22 +104,21 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * 
rqstp,
+               goto out;
+ 
+       inode = fh->fh_dentry->d_inode;
+-      if (!IS_POSIXACL(inode) || !inode->i_op->set_acl) {
+-              error = -EOPNOTSUPP;
+-              goto out_errno;
+-      }
+ 
+       error = fh_want_write(fh);
+       if (error)
+               goto out_errno;
+ 
+-      error = inode->i_op->set_acl(inode, argp->acl_access, ACL_TYPE_ACCESS);
++      fh_lock(fh);
++
++      error = set_posix_acl(inode, ACL_TYPE_ACCESS, argp->acl_access);
+       if (error)
+-              goto out_drop_write;
+-      error = inode->i_op->set_acl(inode, argp->acl_default,
+-                                   ACL_TYPE_DEFAULT);
++              goto out_drop_lock;
++      error = set_posix_acl(inode, ACL_TYPE_DEFAULT, argp->acl_default);
+       if (error)
+-              goto out_drop_write;
++              goto out_drop_lock;
++
++      fh_unlock(fh);
+ 
+       fh_drop_write(fh);
+ 
+@@ -131,7 +130,8 @@ out:
+       posix_acl_release(argp->acl_access);
+       posix_acl_release(argp->acl_default);
+       return nfserr;
+-out_drop_write:
++out_drop_lock:
++      fh_unlock(fh);
+       fh_drop_write(fh);
+ out_errno:
+       nfserr = nfserrno(error);
+diff --git a/fs/nfsd/nfs3acl.c b/fs/nfsd/nfs3acl.c
+index 34cbbab6abd7..78562dd5999c 100644
+--- a/fs/nfsd/nfs3acl.c
++++ b/fs/nfsd/nfs3acl.c
+@@ -95,22 +95,20 @@ static __be32 nfsd3_proc_setacl(struct svc_rqst * rqstp,
+               goto out;
+ 
+       inode = fh->fh_dentry->d_inode;
+-      if (!IS_POSIXACL(inode) || !inode->i_op->set_acl) {
+-              error = -EOPNOTSUPP;
+-              goto out_errno;
+-      }
+ 
+       error = fh_want_write(fh);
+       if (error)
+               goto out_errno;
+ 
+-      error = inode->i_op->set_acl(inode, argp->acl_access, ACL_TYPE_ACCESS);
++      fh_lock(fh);
++
++      error = set_posix_acl(inode, ACL_TYPE_ACCESS, argp->acl_access);
+       if (error)
+-              goto out_drop_write;
+-      error = inode->i_op->set_acl(inode, argp->acl_default,
+-                                   ACL_TYPE_DEFAULT);
++              goto out_drop_lock;
++      error = set_posix_acl(inode, ACL_TYPE_DEFAULT, argp->acl_default);
+ 
+-out_drop_write:
++out_drop_lock:
++      fh_unlock(fh);
+       fh_drop_write(fh);
+ out_errno:
+       nfserr = nfserrno(error);
+diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c
+index 59fd76651781..df90268d7562 100644
+--- a/fs/nfsd/nfs4acl.c
++++ b/fs/nfsd/nfs4acl.c
+@@ -830,9 +830,6 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh 
*fhp,
+       dentry = fhp->fh_dentry;
+       inode = dentry->d_inode;
+ 
+-      if (!inode->i_op->set_acl || !IS_POSIXACL(inode))
+-              return nfserr_attrnotsupp;
+-
+       if (S_ISDIR(inode->i_mode))
+               flags = NFS4_ACL_DIR;
+ 
+@@ -842,16 +839,19 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh 
*fhp,
+       if (host_error < 0)
+               goto out_nfserr;
+ 
+-      host_error = inode->i_op->set_acl(inode, pacl, ACL_TYPE_ACCESS);
++      fh_lock(fhp);
++
++      host_error = set_posix_acl(inode, ACL_TYPE_ACCESS, pacl);
+       if (host_error < 0)
+-              goto out_release;
++              goto out_drop_lock;
+ 
+       if (S_ISDIR(inode->i_mode)) {
+-              host_error = inode->i_op->set_acl(inode, dpacl,
+-                                                ACL_TYPE_DEFAULT);
++              host_error = set_posix_acl(inode, ACL_TYPE_DEFAULT, dpacl);
+       }
+ 
+-out_release:
++out_drop_lock:
++      fh_unlock(fhp);
++
+       posix_acl_release(pacl);
+       posix_acl_release(dpacl);
+ out_nfserr:
+diff --git a/fs/posix_acl.c b/fs/posix_acl.c
+index 0855f772cd41..3de7c223c963 100644
+--- a/fs/posix_acl.c
++++ b/fs/posix_acl.c
+@@ -787,38 +787,42 @@ posix_acl_xattr_get(struct dentry *dentry, const char 
*name,
+       return error;
+ }
+ 
+-static int
+-posix_acl_xattr_set(struct dentry *dentry, const char *name,
+-              const void *value, size_t size, int flags, int type)
++int
++set_posix_acl(struct inode *inode, int type, struct posix_acl *acl)
+ {
+-      struct inode *inode = dentry->d_inode;
+-      struct posix_acl *acl = NULL;
+-      int ret;
+-
+       if (!IS_POSIXACL(inode))
+               return -EOPNOTSUPP;
+       if (!inode->i_op->set_acl)
+               return -EOPNOTSUPP;
+ 
+       if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode))
+-              return value ? -EACCES : 0;
++              return acl ? -EACCES : 0;
+       if (!inode_owner_or_capable(inode))
+               return -EPERM;
+ 
++      if (acl) {
++              int ret = posix_acl_valid(acl);
++              if (ret)
++                      return ret;
++      }
++      return inode->i_op->set_acl(inode, acl, type);
++}
++EXPORT_SYMBOL(set_posix_acl);
++
++static int
++posix_acl_xattr_set(struct dentry *dentry, const char *name,
++              const void *value, size_t size, int flags, int type)
++{
++      struct inode *inode = dentry->d_inode;
++      struct posix_acl *acl = NULL;
++      int ret;
++
+       if (value) {
+               acl = posix_acl_from_xattr(&init_user_ns, value, size);
+               if (IS_ERR(acl))
+                       return PTR_ERR(acl);
+-
+-              if (acl) {
+-                      ret = posix_acl_valid(acl);
+-                      if (ret)
+-                              goto out;
+-              }
+       }
+-
+-      ret = inode->i_op->set_acl(inode, acl, type);
+-out:
++      ret = set_posix_acl(inode, type, acl);
+       posix_acl_release(acl);
+       return ret;
+ }
+diff --git a/include/linux/i8042.h b/include/linux/i8042.h
+index 0f9bafa17a02..d98780ca9604 100644
+--- a/include/linux/i8042.h
++++ b/include/linux/i8042.h
+@@ -62,7 +62,6 @@ struct serio;
+ void i8042_lock_chip(void);
+ void i8042_unlock_chip(void);
+ int i8042_command(unsigned char *param, int command);
+-bool i8042_check_port_owner(const struct serio *);
+ int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str,
+                                       struct serio *serio));
+ int i8042_remove_filter(bool (*filter)(unsigned char data, unsigned char str,
+@@ -83,11 +82,6 @@ static inline int i8042_command(unsigned char *param, int 
command)
+       return -ENODEV;
+ }
+ 
+-static inline bool i8042_check_port_owner(const struct serio *serio)
+-{
+-      return false;
+-}
+-
+ static inline int i8042_install_filter(bool (*filter)(unsigned char data, 
unsigned char str,
+                                       struct serio *serio))
+ {
+diff --git a/include/linux/lockref.h b/include/linux/lockref.h
+index 4bfde0e99ed5..b10b122dd099 100644
+--- a/include/linux/lockref.h
++++ b/include/linux/lockref.h
+@@ -28,12 +28,13 @@ struct lockref {
+ #endif
+               struct {
+                       spinlock_t lock;
+-                      unsigned int count;
++                      int count;
+               };
+       };
+ };
+ 
+ extern void lockref_get(struct lockref *);
++extern int lockref_put_return(struct lockref *);
+ extern int lockref_get_not_zero(struct lockref *);
+ extern int lockref_get_or_lock(struct lockref *);
+ extern int lockref_put_or_lock(struct lockref *);
+diff --git a/include/linux/serio.h b/include/linux/serio.h
+index 9f779c7a2da4..27ae809edd70 100644
+--- a/include/linux/serio.h
++++ b/include/linux/serio.h
+@@ -29,7 +29,8 @@ struct serio {
+ 
+       struct serio_device_id id;
+ 
+-      spinlock_t lock;                /* protects critical sections from 
port's interrupt handler */
++      /* Protects critical sections from port's interrupt handler */
++      spinlock_t lock;
+ 
+       int (*write)(struct serio *, unsigned char);
+       int (*open)(struct serio *);
+@@ -38,16 +39,29 @@ struct serio {
+       void (*stop)(struct serio *);
+ 
+       struct serio *parent;
+-      struct list_head child_node;    /* Entry in parent->children list */
++      /* Entry in parent->children list */
++      struct list_head child_node;
+       struct list_head children;
+-      unsigned int depth;             /* level of nesting in serio hierarchy 
*/
++      /* Level of nesting in serio hierarchy */
++      unsigned int depth;
+ 
+-      struct serio_driver *drv;       /* accessed from interrupt, must be 
protected by serio->lock and serio->sem */
+-      struct mutex drv_mutex;         /* protects serio->drv so attributes 
can pin driver */
++      /*
++       * serio->drv is accessed from interrupt handlers; when modifying
++       * caller should acquire serio->drv_mutex and serio->lock.
++       */
++      struct serio_driver *drv;
++      /* Protects serio->drv so attributes can pin current driver */
++      struct mutex drv_mutex;
+ 
+       struct device dev;
+ 
+       struct list_head node;
++
++      /*
++       * For use by PS/2 layer when several ports share hardware and
++       * may get indigestion when exposed to concurrent access (i8042).
++       */
++      struct mutex *ps2_cmd_mutex;
+ };
+ #define to_serio_port(d)      container_of(d, struct serio, dev)
+ 
+diff --git a/ipc/msg.c b/ipc/msg.c
+index cfc8b388332d..02e72d3db498 100644
+--- a/ipc/msg.c
++++ b/ipc/msg.c
+@@ -678,7 +678,7 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext,
+               rcu_read_lock();
+               ipc_lock_object(&msq->q_perm);
+ 
+-              ipc_rcu_putref(msq, ipc_rcu_free);
++              ipc_rcu_putref(msq, msg_rcu_free);
+               /* raced with RMID? */
+               if (!ipc_valid_object(&msq->q_perm)) {
+                       err = -EIDRM;
+diff --git a/ipc/sem.c b/ipc/sem.c
+index 85ad28aaf548..e59935d0dfcb 100644
+--- a/ipc/sem.c
++++ b/ipc/sem.c
+@@ -441,7 +441,7 @@ static inline struct sem_array 
*sem_obtain_object_check(struct ipc_namespace *ns
+ static inline void sem_lock_and_putref(struct sem_array *sma)
+ {
+       sem_lock(sma, NULL, -1);
+-      ipc_rcu_putref(sma, ipc_rcu_free);
++      ipc_rcu_putref(sma, sem_rcu_free);
+ }
+ 
+ static inline void sem_rmid(struct ipc_namespace *ns, struct sem_array *s)
+@@ -1384,7 +1384,7 @@ static int semctl_main(struct ipc_namespace *ns, int 
semid, int semnum,
+                       rcu_read_unlock();
+                       sem_io = ipc_alloc(sizeof(ushort)*nsems);
+                       if (sem_io == NULL) {
+-                              ipc_rcu_putref(sma, ipc_rcu_free);
++                              ipc_rcu_putref(sma, sem_rcu_free);
+                               return -ENOMEM;
+                       }
+ 
+@@ -1418,20 +1418,20 @@ static int semctl_main(struct ipc_namespace *ns, int 
semid, int semnum,
+               if (nsems > SEMMSL_FAST) {
+                       sem_io = ipc_alloc(sizeof(ushort)*nsems);
+                       if (sem_io == NULL) {
+-                              ipc_rcu_putref(sma, ipc_rcu_free);
++                              ipc_rcu_putref(sma, sem_rcu_free);
+                               return -ENOMEM;
+                       }
+               }
+ 
+               if (copy_from_user(sem_io, p, nsems*sizeof(ushort))) {
+-                      ipc_rcu_putref(sma, ipc_rcu_free);
++                      ipc_rcu_putref(sma, sem_rcu_free);
+                       err = -EFAULT;
+                       goto out_free;
+               }
+ 
+               for (i = 0; i < nsems; i++) {
+                       if (sem_io[i] > SEMVMX) {
+-                              ipc_rcu_putref(sma, ipc_rcu_free);
++                              ipc_rcu_putref(sma, sem_rcu_free);
+                               err = -ERANGE;
+                               goto out_free;
+                       }
+@@ -1721,7 +1721,7 @@ static struct sem_undo *find_alloc_undo(struct 
ipc_namespace *ns, int semid)
+       /* step 2: allocate new undo structure */
+       new = kzalloc(sizeof(struct sem_undo) + sizeof(short)*nsems, 
GFP_KERNEL);
+       if (!new) {
+-              ipc_rcu_putref(sma, ipc_rcu_free);
++              ipc_rcu_putref(sma, sem_rcu_free);
+               return ERR_PTR(-ENOMEM);
+       }
+ 
+diff --git a/kernel/auditsc.c b/kernel/auditsc.c
+index cc3416f0deda..3a6e01013b34 100644
+--- a/kernel/auditsc.c
++++ b/kernel/auditsc.c
+@@ -73,6 +73,7 @@
+ #include <linux/compat.h>
+ #include <linux/ctype.h>
+ #include <linux/string.h>
++#include <linux/uaccess.h>
+ #include <uapi/linux/limits.h>
+ 
+ #include "audit.h"
+@@ -82,7 +83,8 @@
+ #define AUDITSC_SUCCESS 1
+ #define AUDITSC_FAILURE 2
+ 
+-/* no execve audit message should be longer than this (userspace limits) */
++/* no execve audit message should be longer than this (userspace limits),
++ * see the note near the top of audit_log_execve_info() about this value */
+ #define MAX_EXECVE_AUDIT_LEN 7500
+ 
+ /* max length to print of cmdline/proctitle value during audit */
+@@ -1010,185 +1012,178 @@ static int audit_log_pid_context(struct 
audit_context *context, pid_t pid,
+       return rc;
+ }
+ 
+-/*
+- * to_send and len_sent accounting are very loose estimates.  We aren't
+- * really worried about a hard cap to MAX_EXECVE_AUDIT_LEN so much as being
+- * within about 500 bytes (next page boundary)
+- *
+- * why snprintf?  an int is up to 12 digits long.  if we just assumed when
+- * logging that a[%d]= was going to be 16 characters long we would be wasting
+- * space in every audit message.  In one 7500 byte message we can log up to
+- * about 1000 min size arguments.  That comes down to about 50% waste of space
+- * if we didn't do the snprintf to find out how long arg_num_len was.
+- */
+-static int audit_log_single_execve_arg(struct audit_context *context,
+-                                      struct audit_buffer **ab,
+-                                      int arg_num,
+-                                      size_t *len_sent,
+-                                      const char __user *p,
+-                                      char *buf)
++static void audit_log_execve_info(struct audit_context *context,
++                                struct audit_buffer **ab)
+ {
+-      char arg_num_len_buf[12];
+-      const char __user *tmp_p = p;
+-      /* how many digits are in arg_num? 5 is the length of ' a=""' */
+-      size_t arg_num_len = snprintf(arg_num_len_buf, 12, "%d", arg_num) + 5;
+-      size_t len, len_left, to_send;
+-      size_t max_execve_audit_len = MAX_EXECVE_AUDIT_LEN;
+-      unsigned int i, has_cntl = 0, too_long = 0;
+-      int ret;
+-
+-      /* strnlen_user includes the null we don't want to send */
+-      len_left = len = strnlen_user(p, MAX_ARG_STRLEN) - 1;
+-
+-      /*
+-       * We just created this mm, if we can't find the strings
+-       * we just copied into it something is _very_ wrong. Similar
+-       * for strings that are too long, we should not have created
+-       * any.
+-       */
+-      if (unlikely((len == -1) || len > MAX_ARG_STRLEN - 1)) {
+-              WARN_ON(1);
+-              send_sig(SIGKILL, current, 0);
+-              return -1;
++      long len_max;
++      long len_rem;
++      long len_full;
++      long len_buf;
++      long len_abuf;
++      long len_tmp;
++      bool require_data;
++      bool encode;
++      unsigned int iter;
++      unsigned int arg;
++      char *buf_head;
++      char *buf;
++      const char __user *p = (const char __user *)current->mm->arg_start;
++
++      /* NOTE: this buffer needs to be large enough to hold all the non-arg
++       *       data we put in the audit record for this argument (see the
++       *       code below) ... at this point in time 96 is plenty */
++      char abuf[96];
++
++      /* NOTE: we set MAX_EXECVE_AUDIT_LEN to a rather arbitrary limit, the
++       *       current value of 7500 is not as important as the fact that it
++       *       is less than 8k, a setting of 7500 gives us plenty of wiggle
++       *       room if we go over a little bit in the logging below */
++      WARN_ON_ONCE(MAX_EXECVE_AUDIT_LEN > 7500);
++      len_max = MAX_EXECVE_AUDIT_LEN;
++
++      /* scratch buffer to hold the userspace args */
++      buf_head = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL);
++      if (!buf_head) {
++              audit_panic("out of memory for argv string");
++              return;
+       }
++      buf = buf_head;
+ 
+-      /* walk the whole argument looking for non-ascii chars */
++      audit_log_format(*ab, "argc=%d", context->execve.argc);
++
++      len_rem = len_max;
++      len_buf = 0;
++      len_full = 0;
++      require_data = true;
++      encode = false;
++      iter = 0;
++      arg = 0;
+       do {
+-              if (len_left > MAX_EXECVE_AUDIT_LEN)
+-                      to_send = MAX_EXECVE_AUDIT_LEN;
+-              else
+-                      to_send = len_left;
+-              ret = copy_from_user(buf, tmp_p, to_send);
+-              /*
+-               * There is no reason for this copy to be short. We just
+-               * copied them here, and the mm hasn't been exposed to user-
+-               * space yet.
+-               */
+-              if (ret) {
+-                      WARN_ON(1);
+-                      send_sig(SIGKILL, current, 0);
+-                      return -1;
+-              }
+-              buf[to_send] = '\0';
+-              has_cntl = audit_string_contains_control(buf, to_send);
+-              if (has_cntl) {
+-                      /*
+-                       * hex messages get logged as 2 bytes, so we can only
+-                       * send half as much in each message
+-                       */
+-                      max_execve_audit_len = MAX_EXECVE_AUDIT_LEN / 2;
+-                      break;
+-              }
+-              len_left -= to_send;
+-              tmp_p += to_send;
+-      } while (len_left > 0);
+-
+-      len_left = len;
+-
+-      if (len > max_execve_audit_len)
+-              too_long = 1;
+-
+-      /* rewalk the argument actually logging the message */
+-      for (i = 0; len_left > 0; i++) {
+-              int room_left;
+-
+-              if (len_left > max_execve_audit_len)
+-                      to_send = max_execve_audit_len;
+-              else
+-                      to_send = len_left;
+-
+-              /* do we have space left to send this argument in this ab? */
+-              room_left = MAX_EXECVE_AUDIT_LEN - arg_num_len - *len_sent;
+-              if (has_cntl)
+-                      room_left -= (to_send * 2);
+-              else
+-                      room_left -= to_send;
+-              if (room_left < 0) {
+-                      *len_sent = 0;
+-                      audit_log_end(*ab);
+-                      *ab = audit_log_start(context, GFP_KERNEL, 
AUDIT_EXECVE);
+-                      if (!*ab)
+-                              return 0;
+-              }
++              /* NOTE: we don't ever want to trust this value for anything
++               *       serious, but the audit record format insists we
++               *       provide an argument length for really long arguments,
++               *       e.g. > MAX_EXECVE_AUDIT_LEN, so we have no choice but
++               *       to use strncpy_from_user() to obtain this value for
++               *       recording in the log, although we don't use it
++               *       anywhere here to avoid a double-fetch problem */
++              if (len_full == 0)
++                      len_full = strnlen_user(p, MAX_ARG_STRLEN) - 1;
++
++              /* read more data from userspace */
++              if (require_data) {
++                      /* can we make more room in the buffer? */
++                      if (buf != buf_head) {
++                              memmove(buf_head, buf, len_buf);
++                              buf = buf_head;
++                      }
++
++                      /* fetch as much as we can of the argument */
++                      len_tmp = strncpy_from_user(&buf_head[len_buf], p,
++                                                  len_max - len_buf);
++                      if (len_tmp == -EFAULT) {
++                              /* unable to copy from userspace */
++                              send_sig(SIGKILL, current, 0);
++                              goto out;
++                      } else if (len_tmp == (len_max - len_buf)) {
++                              /* buffer is not large enough */
++                              require_data = true;
++                              /* NOTE: if we are going to span multiple
++                               *       buffers force the encoding so we stand
++                               *       a chance at a sane len_full value and
++                               *       consistent record encoding */
++                              encode = true;
++                              len_full = len_full * 2;
++                              p += len_tmp;
++                      } else {
++                              require_data = false;
++                              if (!encode)
++                                      encode = audit_string_contains_control(
++                                                              buf, len_tmp);
++                              /* try to use a trusted value for len_full */
++                              if (len_full < len_max)
++                                      len_full = (encode ?
++                                                  len_tmp * 2 : len_tmp);
++                              p += len_tmp + 1;
++                      }
++                      len_buf += len_tmp;
++                      buf_head[len_buf] = '\0';
+ 
+-              /*
+-               * first record needs to say how long the original string was
+-               * so we can be sure nothing was lost.
+-               */
+-              if ((i == 0) && (too_long))
+-                      audit_log_format(*ab, " a%d_len=%zu", arg_num,
+-                                       has_cntl ? 2*len : len);
+-
+-              /*
+-               * normally arguments are small enough to fit and we already
+-               * filled buf above when we checked for control characters
+-               * so don't bother with another copy_from_user
+-               */
+-              if (len >= max_execve_audit_len)
+-                      ret = copy_from_user(buf, p, to_send);
+-              else
+-                      ret = 0;
+-              if (ret) {
+-                      WARN_ON(1);
+-                      send_sig(SIGKILL, current, 0);
+-                      return -1;
++                      /* length of the buffer in the audit record? */
++                      len_abuf = (encode ? len_buf * 2 : len_buf + 2);
+               }
+-              buf[to_send] = '\0';
+-
+-              /* actually log it */
+-              audit_log_format(*ab, " a%d", arg_num);
+-              if (too_long)
+-                      audit_log_format(*ab, "[%d]", i);
+-              audit_log_format(*ab, "=");
+-              if (has_cntl)
+-                      audit_log_n_hex(*ab, buf, to_send);
+-              else
+-                      audit_log_string(*ab, buf);
+-
+-              p += to_send;
+-              len_left -= to_send;
+-              *len_sent += arg_num_len;
+-              if (has_cntl)
+-                      *len_sent += to_send * 2;
+-              else
+-                      *len_sent += to_send;
+-      }
+-      /* include the null we didn't log */
+-      return len + 1;
+-}
+ 
+-static void audit_log_execve_info(struct audit_context *context,
+-                                struct audit_buffer **ab)
+-{
+-      int i, len;
+-      size_t len_sent = 0;
+-      const char __user *p;
+-      char *buf;
++              /* write as much as we can to the audit log */
++              if (len_buf > 0) {
++                      /* NOTE: some magic numbers here - basically if we
++                       *       can't fit a reasonable amount of data into the
++                       *       existing audit buffer, flush it and start with
++                       *       a new buffer */
++                      if ((sizeof(abuf) + 8) > len_rem) {
++                              len_rem = len_max;
++                              audit_log_end(*ab);
++                              *ab = audit_log_start(context,
++                                                    GFP_KERNEL, AUDIT_EXECVE);
++                              if (!*ab)
++                                      goto out;
++                      }
+ 
+-      p = (const char __user *)current->mm->arg_start;
++                      /* create the non-arg portion of the arg record */
++                      len_tmp = 0;
++                      if (require_data || (iter > 0) ||
++                          ((len_abuf + sizeof(abuf)) > len_rem)) {
++                              if (iter == 0) {
++                                      len_tmp += snprintf(&abuf[len_tmp],
++                                                      sizeof(abuf) - len_tmp,
++                                                      " a%d_len=%lu",
++                                                      arg, len_full);
++                              }
++                              len_tmp += snprintf(&abuf[len_tmp],
++                                                  sizeof(abuf) - len_tmp,
++                                                  " a%d[%d]=", arg, iter++);
++                      } else
++                              len_tmp += snprintf(&abuf[len_tmp],
++                                                  sizeof(abuf) - len_tmp,
++                                                  " a%d=", arg);
++                      WARN_ON(len_tmp >= sizeof(abuf));
++                      abuf[sizeof(abuf) - 1] = '\0';
++
++                      /* log the arg in the audit record */
++                      audit_log_format(*ab, "%s", abuf);
++                      len_rem -= len_tmp;
++                      len_tmp = len_buf;
++                      if (encode) {
++                              if (len_abuf > len_rem)
++                                      len_tmp = len_rem / 2; /* encoding */
++                              audit_log_n_hex(*ab, buf, len_tmp);
++                              len_rem -= len_tmp * 2;
++                              len_abuf -= len_tmp * 2;
++                      } else {
++                              if (len_abuf > len_rem)
++                                      len_tmp = len_rem - 2; /* quotes */
++                              audit_log_n_string(*ab, buf, len_tmp);
++                              len_rem -= len_tmp + 2;
++                              /* don't subtract the "2" because we still need
++                               * to add quotes to the remaining string */
++                              len_abuf -= len_tmp;
++                      }
++                      len_buf -= len_tmp;
++                      buf += len_tmp;
++              }
+ 
+-      audit_log_format(*ab, "argc=%d", context->execve.argc);
++              /* ready to move to the next argument? */
++              if ((len_buf == 0) && !require_data) {
++                      arg++;
++                      iter = 0;
++                      len_full = 0;
++                      require_data = true;
++                      encode = false;
++              }
++      } while (arg < context->execve.argc);
+ 
+-      /*
+-       * we need some kernel buffer to hold the userspace args.  Just
+-       * allocate one big one rather than allocating one of the right size
+-       * for every single argument inside audit_log_single_execve_arg()
+-       * should be <8k allocation so should be pretty safe.
+-       */
+-      buf = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL);
+-      if (!buf) {
+-              audit_panic("out of memory for argv string");
+-              return;
+-      }
++      /* NOTE: the caller handles the final audit_log_end() call */
+ 
+-      for (i = 0; i < context->execve.argc; i++) {
+-              len = audit_log_single_execve_arg(context, ab, i,
+-                                                &len_sent, p, buf);
+-              if (len <= 0)
+-                      break;
+-              p += len;
+-      }
+-      kfree(buf);
++out:
++      kfree(buf_head);
+ }
+ 
+ static void show_special(struct audit_context *context, int *call_panic)
+diff --git a/kernel/module.c b/kernel/module.c
+index 1df11b175a24..737d53099360 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -2454,13 +2454,18 @@ static inline void kmemleak_load_module(const struct 
module *mod,
+ #endif
+ 
+ #ifdef CONFIG_MODULE_SIG
+-static int module_sig_check(struct load_info *info)
++static int module_sig_check(struct load_info *info, int flags)
+ {
+       int err = -ENOKEY;
+       const unsigned long markerlen = sizeof(MODULE_SIG_STRING) - 1;
+       const void *mod = info->hdr;
+ 
+-      if (info->len > markerlen &&
++      /*
++       * Require flags == 0, as a module with version information
++       * removed is no longer the module that was signed
++       */
++      if (flags == 0 &&
++          info->len > markerlen &&
+           memcmp(mod + info->len - markerlen, MODULE_SIG_STRING, markerlen) 
== 0) {
+               /* We truncate the module to discard the signature */
+               info->len -= markerlen;
+@@ -2479,7 +2484,7 @@ static int module_sig_check(struct load_info *info)
+       return err;
+ }
+ #else /* !CONFIG_MODULE_SIG */
+-static int module_sig_check(struct load_info *info)
++static int module_sig_check(struct load_info *info, int flags)
+ {
+       return 0;
+ }
+@@ -3215,7 +3220,7 @@ static int load_module(struct load_info *info, const 
char __user *uargs,
+       long err;
+       char *after_dashes;
+ 
+-      err = module_sig_check(info);
++      err = module_sig_check(info, flags);
+       if (err)
+               goto free_copy;
+ 
+diff --git a/lib/lockref.c b/lib/lockref.c
+index d2233de9a86e..ecb9a665ec19 100644
+--- a/lib/lockref.c
++++ b/lib/lockref.c
+@@ -60,7 +60,7 @@ void lockref_get(struct lockref *lockref)
+ EXPORT_SYMBOL(lockref_get);
+ 
+ /**
+- * lockref_get_not_zero - Increments count unless the count is 0
++ * lockref_get_not_zero - Increments count unless the count is 0 or dead
+  * @lockref: pointer to lockref structure
+  * Return: 1 if count updated successfully or 0 if count was zero
+  */
+@@ -70,7 +70,7 @@ int lockref_get_not_zero(struct lockref *lockref)
+ 
+       CMPXCHG_LOOP(
+               new.count++;
+-              if (!old.count)
++              if (old.count <= 0)
+                       return 0;
+       ,
+               return 1;
+@@ -78,7 +78,7 @@ int lockref_get_not_zero(struct lockref *lockref)
+ 
+       spin_lock(&lockref->lock);
+       retval = 0;
+-      if (lockref->count) {
++      if (lockref->count > 0) {
+               lockref->count++;
+               retval = 1;
+       }
+@@ -88,7 +88,7 @@ int lockref_get_not_zero(struct lockref *lockref)
+ EXPORT_SYMBOL(lockref_get_not_zero);
+ 
+ /**
+- * lockref_get_or_lock - Increments count unless the count is 0
++ * lockref_get_or_lock - Increments count unless the count is 0 or dead
+  * @lockref: pointer to lockref structure
+  * Return: 1 if count updated successfully or 0 if count was zero
+  * and we got the lock instead.
+@@ -97,14 +97,14 @@ int lockref_get_or_lock(struct lockref *lockref)
+ {
+       CMPXCHG_LOOP(
+               new.count++;
+-              if (!old.count)
++              if (old.count <= 0)
+                       break;
+       ,
+               return 1;
+       );
+ 
+       spin_lock(&lockref->lock);
+-      if (!lockref->count)
++      if (lockref->count <= 0)
+               return 0;
+       lockref->count++;
+       spin_unlock(&lockref->lock);
+@@ -113,6 +113,26 @@ int lockref_get_or_lock(struct lockref *lockref)
+ EXPORT_SYMBOL(lockref_get_or_lock);
+ 
+ /**
++ * lockref_put_return - Decrement reference count if possible
++ * @lockref: pointer to lockref structure
++ *
++ * Decrement the reference count and return the new value.
++ * If the lockref was dead or locked, return an error.
++ */
++int lockref_put_return(struct lockref *lockref)
++{
++      CMPXCHG_LOOP(
++              new.count--;
++              if (old.count <= 0)
++                      return -1;
++      ,
++              return new.count;
++      );
++      return -1;
++}
++EXPORT_SYMBOL(lockref_put_return);
++
++/**
+  * lockref_put_or_lock - decrements count unless count <= 1 before decrement
+  * @lockref: pointer to lockref structure
+  * Return: 1 if count updated successfully or 0 if count <= 1 and lock taken
+@@ -158,7 +178,7 @@ int lockref_get_not_dead(struct lockref *lockref)
+ 
+       CMPXCHG_LOOP(
+               new.count++;
+-              if ((int)old.count < 0)
++              if (old.count < 0)
+                       return 0;
+       ,
+               return 1;
+@@ -166,7 +186,7 @@ int lockref_get_not_dead(struct lockref *lockref)
+ 
+       spin_lock(&lockref->lock);
+       retval = 0;
+-      if ((int) lockref->count >= 0) {
++      if (lockref->count >= 0) {
+               lockref->count++;
+               retval = 1;
+       }
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 549bf5ac3d6e..7a57e302338f 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -1675,6 +1675,10 @@ static unsigned long set_max_huge_pages(struct hstate 
*h, unsigned long count,
+                * and reducing the surplus.
+                */
+               spin_unlock(&hugetlb_lock);
++
++              /* yield cpu to avoid soft lockup */
++              cond_resched();
++
+               if (hstate_is_gigantic(h))
+                       ret = alloc_fresh_gigantic_page(h, nodes_allowed);
+               else
+diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
+index 31f106e61ca2..79678aafae6c 100644
+--- a/net/bluetooth/l2cap_sock.c
++++ b/net/bluetooth/l2cap_sock.c
+@@ -922,7 +922,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int 
level, int optname,
+                       break;
+               }
+ 
+-              if (get_user(opt, (u32 __user *) optval)) {
++              if (get_user(opt, (u16 __user *) optval)) {
+                       err = -EFAULT;
+                       break;
+               }
+diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
+index b3f6ec0df426..1cc2b7b58ab1 100644
+--- a/net/irda/af_irda.c
++++ b/net/irda/af_irda.c
+@@ -1036,8 +1036,11 @@ static int irda_connect(struct socket *sock, struct 
sockaddr *uaddr,
+       }
+ 
+       /* Check if we have opened a local TSAP */
+-      if (!self->tsap)
+-              irda_open_tsap(self, LSAP_ANY, addr->sir_name);
++      if (!self->tsap) {
++              err = irda_open_tsap(self, LSAP_ANY, addr->sir_name);
++              if (err)
++                      goto out;
++      }
+ 
+       /* Move to connecting socket, start sending Connect Requests */
+       sock->state = SS_CONNECTING;
+diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c
+index 28cddc85b700..bfa2b6d5b5cf 100644
+--- a/net/netlabel/netlabel_kapi.c
++++ b/net/netlabel/netlabel_kapi.c
+@@ -824,7 +824,11 @@ socket_setattr_return:
+  */
+ void netlbl_sock_delattr(struct sock *sk)
+ {
+-      cipso_v4_sock_delattr(sk);
++      switch (sk->sk_family) {
++      case AF_INET:
++              cipso_v4_sock_delattr(sk);
++              break;
++      }
+ }
+ 
+ /**
+@@ -987,7 +991,11 @@ req_setattr_return:
+ */
+ void netlbl_req_delattr(struct request_sock *req)
+ {
+-      cipso_v4_req_delattr(req);
++      switch (req->rsk_ops->family) {
++      case AF_INET:
++              cipso_v4_req_delattr(req);
++              break;
++      }
+ }
+ 
+ /**
+diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c
+index 001facfa5b74..d96d8a2647d6 100644
+--- a/scripts/recordmcount.c
++++ b/scripts/recordmcount.c
+@@ -33,10 +33,17 @@
+ #include <string.h>
+ #include <unistd.h>
+ 
++/*
++ * glibc synced up and added the metag number but didn't add the relocations.
++ * Work around this in a crude manner for now.
++ */
+ #ifndef EM_METAG
+-/* Remove this when these make it to the standard system elf.h. */
+ #define EM_METAG      174
++#endif
++#ifndef R_METAG_ADDR32
+ #define R_METAG_ADDR32                   2
++#endif
++#ifndef R_METAG_NONE
+ #define R_METAG_NONE                     3
+ #endif
+ 
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index bc9ed75c651c..c1115b3b90c8 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2093,6 +2093,8 @@ static const struct pci_device_id azx_ids[] = {
+       { PCI_DEVICE(0x1022, 0x780d),
+         .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
+       /* ATI HDMI */
++      { PCI_DEVICE(0x1002, 0x0002),
++        .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
+       { PCI_DEVICE(0x1002, 0x1308),
+         .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
+       { PCI_DEVICE(0x1002, 0x157a),
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index c35960b74026..ebb8feff0a84 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -4552,6 +4552,55 @@ static void alc290_fixup_mono_speakers(struct hda_codec 
*codec,
+       }
+ }
+ 
++/* Hook to update amp GPIO4 for automute */
++static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
++                                        struct hda_jack_callback *jack)
++{
++      struct alc_spec *spec = codec->spec;
++
++      snd_hda_gen_hp_automute(codec, jack);
++      /* mute_led_polarity is set to 0, so we pass inverted value here */
++      alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present);
++}
++
++/* Manage GPIOs for HP EliteBook Folio 9480m.
++ *
++ * GPIO4 is the headphone amplifier power control
++ * GPIO3 is the audio output mute indicator LED
++ */
++
++static void alc280_fixup_hp_9480m(struct hda_codec *codec,
++                                const struct hda_fixup *fix,
++                                int action)
++{
++      struct alc_spec *spec = codec->spec;
++      static const struct hda_verb gpio_init[] = {
++              { 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
++              { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
++              {}
++      };
++
++      if (action == HDA_FIXUP_ACT_PRE_PROBE) {
++              /* Set the hooks to turn the headphone amp on/off
++               * as needed
++               */
++              spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
++              spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
++
++              /* The GPIOs are currently off */
++              spec->gpio_led = 0;
++
++              /* GPIO3 is connected to the output mute LED,
++               * high is on, low is off
++               */
++              spec->mute_led_polarity = 0;
++              spec->gpio_mute_led_mask = 0x08;
++
++              /* Initialize GPIO configuration */
++              snd_hda_add_verbs(codec, gpio_init);
++      }
++}
++
+ /* for hda_fixup_thinkpad_acpi() */
+ #include "thinkpad_helper.c"
+ 
+@@ -4633,6 +4682,7 @@ enum {
+       ALC286_FIXUP_HP_GPIO_LED,
+       ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
+       ALC280_FIXUP_HP_DOCK_PINS,
++      ALC280_FIXUP_HP_9480M,
+       ALC288_FIXUP_DELL_HEADSET_MODE,
+       ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
+       ALC288_FIXUP_DELL_XPS_13_GPIO6,
+@@ -5165,6 +5215,10 @@ static const struct hda_fixup alc269_fixups[] = {
+               .chained = true,
+               .chain_id = ALC280_FIXUP_HP_GPIO4
+       },
++      [ALC280_FIXUP_HP_9480M] = {
++              .type = HDA_FIXUP_FUNC,
++              .v.func = alc280_fixup_hp_9480m,
++      },
+       [ALC288_FIXUP_DELL_HEADSET_MODE] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc_fixup_headset_mode_dell_alc288,
+@@ -5320,6 +5374,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+       SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
+       SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
++      SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
+       SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+       SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+       /* ALC290 */
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 7d32b4e82e86..e013f90f7a29 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -139,6 +139,7 @@ int vcpu_load(struct kvm_vcpu *vcpu)
+       put_cpu();
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(vcpu_load);
+ 
+ void vcpu_put(struct kvm_vcpu *vcpu)
+ {
+@@ -148,6 +149,7 @@ void vcpu_put(struct kvm_vcpu *vcpu)
+       preempt_enable();
+       mutex_unlock(&vcpu->mutex);
+ }
++EXPORT_SYMBOL_GPL(vcpu_put);
+ 
+ static void ack_flush(void *_completed)
+ {

Reply via email to