summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '3.14.40/1039_linux-3.14.40.patch')
-rw-r--r--3.14.40/1039_linux-3.14.40.patch2462
1 files changed, 0 insertions, 2462 deletions
diff --git a/3.14.40/1039_linux-3.14.40.patch b/3.14.40/1039_linux-3.14.40.patch
deleted file mode 100644
index 6afa4bd..0000000
--- a/3.14.40/1039_linux-3.14.40.patch
+++ /dev/null
@@ -1,2462 +0,0 @@
-diff --git a/Makefile b/Makefile
-index b40845e..070e0eb 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 3
- PATCHLEVEL = 14
--SUBLEVEL = 39
-+SUBLEVEL = 40
- EXTRAVERSION =
- NAME = Remembering Coco
-
-diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
-index 98838a0..9d0ac09 100644
---- a/arch/alpha/mm/fault.c
-+++ b/arch/alpha/mm/fault.c
-@@ -156,6 +156,8 @@ retry:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c
-index 9c69552..01e18b5 100644
---- a/arch/arc/mm/fault.c
-+++ b/arch/arc/mm/fault.c
-@@ -162,6 +162,8 @@ good_area:
- /* TBD: switch to pagefault_out_of_memory() */
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
-
-diff --git a/arch/arm/include/asm/pgtable-3level-hwdef.h b/arch/arm/include/asm/pgtable-3level-hwdef.h
-index 626989f..9fd61c7 100644
---- a/arch/arm/include/asm/pgtable-3level-hwdef.h
-+++ b/arch/arm/include/asm/pgtable-3level-hwdef.h
-@@ -43,7 +43,7 @@
- #define PMD_SECT_BUFFERABLE (_AT(pmdval_t, 1) << 2)
- #define PMD_SECT_CACHEABLE (_AT(pmdval_t, 1) << 3)
- #define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */
--#define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */
-+#define PMD_SECT_AP2 (_AT(pmdval_t, 1) << 7) /* read only */
- #define PMD_SECT_S (_AT(pmdval_t, 3) << 8)
- #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10)
- #define PMD_SECT_nG (_AT(pmdval_t, 1) << 11)
-@@ -72,6 +72,7 @@
- #define PTE_TABLE_BIT (_AT(pteval_t, 1) << 1)
- #define PTE_BUFFERABLE (_AT(pteval_t, 1) << 2) /* AttrIndx[0] */
- #define PTE_CACHEABLE (_AT(pteval_t, 1) << 3) /* AttrIndx[1] */
-+#define PTE_AP2 (_AT(pteval_t, 1) << 7) /* AP[2] */
- #define PTE_EXT_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */
- #define PTE_EXT_AF (_AT(pteval_t, 1) << 10) /* Access Flag */
- #define PTE_EXT_NG (_AT(pteval_t, 1) << 11) /* nG */
-diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
-index 85c60ad..06e0bc0 100644
---- a/arch/arm/include/asm/pgtable-3level.h
-+++ b/arch/arm/include/asm/pgtable-3level.h
-@@ -79,18 +79,19 @@
- #define L_PTE_PRESENT (_AT(pteval_t, 3) << 0) /* Present */
- #define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */
- #define L_PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */
--#define L_PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */
- #define L_PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */
- #define L_PTE_YOUNG (_AT(pteval_t, 1) << 10) /* AF */
- #define L_PTE_XN (_AT(pteval_t, 1) << 54) /* XN */
--#define L_PTE_DIRTY (_AT(pteval_t, 1) << 55) /* unused */
--#define L_PTE_SPECIAL (_AT(pteval_t, 1) << 56) /* unused */
-+#define L_PTE_DIRTY (_AT(pteval_t, 1) << 55)
-+#define L_PTE_SPECIAL (_AT(pteval_t, 1) << 56)
- #define L_PTE_NONE (_AT(pteval_t, 1) << 57) /* PROT_NONE */
-+#define L_PTE_RDONLY (_AT(pteval_t, 1) << 58) /* READ ONLY */
-
--#define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0)
--#define PMD_SECT_DIRTY (_AT(pmdval_t, 1) << 55)
--#define PMD_SECT_SPLITTING (_AT(pmdval_t, 1) << 56)
--#define PMD_SECT_NONE (_AT(pmdval_t, 1) << 57)
-+#define L_PMD_SECT_VALID (_AT(pmdval_t, 1) << 0)
-+#define L_PMD_SECT_DIRTY (_AT(pmdval_t, 1) << 55)
-+#define L_PMD_SECT_SPLITTING (_AT(pmdval_t, 1) << 56)
-+#define L_PMD_SECT_NONE (_AT(pmdval_t, 1) << 57)
-+#define L_PMD_SECT_RDONLY (_AT(pteval_t, 1) << 58)
-
- /*
- * To be used in assembly code with the upper page attributes.
-@@ -207,27 +208,32 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
- #define pte_huge(pte) (pte_val(pte) && !(pte_val(pte) & PTE_TABLE_BIT))
- #define pte_mkhuge(pte) (__pte(pte_val(pte) & ~PTE_TABLE_BIT))
-
--#define pmd_young(pmd) (pmd_val(pmd) & PMD_SECT_AF)
-+#define pmd_isset(pmd, val) ((u32)(val) == (val) ? pmd_val(pmd) & (val) \
-+ : !!(pmd_val(pmd) & (val)))
-+#define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val)))
-+
-+#define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF))
-
- #define __HAVE_ARCH_PMD_WRITE
--#define pmd_write(pmd) (!(pmd_val(pmd) & PMD_SECT_RDONLY))
-+#define pmd_write(pmd) (pmd_isclear((pmd), L_PMD_SECT_RDONLY))
-+#define pmd_dirty(pmd) (pmd_isset((pmd), L_PMD_SECT_DIRTY))
-
- #define pmd_hugewillfault(pmd) (!pmd_young(pmd) || !pmd_write(pmd))
- #define pmd_thp_or_huge(pmd) (pmd_huge(pmd) || pmd_trans_huge(pmd))
-
- #ifdef CONFIG_TRANSPARENT_HUGEPAGE
--#define pmd_trans_huge(pmd) (pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT))
--#define pmd_trans_splitting(pmd) (pmd_val(pmd) & PMD_SECT_SPLITTING)
-+#define pmd_trans_huge(pmd) (pmd_val(pmd) && !pmd_table(pmd))
-+#define pmd_trans_splitting(pmd) (pmd_isset((pmd), L_PMD_SECT_SPLITTING))
- #endif
-
- #define PMD_BIT_FUNC(fn,op) \
- static inline pmd_t pmd_##fn(pmd_t pmd) { pmd_val(pmd) op; return pmd; }
-
--PMD_BIT_FUNC(wrprotect, |= PMD_SECT_RDONLY);
-+PMD_BIT_FUNC(wrprotect, |= L_PMD_SECT_RDONLY);
- PMD_BIT_FUNC(mkold, &= ~PMD_SECT_AF);
--PMD_BIT_FUNC(mksplitting, |= PMD_SECT_SPLITTING);
--PMD_BIT_FUNC(mkwrite, &= ~PMD_SECT_RDONLY);
--PMD_BIT_FUNC(mkdirty, |= PMD_SECT_DIRTY);
-+PMD_BIT_FUNC(mksplitting, |= L_PMD_SECT_SPLITTING);
-+PMD_BIT_FUNC(mkwrite, &= ~L_PMD_SECT_RDONLY);
-+PMD_BIT_FUNC(mkdirty, |= L_PMD_SECT_DIRTY);
- PMD_BIT_FUNC(mkyoung, |= PMD_SECT_AF);
-
- #define pmd_mkhuge(pmd) (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT))
-@@ -241,8 +247,8 @@ PMD_BIT_FUNC(mkyoung, |= PMD_SECT_AF);
-
- static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
- {
-- const pmdval_t mask = PMD_SECT_USER | PMD_SECT_XN | PMD_SECT_RDONLY |
-- PMD_SECT_VALID | PMD_SECT_NONE;
-+ const pmdval_t mask = PMD_SECT_USER | PMD_SECT_XN | L_PMD_SECT_RDONLY |
-+ L_PMD_SECT_VALID | L_PMD_SECT_NONE;
- pmd_val(pmd) = (pmd_val(pmd) & ~mask) | (pgprot_val(newprot) & mask);
- return pmd;
- }
-@@ -253,8 +259,13 @@ static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
- BUG_ON(addr >= TASK_SIZE);
-
- /* create a faulting entry if PROT_NONE protected */
-- if (pmd_val(pmd) & PMD_SECT_NONE)
-- pmd_val(pmd) &= ~PMD_SECT_VALID;
-+ if (pmd_val(pmd) & L_PMD_SECT_NONE)
-+ pmd_val(pmd) &= ~L_PMD_SECT_VALID;
-+
-+ if (pmd_write(pmd) && pmd_dirty(pmd))
-+ pmd_val(pmd) &= ~PMD_SECT_AP2;
-+ else
-+ pmd_val(pmd) |= PMD_SECT_AP2;
-
- *pmdp = __pmd(pmd_val(pmd) | PMD_SECT_nG);
- flush_pmd_entry(pmdp);
-diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
-index 7d59b52..89dba13 100644
---- a/arch/arm/include/asm/pgtable.h
-+++ b/arch/arm/include/asm/pgtable.h
-@@ -214,12 +214,16 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)
-
- #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0)
-
-+#define pte_isset(pte, val) ((u32)(val) == (val) ? pte_val(pte) & (val) \
-+ : !!(pte_val(pte) & (val)))
-+#define pte_isclear(pte, val) (!(pte_val(pte) & (val)))
-+
- #define pte_none(pte) (!pte_val(pte))
--#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)
--#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY))
--#define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY)
--#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
--#define pte_exec(pte) (!(pte_val(pte) & L_PTE_XN))
-+#define pte_present(pte) (pte_isset((pte), L_PTE_PRESENT))
-+#define pte_write(pte) (pte_isclear((pte), L_PTE_RDONLY))
-+#define pte_dirty(pte) (pte_isset((pte), L_PTE_DIRTY))
-+#define pte_young(pte) (pte_isset((pte), L_PTE_YOUNG))
-+#define pte_exec(pte) (pte_isclear((pte), L_PTE_XN))
- #define pte_special(pte) (0)
-
- #define pte_present_user(pte) (pte_present(pte) && (pte_val(pte) & L_PTE_USER))
-diff --git a/arch/arm/mm/proc-v7-3level.S b/arch/arm/mm/proc-v7-3level.S
-index 22e3ad6..eb81123 100644
---- a/arch/arm/mm/proc-v7-3level.S
-+++ b/arch/arm/mm/proc-v7-3level.S
-@@ -86,8 +86,13 @@ ENTRY(cpu_v7_set_pte_ext)
- tst rh, #1 << (57 - 32) @ L_PTE_NONE
- bicne rl, #L_PTE_VALID
- bne 1f
-- tst rh, #1 << (55 - 32) @ L_PTE_DIRTY
-- orreq rl, #L_PTE_RDONLY
-+
-+ eor ip, rh, #1 << (55 - 32) @ toggle L_PTE_DIRTY in temp reg to
-+ @ test for !L_PTE_DIRTY || L_PTE_RDONLY
-+ tst ip, #1 << (55 - 32) | 1 << (58 - 32)
-+ orrne rl, #PTE_AP2
-+ biceq rl, #PTE_AP2
-+
- 1: strd r2, r3, [r0]
- ALT_SMP(W(nop))
- ALT_UP (mcr p15, 0, r0, c7, c10, 1) @ flush_pte
-diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c
-index 0eca933..d223a8b 100644
---- a/arch/avr32/mm/fault.c
-+++ b/arch/avr32/mm/fault.c
-@@ -142,6 +142,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c
-index 1790f22..2686a7a 100644
---- a/arch/cris/mm/fault.c
-+++ b/arch/cris/mm/fault.c
-@@ -176,6 +176,8 @@ retry:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c
-index 9a66372..ec4917d 100644
---- a/arch/frv/mm/fault.c
-+++ b/arch/frv/mm/fault.c
-@@ -168,6 +168,8 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
-index 7225dad..ba5ba7a 100644
---- a/arch/ia64/mm/fault.c
-+++ b/arch/ia64/mm/fault.c
-@@ -172,6 +172,8 @@ retry:
- */
- if (fault & VM_FAULT_OOM) {
- goto out_of_memory;
-+ } else if (fault & VM_FAULT_SIGSEGV) {
-+ goto bad_area;
- } else if (fault & VM_FAULT_SIGBUS) {
- signal = SIGBUS;
- goto bad_area;
-diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c
-index e9c6a80..e3d4d48901 100644
---- a/arch/m32r/mm/fault.c
-+++ b/arch/m32r/mm/fault.c
-@@ -200,6 +200,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c
-index 2bd7487..b2f04ae 100644
---- a/arch/m68k/mm/fault.c
-+++ b/arch/m68k/mm/fault.c
-@@ -145,6 +145,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto map_err;
- else if (fault & VM_FAULT_SIGBUS)
- goto bus_err;
- BUG();
-diff --git a/arch/metag/mm/fault.c b/arch/metag/mm/fault.c
-index 332680e..2de5dc6 100644
---- a/arch/metag/mm/fault.c
-+++ b/arch/metag/mm/fault.c
-@@ -141,6 +141,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c
-index fa4cf52..d46a5eb 100644
---- a/arch/microblaze/mm/fault.c
-+++ b/arch/microblaze/mm/fault.c
-@@ -224,6 +224,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
-index becc42b..70ab5d6 100644
---- a/arch/mips/mm/fault.c
-+++ b/arch/mips/mm/fault.c
-@@ -158,6 +158,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c
-index 3516cbd..0c2cc5d 100644
---- a/arch/mn10300/mm/fault.c
-+++ b/arch/mn10300/mm/fault.c
-@@ -262,6 +262,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c
-index 0703acf..230ac20 100644
---- a/arch/openrisc/mm/fault.c
-+++ b/arch/openrisc/mm/fault.c
-@@ -171,6 +171,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
-index d72197f..d27e388 100644
---- a/arch/parisc/mm/fault.c
-+++ b/arch/parisc/mm/fault.c
-@@ -256,6 +256,8 @@ good_area:
- */
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto bad_area;
- BUG();
-diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
-index 51ab9e7..010fabf 100644
---- a/arch/powerpc/mm/fault.c
-+++ b/arch/powerpc/mm/fault.c
-@@ -432,6 +432,8 @@ good_area:
- */
- fault = handle_mm_fault(mm, vma, address, flags);
- if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) {
-+ if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- rc = mm_fault_error(regs, address, fault);
- if (rc >= MM_FAULT_RETURN)
- goto bail;
-diff --git a/arch/powerpc/platforms/cell/spu_fault.c b/arch/powerpc/platforms/cell/spu_fault.c
-index 641e727..62f3e4e 100644
---- a/arch/powerpc/platforms/cell/spu_fault.c
-+++ b/arch/powerpc/platforms/cell/spu_fault.c
-@@ -75,7 +75,7 @@ int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
- if (*flt & VM_FAULT_OOM) {
- ret = -ENOMEM;
- goto out_unlock;
-- } else if (*flt & VM_FAULT_SIGBUS) {
-+ } else if (*flt & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) {
- ret = -EFAULT;
- goto out_unlock;
- }
-diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
-index 87ba7cf..65d633f 100644
---- a/arch/powerpc/platforms/cell/spufs/inode.c
-+++ b/arch/powerpc/platforms/cell/spufs/inode.c
-@@ -164,7 +164,7 @@ static void spufs_prune_dir(struct dentry *dir)
- struct dentry *dentry, *tmp;
-
- mutex_lock(&dir->d_inode->i_mutex);
-- list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_u.d_child) {
-+ list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
- spin_lock(&dentry->d_lock);
- if (!(d_unhashed(dentry)) && dentry->d_inode) {
- dget_dlock(dentry);
-diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
-index d95265b2..8e95432 100644
---- a/arch/s390/mm/fault.c
-+++ b/arch/s390/mm/fault.c
-@@ -239,6 +239,12 @@ static noinline void do_fault_error(struct pt_regs *regs, int fault)
- do_no_context(regs);
- else
- pagefault_out_of_memory();
-+ } else if (fault & VM_FAULT_SIGSEGV) {
-+ /* Kernel mode? Handle exceptions or die */
-+ if (!user_mode(regs))
-+ do_no_context(regs);
-+ else
-+ do_sigsegv(regs, SEGV_MAPERR);
- } else if (fault & VM_FAULT_SIGBUS) {
- /* Kernel mode? Handle exceptions or die */
- if (!user_mode(regs))
-diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c
-index 52238983..6860beb 100644
---- a/arch/score/mm/fault.c
-+++ b/arch/score/mm/fault.c
-@@ -114,6 +114,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c
-index 541dc61..a58fec9 100644
---- a/arch/sh/mm/fault.c
-+++ b/arch/sh/mm/fault.c
-@@ -353,6 +353,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
- } else {
- if (fault & VM_FAULT_SIGBUS)
- do_sigbus(regs, error_code, address);
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ bad_area(regs, error_code, address);
- else
- BUG();
- }
-diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c
-index 59dbd46..163c787 100644
---- a/arch/sparc/mm/fault_32.c
-+++ b/arch/sparc/mm/fault_32.c
-@@ -252,6 +252,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
-index 45a413e..0d6de79 100644
---- a/arch/sparc/mm/fault_64.c
-+++ b/arch/sparc/mm/fault_64.c
-@@ -448,6 +448,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c
-index 6c05712..c6d2a76 100644
---- a/arch/tile/mm/fault.c
-+++ b/arch/tile/mm/fault.c
-@@ -444,6 +444,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
-index 974b874..53b8320 100644
---- a/arch/um/kernel/trap.c
-+++ b/arch/um/kernel/trap.c
-@@ -80,6 +80,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM) {
- goto out_of_memory;
-+ } else if (fault & VM_FAULT_SIGSEGV) {
-+ goto out;
- } else if (fault & VM_FAULT_SIGBUS) {
- err = -EACCES;
- goto out;
-diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
-index 09651d4..cf1eeea 100644
---- a/arch/x86/kvm/emulate.c
-+++ b/arch/x86/kvm/emulate.c
-@@ -2258,7 +2258,7 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
- * Not recognized on AMD in compat mode (but is recognized in legacy
- * mode).
- */
-- if ((ctxt->mode == X86EMUL_MODE_PROT32) && (efer & EFER_LMA)
-+ if ((ctxt->mode != X86EMUL_MODE_PROT64) && (efer & EFER_LMA)
- && !vendor_intel(ctxt))
- return emulate_ud(ctxt);
-
-@@ -2271,25 +2271,13 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
- setup_syscalls_segments(ctxt, &cs, &ss);
-
- ops->get_msr(ctxt, MSR_IA32_SYSENTER_CS, &msr_data);
-- switch (ctxt->mode) {
-- case X86EMUL_MODE_PROT32:
-- if ((msr_data & 0xfffc) == 0x0)
-- return emulate_gp(ctxt, 0);
-- break;
-- case X86EMUL_MODE_PROT64:
-- if (msr_data == 0x0)
-- return emulate_gp(ctxt, 0);
-- break;
-- default:
-- break;
-- }
-+ if ((msr_data & 0xfffc) == 0x0)
-+ return emulate_gp(ctxt, 0);
-
- ctxt->eflags &= ~(EFLG_VM | EFLG_IF | EFLG_RF);
-- cs_sel = (u16)msr_data;
-- cs_sel &= ~SELECTOR_RPL_MASK;
-+ cs_sel = (u16)msr_data & ~SELECTOR_RPL_MASK;
- ss_sel = cs_sel + 8;
-- ss_sel &= ~SELECTOR_RPL_MASK;
-- if (ctxt->mode == X86EMUL_MODE_PROT64 || (efer & EFER_LMA)) {
-+ if (efer & EFER_LMA) {
- cs.d = 0;
- cs.l = 1;
- }
-@@ -2298,10 +2286,11 @@ static int em_sysenter(struct x86_emulate_ctxt *ctxt)
- ops->set_segment(ctxt, ss_sel, &ss, 0, VCPU_SREG_SS);
-
- ops->get_msr(ctxt, MSR_IA32_SYSENTER_EIP, &msr_data);
-- ctxt->_eip = msr_data;
-+ ctxt->_eip = (efer & EFER_LMA) ? msr_data : (u32)msr_data;
-
- ops->get_msr(ctxt, MSR_IA32_SYSENTER_ESP, &msr_data);
-- *reg_write(ctxt, VCPU_REGS_RSP) = msr_data;
-+ *reg_write(ctxt, VCPU_REGS_RSP) = (efer & EFER_LMA) ? msr_data :
-+ (u32)msr_data;
-
- return X86EMUL_CONTINUE;
- }
-diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
-index a10c8c7..ebc551c 100644
---- a/arch/x86/mm/fault.c
-+++ b/arch/x86/mm/fault.c
-@@ -833,11 +833,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
- unsigned int fault)
- {
- struct task_struct *tsk = current;
-- struct mm_struct *mm = tsk->mm;
- int code = BUS_ADRERR;
-
-- up_read(&mm->mmap_sem);
--
- /* Kernel mode? Handle exceptions or die: */
- if (!(error_code & PF_USER)) {
- no_context(regs, error_code, address, SIGBUS, BUS_ADRERR);
-@@ -868,7 +865,6 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
- unsigned long address, unsigned int fault)
- {
- if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
-- up_read(&current->mm->mmap_sem);
- no_context(regs, error_code, address, 0, 0);
- return;
- }
-@@ -876,14 +872,11 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
- if (fault & VM_FAULT_OOM) {
- /* Kernel mode? Handle exceptions or die: */
- if (!(error_code & PF_USER)) {
-- up_read(&current->mm->mmap_sem);
- no_context(regs, error_code, address,
- SIGSEGV, SEGV_MAPERR);
- return;
- }
-
-- up_read(&current->mm->mmap_sem);
--
- /*
- * We ran out of memory, call the OOM killer, and return the
- * userspace (which will retry the fault, or kill us if we got
-@@ -894,6 +887,8 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
- if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON|
- VM_FAULT_HWPOISON_LARGE))
- do_sigbus(regs, error_code, address, fault);
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ bad_area_nosemaphore(regs, error_code, address);
- else
- BUG();
- }
-@@ -1216,6 +1211,7 @@ good_area:
- return;
-
- if (unlikely(fault & VM_FAULT_ERROR)) {
-+ up_read(&mm->mmap_sem);
- mm_fault_error(regs, error_code, address, fault);
- return;
- }
-diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c
-index b57c4f9..9e3571a 100644
---- a/arch/xtensa/mm/fault.c
-+++ b/arch/xtensa/mm/fault.c
-@@ -117,6 +117,8 @@ good_area:
- if (unlikely(fault & VM_FAULT_ERROR)) {
- if (fault & VM_FAULT_OOM)
- goto out_of_memory;
-+ else if (fault & VM_FAULT_SIGSEGV)
-+ goto bad_area;
- else if (fault & VM_FAULT_SIGBUS)
- goto do_sigbus;
- BUG();
-diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
-index f667e37..5afe556 100644
---- a/drivers/bluetooth/ath3k.c
-+++ b/drivers/bluetooth/ath3k.c
-@@ -62,51 +62,59 @@ static const struct usb_device_id ath3k_table[] = {
- { USB_DEVICE(0x0CF3, 0x3000) },
-
- /* Atheros AR3011 with sflash firmware*/
-+ { USB_DEVICE(0x0489, 0xE027) },
-+ { USB_DEVICE(0x0489, 0xE03D) },
-+ { USB_DEVICE(0x0930, 0x0215) },
- { USB_DEVICE(0x0CF3, 0x3002) },
- { USB_DEVICE(0x0CF3, 0xE019) },
- { USB_DEVICE(0x13d3, 0x3304) },
-- { USB_DEVICE(0x0930, 0x0215) },
-- { USB_DEVICE(0x0489, 0xE03D) },
-- { USB_DEVICE(0x0489, 0xE027) },
-
- /* Atheros AR9285 Malbec with sflash firmware */
- { USB_DEVICE(0x03F0, 0x311D) },
-
- /* Atheros AR3012 with sflash firmware*/
-- { USB_DEVICE(0x0CF3, 0x0036) },
-- { USB_DEVICE(0x0CF3, 0x3004) },
-- { USB_DEVICE(0x0CF3, 0x3008) },
-- { USB_DEVICE(0x0CF3, 0x311D) },
-- { USB_DEVICE(0x0CF3, 0x817a) },
-- { USB_DEVICE(0x13d3, 0x3375) },
-+ { USB_DEVICE(0x0489, 0xe04d) },
-+ { USB_DEVICE(0x0489, 0xe04e) },
-+ { USB_DEVICE(0x0489, 0xe057) },
-+ { USB_DEVICE(0x0489, 0xe056) },
-+ { USB_DEVICE(0x0489, 0xe05f) },
-+ { USB_DEVICE(0x0489, 0xe078) },
-+ { USB_DEVICE(0x04c5, 0x1330) },
- { USB_DEVICE(0x04CA, 0x3004) },
- { USB_DEVICE(0x04CA, 0x3005) },
- { USB_DEVICE(0x04CA, 0x3006) },
- { USB_DEVICE(0x04CA, 0x3007) },
- { USB_DEVICE(0x04CA, 0x3008) },
- { USB_DEVICE(0x04CA, 0x300b) },
-- { USB_DEVICE(0x13d3, 0x3362) },
-- { USB_DEVICE(0x0CF3, 0xE004) },
-- { USB_DEVICE(0x0CF3, 0xE005) },
-+ { USB_DEVICE(0x04CA, 0x3010) },
- { USB_DEVICE(0x0930, 0x0219) },
- { USB_DEVICE(0x0930, 0x0220) },
-- { USB_DEVICE(0x0489, 0xe057) },
-- { USB_DEVICE(0x13d3, 0x3393) },
-- { USB_DEVICE(0x0489, 0xe04e) },
-- { USB_DEVICE(0x0489, 0xe056) },
-- { USB_DEVICE(0x0489, 0xe04d) },
-- { USB_DEVICE(0x04c5, 0x1330) },
-- { USB_DEVICE(0x13d3, 0x3402) },
-+ { USB_DEVICE(0x0930, 0x0227) },
-+ { USB_DEVICE(0x0b05, 0x17d0) },
-+ { USB_DEVICE(0x0CF3, 0x0036) },
-+ { USB_DEVICE(0x0CF3, 0x3004) },
-+ { USB_DEVICE(0x0CF3, 0x3008) },
-+ { USB_DEVICE(0x0CF3, 0x311D) },
-+ { USB_DEVICE(0x0CF3, 0x311E) },
-+ { USB_DEVICE(0x0CF3, 0x311F) },
- { USB_DEVICE(0x0cf3, 0x3121) },
-+ { USB_DEVICE(0x0CF3, 0x817a) },
- { USB_DEVICE(0x0cf3, 0xe003) },
-- { USB_DEVICE(0x0489, 0xe05f) },
-+ { USB_DEVICE(0x0CF3, 0xE004) },
-+ { USB_DEVICE(0x0CF3, 0xE005) },
-+ { USB_DEVICE(0x13d3, 0x3362) },
-+ { USB_DEVICE(0x13d3, 0x3375) },
-+ { USB_DEVICE(0x13d3, 0x3393) },
-+ { USB_DEVICE(0x13d3, 0x3402) },
-+ { USB_DEVICE(0x13d3, 0x3408) },
-+ { USB_DEVICE(0x13d3, 0x3432) },
-
- /* Atheros AR5BBU12 with sflash firmware */
- { USB_DEVICE(0x0489, 0xE02C) },
-
- /* Atheros AR5BBU22 with sflash firmware */
-- { USB_DEVICE(0x0489, 0xE03C) },
- { USB_DEVICE(0x0489, 0xE036) },
-+ { USB_DEVICE(0x0489, 0xE03C) },
-
- { } /* Terminating entry */
- };
-@@ -119,37 +127,45 @@ MODULE_DEVICE_TABLE(usb, ath3k_table);
- static const struct usb_device_id ath3k_blist_tbl[] = {
-
- /* Atheros AR3012 with sflash firmware*/
-- { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0CF3, 0x817a), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0CF3, 0x0036), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x311E), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x311F), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0CF3, 0x817a), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
-
- /* Atheros AR5BBU22 with sflash firmware */
-- { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
-
- { } /* Terminating entry */
- };
-diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
-index e00c3f8..03b3317 100644
---- a/drivers/bluetooth/btusb.c
-+++ b/drivers/bluetooth/btusb.c
-@@ -49,6 +49,7 @@ static struct usb_driver btusb_driver;
- #define BTUSB_WRONG_SCO_MTU 0x40
- #define BTUSB_ATH3012 0x80
- #define BTUSB_INTEL 0x100
-+#define BTUSB_INTEL_BOOT 0x200
-
- static const struct usb_device_id btusb_table[] = {
- /* Generic Bluetooth USB device */
-@@ -101,21 +102,31 @@ static const struct usb_device_id btusb_table[] = {
- { USB_DEVICE(0x0c10, 0x0000) },
-
- /* Broadcom BCM20702A0 */
-+ { USB_DEVICE(0x0489, 0xe042) },
-+ { USB_DEVICE(0x04ca, 0x2003) },
- { USB_DEVICE(0x0b05, 0x17b5) },
- { USB_DEVICE(0x0b05, 0x17cb) },
-- { USB_DEVICE(0x04ca, 0x2003) },
-- { USB_DEVICE(0x0489, 0xe042) },
- { USB_DEVICE(0x413c, 0x8197) },
-
- /* Foxconn - Hon Hai */
- { USB_VENDOR_AND_INTERFACE_INFO(0x0489, 0xff, 0x01, 0x01) },
-
-- /*Broadcom devices with vendor specific id */
-+ /* Broadcom devices with vendor specific id */
- { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) },
-
-+ /* ASUSTek Computer - Broadcom based */
-+ { USB_VENDOR_AND_INTERFACE_INFO(0x0b05, 0xff, 0x01, 0x01) },
-+
- /* Belkin F8065bf - Broadcom based */
- { USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01) },
-
-+ /* IMC Networks - Broadcom based */
-+ { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01) },
-+
-+ /* Intel Bluetooth USB Bootloader (RAM module) */
-+ { USB_DEVICE(0x8087, 0x0a5a),
-+ .driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
-+
- { } /* Terminating entry */
- };
-
-@@ -129,56 +140,64 @@ static const struct usb_device_id blacklist_table[] = {
- { USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
-
- /* Atheros 3011 with sflash firmware */
-+ { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE },
-+ { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
-+ { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
- { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
- { USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
- { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
-- { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
-- { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
-- { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE },
-
- /* Atheros AR9285 Malbec with sflash firmware */
- { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
-
- /* Atheros 3012 with sflash firmware */
-- { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x311f), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
-- { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
-
- /* Atheros AR5BBU12 with sflash firmware */
- { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
-
- /* Atheros AR5BBU12 with sflash firmware */
-- { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
- { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 },
-+ { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
-
- /* Broadcom BCM2035 */
-- { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
-- { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
- { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
-+ { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
-+ { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
-
- /* Broadcom BCM2045 */
- { USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },
-@@ -1491,6 +1510,9 @@ static int btusb_probe(struct usb_interface *intf,
- if (id->driver_info & BTUSB_INTEL)
- hdev->setup = btusb_setup_intel;
-
-+ if (id->driver_info & BTUSB_INTEL_BOOT)
-+ set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
-+
- /* Interface numbers are hardcoded in the specification */
- data->isoc = usb_ifnum_to_if(data->udev, 1);
-
-diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
-index 54e2abe..c611bcc 100644
---- a/drivers/edac/sb_edac.c
-+++ b/drivers/edac/sb_edac.c
-@@ -285,8 +285,9 @@ static const u32 correrrthrsld[] = {
- * sbridge structs
- */
-
--#define NUM_CHANNELS 4
--#define MAX_DIMMS 3 /* Max DIMMS per channel */
-+#define NUM_CHANNELS 4
-+#define MAX_DIMMS 3 /* Max DIMMS per channel */
-+#define CHANNEL_UNSPECIFIED 0xf /* Intel IA32 SDM 15-14 */
-
- enum type {
- SANDY_BRIDGE,
-@@ -1750,6 +1751,9 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
-
- /* FIXME: need support for channel mask */
-
-+ if (channel == CHANNEL_UNSPECIFIED)
-+ channel = -1;
-+
- /* Call the helper to output message */
- edac_mc_handle_error(tp_event, mci, core_err_cnt,
- m->addr >> PAGE_SHIFT, m->addr & ~PAGE_MASK, 0,
-diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
-index dcde5605..3177498 100644
---- a/drivers/net/bonding/bond_3ad.c
-+++ b/drivers/net/bonding/bond_3ad.c
-@@ -2479,7 +2479,7 @@ out:
- return NETDEV_TX_OK;
- err_free:
- /* no suitable interface, frame not sent */
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- goto out;
- }
-
-diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
-index e8f133e..c67bbc9 100644
---- a/drivers/net/bonding/bond_alb.c
-+++ b/drivers/net/bonding/bond_alb.c
-@@ -1479,7 +1479,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
- }
-
- /* no suitable interface, frame not sent */
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- out:
- return NETDEV_TX_OK;
- }
-diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
-index 1537982..32b0e705 100644
---- a/drivers/net/bonding/bond_main.c
-+++ b/drivers/net/bonding/bond_main.c
-@@ -3568,7 +3568,7 @@ static void bond_xmit_slave_id(struct bonding *bond, struct sk_buff *skb, int sl
- }
- }
- /* no slave that can tx has been found */
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- }
-
- /**
-@@ -3650,7 +3650,7 @@ static int bond_xmit_activebackup(struct sk_buff *skb, struct net_device *bond_d
- if (slave)
- bond_dev_queue_xmit(bond, skb, slave->dev);
- else
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
-
- return NETDEV_TX_OK;
- }
-@@ -3698,7 +3698,7 @@ static int bond_xmit_broadcast(struct sk_buff *skb, struct net_device *bond_dev)
- if (slave && IS_UP(slave->dev) && slave->link == BOND_LINK_UP)
- bond_dev_queue_xmit(bond, skb, slave->dev);
- else
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
-
- return NETDEV_TX_OK;
- }
-@@ -3785,7 +3785,7 @@ static netdev_tx_t __bond_start_xmit(struct sk_buff *skb, struct net_device *dev
- pr_err("%s: Error: Unknown bonding mode %d\n",
- dev->name, bond->params.mode);
- WARN_ON_ONCE(1);
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
- }
-@@ -3806,7 +3806,7 @@ static netdev_tx_t bond_start_xmit(struct sk_buff *skb, struct net_device *dev)
- if (bond_has_slaves(bond))
- ret = __bond_start_xmit(skb, dev);
- else
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- rcu_read_unlock();
-
- return ret;
-diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
-index 6c9e1c9..0c8a168 100644
---- a/drivers/net/ethernet/broadcom/bnx2.c
-+++ b/drivers/net/ethernet/broadcom/bnx2.c
-@@ -2886,7 +2886,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
- sw_cons = BNX2_NEXT_TX_BD(sw_cons);
-
- tx_bytes += skb->len;
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- tx_pkt++;
- if (tx_pkt == budget)
- break;
-@@ -6640,7 +6640,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
-
- mapping = dma_map_single(&bp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
- if (dma_mapping_error(&bp->pdev->dev, mapping)) {
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
-
-@@ -6733,7 +6733,7 @@ dma_error:
- PCI_DMA_TODEVICE);
- }
-
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
-
-diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
-index 8206113..bc65dc8 100644
---- a/drivers/net/ethernet/broadcom/tg3.c
-+++ b/drivers/net/ethernet/broadcom/tg3.c
-@@ -6593,7 +6593,7 @@ static void tg3_tx(struct tg3_napi *tnapi)
- pkts_compl++;
- bytes_compl += skb->len;
-
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
-
- if (unlikely(tx_bug)) {
- tg3_tx_recover(tp);
-@@ -6925,7 +6925,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget)
- if (len > (tp->dev->mtu + ETH_HLEN) &&
- skb->protocol != htons(ETH_P_8021Q) &&
- skb->protocol != htons(ETH_P_8021AD)) {
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- goto drop_it_no_recycle;
- }
-
-@@ -7808,7 +7808,7 @@ static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi,
- PCI_DMA_TODEVICE);
- /* Make sure the mapping succeeded */
- if (pci_dma_mapping_error(tp->pdev, new_addr)) {
-- dev_kfree_skb(new_skb);
-+ dev_kfree_skb_any(new_skb);
- ret = -1;
- } else {
- u32 save_entry = *entry;
-@@ -7823,13 +7823,13 @@ static int tigon3_dma_hwbug_workaround(struct tg3_napi *tnapi,
- new_skb->len, base_flags,
- mss, vlan)) {
- tg3_tx_skb_unmap(tnapi, save_entry, -1);
-- dev_kfree_skb(new_skb);
-+ dev_kfree_skb_any(new_skb);
- ret = -1;
- }
- }
- }
-
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- *pskb = new_skb;
- return ret;
- }
-@@ -7872,7 +7872,7 @@ static int tg3_tso_bug(struct tg3 *tp, struct sk_buff *skb)
- } while (segs);
-
- tg3_tso_bug_end:
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
-
- return NETDEV_TX_OK;
- }
-@@ -8110,7 +8110,7 @@ dma_error:
- tg3_tx_skb_unmap(tnapi, tnapi->tx_prod, --i);
- tnapi->tx_buffers[tnapi->tx_prod].skb = NULL;
- drop:
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- drop_nofree:
- tp->tx_dropped++;
- return NETDEV_TX_OK;
-diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
-index 80bfa03..075e7e7 100644
---- a/drivers/net/ethernet/emulex/benet/be_main.c
-+++ b/drivers/net/ethernet/emulex/benet/be_main.c
-@@ -1883,7 +1883,7 @@ static u16 be_tx_compl_process(struct be_adapter *adapter,
- queue_tail_inc(txq);
- } while (cur_index != last_index);
-
-- kfree_skb(sent_skb);
-+ dev_kfree_skb_any(sent_skb);
- return num_wrbs;
- }
-
-diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
-index ad5a5aa..70eb4d2 100644
---- a/drivers/net/ethernet/freescale/gianfar.c
-+++ b/drivers/net/ethernet/freescale/gianfar.c
-@@ -2152,13 +2152,13 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
- skb_new = skb_realloc_headroom(skb, fcb_len);
- if (!skb_new) {
- dev->stats.tx_errors++;
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
-
- if (skb->sk)
- skb_set_owner_w(skb_new, skb->sk);
-- consume_skb(skb);
-+ dev_consume_skb_any(skb);
- skb = skb_new;
- }
-
-diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_main.c b/drivers/net/ethernet/intel/ixgb/ixgb_main.c
-index 57e390c..f42c201 100644
---- a/drivers/net/ethernet/intel/ixgb/ixgb_main.c
-+++ b/drivers/net/ethernet/intel/ixgb/ixgb_main.c
-@@ -1521,12 +1521,12 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
- int tso;
-
- if (test_bit(__IXGB_DOWN, &adapter->flags)) {
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
-
- if (skb->len <= 0) {
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
-
-@@ -1543,7 +1543,7 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
-
- tso = ixgb_tso(adapter, skb);
- if (tso < 0) {
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return NETDEV_TX_OK;
- }
-
-diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
-index 2f83f34..8be0f3e 100644
---- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
-+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
-@@ -2497,13 +2497,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
- netif_carrier_off(dev);
- mlx4_en_set_default_moderation(priv);
-
-- err = register_netdev(dev);
-- if (err) {
-- en_err(priv, "Netdev registration failed for port %d\n", port);
-- goto out;
-- }
-- priv->registered = 1;
--
- en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num);
- en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
-
-@@ -2543,6 +2536,14 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
- queue_delayed_work(mdev->workqueue, &priv->service_task,
- SERVICE_TASK_DELAY);
-
-+ err = register_netdev(dev);
-+ if (err) {
-+ en_err(priv, "Netdev registration failed for port %d\n", port);
-+ goto out;
-+ }
-+
-+ priv->registered = 1;
-+
- return 0;
-
- out:
-diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
-index 1345703..019a04a 100644
---- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
-+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
-@@ -325,7 +325,7 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
- }
- }
- }
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- return tx_info->nr_txbb;
- }
-
-diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c
-index 737c1a8..a3c1daa 100644
---- a/drivers/net/ethernet/realtek/8139cp.c
-+++ b/drivers/net/ethernet/realtek/8139cp.c
-@@ -899,7 +899,7 @@ out_unlock:
-
- return NETDEV_TX_OK;
- out_dma_error:
-- kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- cp->dev->stats.tx_dropped++;
- goto out_unlock;
- }
-diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c
-index da5972e..8cb2f35 100644
---- a/drivers/net/ethernet/realtek/8139too.c
-+++ b/drivers/net/ethernet/realtek/8139too.c
-@@ -1717,9 +1717,9 @@ static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
- if (len < ETH_ZLEN)
- memset(tp->tx_buf[entry], 0, ETH_ZLEN);
- skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- } else {
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- dev->stats.tx_dropped++;
- return NETDEV_TX_OK;
- }
-diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index 3ff7bc3..90c14d1 100644
---- a/drivers/net/ethernet/realtek/r8169.c
-+++ b/drivers/net/ethernet/realtek/r8169.c
-@@ -5834,7 +5834,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
- tp->TxDescArray + entry);
- if (skb) {
- tp->dev->stats.tx_dropped++;
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- tx_skb->skb = NULL;
- }
- }
-@@ -6059,7 +6059,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
- err_dma_1:
- rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
- err_dma_0:
-- dev_kfree_skb(skb);
-+ dev_kfree_skb_any(skb);
- err_update_stats:
- dev->stats.tx_dropped++;
- return NETDEV_TX_OK;
-@@ -6142,7 +6142,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp)
- tp->tx_stats.packets++;
- tp->tx_stats.bytes += tx_skb->skb->len;
- u64_stats_update_end(&tp->tx_stats.syncp);
-- dev_kfree_skb(tx_skb->skb);
-+ dev_kfree_skb_any(tx_skb->skb);
- tx_skb->skb = NULL;
- }
- dirty_tx++;
-diff --git a/drivers/staging/lustre/lustre/llite/dcache.c b/drivers/staging/lustre/lustre/llite/dcache.c
-index cbd663e..19405ed 100644
---- a/drivers/staging/lustre/lustre/llite/dcache.c
-+++ b/drivers/staging/lustre/lustre/llite/dcache.c
-@@ -278,7 +278,7 @@ void ll_invalidate_aliases(struct inode *inode)
- inode->i_ino, inode->i_generation, inode);
-
- ll_lock_dcache(inode);
-- ll_d_hlist_for_each_entry(dentry, p, &inode->i_dentry, d_alias) {
-+ ll_d_hlist_for_each_entry(dentry, p, &inode->i_dentry, d_u.d_alias) {
- CDEBUG(D_DENTRY, "dentry in drop %.*s (%p) parent %p "
- "inode %p flags %d\n", dentry->d_name.len,
- dentry->d_name.name, dentry, dentry->d_parent,
-diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c
-index 6cfdb9e..5ae562e 100644
---- a/drivers/staging/lustre/lustre/llite/llite_lib.c
-+++ b/drivers/staging/lustre/lustre/llite/llite_lib.c
-@@ -678,7 +678,7 @@ void lustre_dump_dentry(struct dentry *dentry, int recur)
- return;
-
- list_for_each(tmp, &dentry->d_subdirs) {
-- struct dentry *d = list_entry(tmp, struct dentry, d_u.d_child);
-+ struct dentry *d = list_entry(tmp, struct dentry, d_child);
- lustre_dump_dentry(d, recur - 1);
- }
- }
-diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c
-index fc8d264..8e9a9e9 100644
---- a/drivers/staging/lustre/lustre/llite/namei.c
-+++ b/drivers/staging/lustre/lustre/llite/namei.c
-@@ -175,14 +175,14 @@ static void ll_invalidate_negative_children(struct inode *dir)
- struct ll_d_hlist_node *p;
-
- ll_lock_dcache(dir);
-- ll_d_hlist_for_each_entry(dentry, p, &dir->i_dentry, d_alias) {
-+ ll_d_hlist_for_each_entry(dentry, p, &dir->i_dentry, d_u.d_alias) {
- spin_lock(&dentry->d_lock);
- if (!list_empty(&dentry->d_subdirs)) {
- struct dentry *child;
-
- list_for_each_entry_safe(child, tmp_subdir,
- &dentry->d_subdirs,
-- d_u.d_child) {
-+ d_child) {
- if (child->d_inode == NULL)
- d_lustre_invalidate(child, 1);
- }
-@@ -364,7 +364,7 @@ static struct dentry *ll_find_alias(struct inode *inode, struct dentry *dentry)
- discon_alias = invalid_alias = NULL;
-
- ll_lock_dcache(inode);
-- ll_d_hlist_for_each_entry(alias, p, &inode->i_dentry, d_alias) {
-+ ll_d_hlist_for_each_entry(alias, p, &inode->i_dentry, d_u.d_alias) {
- LASSERT(alias != dentry);
-
- spin_lock(&alias->d_lock);
-@@ -953,7 +953,7 @@ static void ll_get_child_fid(struct inode * dir, struct qstr *name,
- {
- struct dentry *parent, *child;
-
-- parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_alias);
-+ parent = ll_d_hlist_entry(dir->i_dentry, struct dentry, d_u.d_alias);
- child = d_lookup(parent, name);
- if (child) {
- if (child->d_inode)
-diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c
-index 93cbfbb..6096771 100644
---- a/drivers/staging/lustre/lustre/llite/vvp_io.c
-+++ b/drivers/staging/lustre/lustre/llite/vvp_io.c
-@@ -642,7 +642,7 @@ static int vvp_io_kernel_fault(struct vvp_fault_io *cfio)
- return 0;
- }
-
-- if (cfio->fault.ft_flags & VM_FAULT_SIGBUS) {
-+ if (cfio->fault.ft_flags & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV)) {
- CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address);
- return -EFAULT;
- }
-diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c
-index d9a4367..9cca0ea 100644
---- a/fs/affs/amigaffs.c
-+++ b/fs/affs/amigaffs.c
-@@ -126,7 +126,7 @@ affs_fix_dcache(struct inode *inode, u32 entry_ino)
- {
- struct dentry *dentry;
- spin_lock(&inode->i_lock);
-- hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
- if (entry_ino == (u32)(long)dentry->d_fsdata) {
- dentry->d_fsdata = (void *)inode->i_ino;
- break;
-diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c
-index 394e90b..edb46e6 100644
---- a/fs/autofs4/expire.c
-+++ b/fs/autofs4/expire.c
-@@ -91,7 +91,7 @@ static struct dentry *get_next_positive_subdir(struct dentry *prev,
- spin_lock(&root->d_lock);
-
- if (prev)
-- next = prev->d_u.d_child.next;
-+ next = prev->d_child.next;
- else {
- prev = dget_dlock(root);
- next = prev->d_subdirs.next;
-@@ -105,13 +105,13 @@ cont:
- return NULL;
- }
-
-- q = list_entry(next, struct dentry, d_u.d_child);
-+ q = list_entry(next, struct dentry, d_child);
-
- spin_lock_nested(&q->d_lock, DENTRY_D_LOCK_NESTED);
- /* Already gone or negative dentry (under construction) - try next */
- if (!d_count(q) || !simple_positive(q)) {
- spin_unlock(&q->d_lock);
-- next = q->d_u.d_child.next;
-+ next = q->d_child.next;
- goto cont;
- }
- dget_dlock(q);
-@@ -161,13 +161,13 @@ again:
- goto relock;
- }
- spin_unlock(&p->d_lock);
-- next = p->d_u.d_child.next;
-+ next = p->d_child.next;
- p = parent;
- if (next != &parent->d_subdirs)
- break;
- }
- }
-- ret = list_entry(next, struct dentry, d_u.d_child);
-+ ret = list_entry(next, struct dentry, d_child);
-
- spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED);
- /* Negative dentry - try next */
-@@ -461,7 +461,7 @@ found:
- spin_lock(&sbi->lookup_lock);
- spin_lock(&expired->d_parent->d_lock);
- spin_lock_nested(&expired->d_lock, DENTRY_D_LOCK_NESTED);
-- list_move(&expired->d_parent->d_subdirs, &expired->d_u.d_child);
-+ list_move(&expired->d_parent->d_subdirs, &expired->d_child);
- spin_unlock(&expired->d_lock);
- spin_unlock(&expired->d_parent->d_lock);
- spin_unlock(&sbi->lookup_lock);
-diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c
-index cc87c1a..9e016e6 100644
---- a/fs/autofs4/root.c
-+++ b/fs/autofs4/root.c
-@@ -655,7 +655,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
- /* only consider parents below dentrys in the root */
- if (IS_ROOT(parent->d_parent))
- return;
-- d_child = &dentry->d_u.d_child;
-+ d_child = &dentry->d_child;
- /* Set parent managed if it's becoming empty */
- if (d_child->next == &parent->d_subdirs &&
- d_child->prev == &parent->d_subdirs)
-diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
-index 5e0982a..18e14cf 100644
---- a/fs/ceph/dir.c
-+++ b/fs/ceph/dir.c
-@@ -111,7 +111,7 @@ static int fpos_cmp(loff_t l, loff_t r)
- /*
- * When possible, we try to satisfy a readdir by peeking at the
- * dcache. We make this work by carefully ordering dentries on
-- * d_u.d_child when we initially get results back from the MDS, and
-+ * d_child when we initially get results back from the MDS, and
- * falling back to a "normal" sync readdir if any dentries in the dir
- * are dropped.
- *
-@@ -146,11 +146,11 @@ static int __dcache_readdir(struct file *file, struct dir_context *ctx)
- p = parent->d_subdirs.prev;
- dout(" initial p %p/%p\n", p->prev, p->next);
- } else {
-- p = last->d_u.d_child.prev;
-+ p = last->d_child.prev;
- }
-
- more:
-- dentry = list_entry(p, struct dentry, d_u.d_child);
-+ dentry = list_entry(p, struct dentry, d_child);
- di = ceph_dentry(dentry);
- while (1) {
- dout(" p %p/%p %s d_subdirs %p/%p\n", p->prev, p->next,
-@@ -172,7 +172,7 @@ more:
- !dentry->d_inode ? " null" : "");
- spin_unlock(&dentry->d_lock);
- p = p->prev;
-- dentry = list_entry(p, struct dentry, d_u.d_child);
-+ dentry = list_entry(p, struct dentry, d_child);
- di = ceph_dentry(dentry);
- }
-
-diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
-index 6471f9c..ee24490 100644
---- a/fs/ceph/inode.c
-+++ b/fs/ceph/inode.c
-@@ -1289,7 +1289,7 @@ retry_lookup:
- /* reorder parent's d_subdirs */
- spin_lock(&parent->d_lock);
- spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED);
-- list_move(&dn->d_u.d_child, &parent->d_subdirs);
-+ list_move(&dn->d_child, &parent->d_subdirs);
- spin_unlock(&dn->d_lock);
- spin_unlock(&parent->d_lock);
- }
-diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
-index f2ddcf7..7ee427e 100644
---- a/fs/cifs/inode.c
-+++ b/fs/cifs/inode.c
-@@ -883,7 +883,7 @@ inode_has_hashed_dentries(struct inode *inode)
- struct dentry *dentry;
-
- spin_lock(&inode->i_lock);
-- hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
- if (!d_unhashed(dentry) || IS_ROOT(dentry)) {
- spin_unlock(&inode->i_lock);
- return true;
-diff --git a/fs/coda/cache.c b/fs/coda/cache.c
-index 1da168c..9bc1147 100644
---- a/fs/coda/cache.c
-+++ b/fs/coda/cache.c
-@@ -92,7 +92,7 @@ static void coda_flag_children(struct dentry *parent, int flag)
- struct dentry *de;
-
- spin_lock(&parent->d_lock);
-- list_for_each_entry(de, &parent->d_subdirs, d_u.d_child) {
-+ list_for_each_entry(de, &parent->d_subdirs, d_child) {
- /* don't know what to do with negative dentries */
- if (de->d_inode )
- coda_flag_inode(de->d_inode, flag);
-diff --git a/fs/dcache.c b/fs/dcache.c
-index 4366127..c345f5f 100644
---- a/fs/dcache.c
-+++ b/fs/dcache.c
-@@ -44,7 +44,7 @@
- /*
- * Usage:
- * dcache->d_inode->i_lock protects:
-- * - i_dentry, d_alias, d_inode of aliases
-+ * - i_dentry, d_u.d_alias, d_inode of aliases
- * dcache_hash_bucket lock protects:
- * - the dcache hash table
- * s_anon bl list spinlock protects:
-@@ -59,7 +59,7 @@
- * - d_unhashed()
- * - d_parent and d_subdirs
- * - childrens' d_child and d_parent
-- * - d_alias, d_inode
-+ * - d_u.d_alias, d_inode
- *
- * Ordering:
- * dentry->d_inode->i_lock
-@@ -239,7 +239,6 @@ static void __d_free(struct rcu_head *head)
- {
- struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu);
-
-- WARN_ON(!hlist_unhashed(&dentry->d_alias));
- if (dname_external(dentry))
- kfree(dentry->d_name.name);
- kmem_cache_free(dentry_cache, dentry);
-@@ -250,6 +249,7 @@ static void __d_free(struct rcu_head *head)
- */
- static void d_free(struct dentry *dentry)
- {
-+ WARN_ON(!hlist_unhashed(&dentry->d_u.d_alias));
- BUG_ON((int)dentry->d_lockref.count > 0);
- this_cpu_dec(nr_dentry);
- if (dentry->d_op && dentry->d_op->d_release)
-@@ -288,7 +288,7 @@ static void dentry_iput(struct dentry * dentry)
- struct inode *inode = dentry->d_inode;
- if (inode) {
- dentry->d_inode = NULL;
-- hlist_del_init(&dentry->d_alias);
-+ hlist_del_init(&dentry->d_u.d_alias);
- spin_unlock(&dentry->d_lock);
- spin_unlock(&inode->i_lock);
- if (!inode->i_nlink)
-@@ -313,7 +313,7 @@ static void dentry_unlink_inode(struct dentry * dentry)
- struct inode *inode = dentry->d_inode;
- __d_clear_type(dentry);
- dentry->d_inode = NULL;
-- hlist_del_init(&dentry->d_alias);
-+ hlist_del_init(&dentry->d_u.d_alias);
- dentry_rcuwalk_barrier(dentry);
- spin_unlock(&dentry->d_lock);
- spin_unlock(&inode->i_lock);
-@@ -435,7 +435,7 @@ static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent)
- __releases(parent->d_lock)
- __releases(dentry->d_inode->i_lock)
- {
-- list_del(&dentry->d_u.d_child);
-+ list_del(&dentry->d_child);
- /*
- * Inform d_walk() that we are no longer attached to the
- * dentry tree
-@@ -737,7 +737,7 @@ static struct dentry *__d_find_alias(struct inode *inode, int want_discon)
-
- again:
- discon_alias = NULL;
-- hlist_for_each_entry(alias, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
- spin_lock(&alias->d_lock);
- if (S_ISDIR(inode->i_mode) || !d_unhashed(alias)) {
- if (IS_ROOT(alias) &&
-@@ -790,7 +790,7 @@ void d_prune_aliases(struct inode *inode)
- struct dentry *dentry;
- restart:
- spin_lock(&inode->i_lock);
-- hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
- spin_lock(&dentry->d_lock);
- if (!dentry->d_lockref.count) {
- /*
-@@ -1091,7 +1091,7 @@ repeat:
- resume:
- while (next != &this_parent->d_subdirs) {
- struct list_head *tmp = next;
-- struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child);
-+ struct dentry *dentry = list_entry(tmp, struct dentry, d_child);
- next = tmp->next;
-
- spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
-@@ -1143,7 +1143,7 @@ resume:
- goto rename_retry;
- }
- rcu_read_unlock();
-- next = child->d_u.d_child.next;
-+ next = child->d_child.next;
- goto resume;
- }
- if (need_seqretry(&rename_lock, seq)) {
-@@ -1524,8 +1524,8 @@ struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name)
- INIT_HLIST_BL_NODE(&dentry->d_hash);
- INIT_LIST_HEAD(&dentry->d_lru);
- INIT_LIST_HEAD(&dentry->d_subdirs);
-- INIT_HLIST_NODE(&dentry->d_alias);
-- INIT_LIST_HEAD(&dentry->d_u.d_child);
-+ INIT_HLIST_NODE(&dentry->d_u.d_alias);
-+ INIT_LIST_HEAD(&dentry->d_child);
- d_set_d_op(dentry, dentry->d_sb->s_d_op);
-
- this_cpu_inc(nr_dentry);
-@@ -1555,7 +1555,7 @@ struct dentry *d_alloc(struct dentry * parent, const struct qstr *name)
- */
- __dget_dlock(parent);
- dentry->d_parent = parent;
-- list_add(&dentry->d_u.d_child, &parent->d_subdirs);
-+ list_add(&dentry->d_child, &parent->d_subdirs);
- spin_unlock(&parent->d_lock);
-
- return dentry;
-@@ -1648,7 +1648,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
- spin_lock(&dentry->d_lock);
- __d_set_type(dentry, add_flags);
- if (inode)
-- hlist_add_head(&dentry->d_alias, &inode->i_dentry);
-+ hlist_add_head(&dentry->d_u.d_alias, &inode->i_dentry);
- dentry->d_inode = inode;
- dentry_rcuwalk_barrier(dentry);
- spin_unlock(&dentry->d_lock);
-@@ -1672,7 +1672,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode)
-
- void d_instantiate(struct dentry *entry, struct inode * inode)
- {
-- BUG_ON(!hlist_unhashed(&entry->d_alias));
-+ BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
- if (inode)
- spin_lock(&inode->i_lock);
- __d_instantiate(entry, inode);
-@@ -1711,7 +1711,7 @@ static struct dentry *__d_instantiate_unique(struct dentry *entry,
- return NULL;
- }
-
-- hlist_for_each_entry(alias, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
- /*
- * Don't need alias->d_lock here, because aliases with
- * d_parent == entry->d_parent are not subject to name or
-@@ -1737,7 +1737,7 @@ struct dentry *d_instantiate_unique(struct dentry *entry, struct inode *inode)
- {
- struct dentry *result;
-
-- BUG_ON(!hlist_unhashed(&entry->d_alias));
-+ BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
-
- if (inode)
- spin_lock(&inode->i_lock);
-@@ -1768,7 +1768,7 @@ EXPORT_SYMBOL(d_instantiate_unique);
- */
- int d_instantiate_no_diralias(struct dentry *entry, struct inode *inode)
- {
-- BUG_ON(!hlist_unhashed(&entry->d_alias));
-+ BUG_ON(!hlist_unhashed(&entry->d_u.d_alias));
-
- spin_lock(&inode->i_lock);
- if (S_ISDIR(inode->i_mode) && !hlist_empty(&inode->i_dentry)) {
-@@ -1807,7 +1807,7 @@ static struct dentry * __d_find_any_alias(struct inode *inode)
-
- if (hlist_empty(&inode->i_dentry))
- return NULL;
-- alias = hlist_entry(inode->i_dentry.first, struct dentry, d_alias);
-+ alias = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
- __dget(alias);
- return alias;
- }
-@@ -1884,7 +1884,7 @@ struct dentry *d_obtain_alias(struct inode *inode)
- spin_lock(&tmp->d_lock);
- tmp->d_inode = inode;
- tmp->d_flags |= add_flags;
-- hlist_add_head(&tmp->d_alias, &inode->i_dentry);
-+ hlist_add_head(&tmp->d_u.d_alias, &inode->i_dentry);
- hlist_bl_lock(&tmp->d_sb->s_anon);
- hlist_bl_add_head(&tmp->d_hash, &tmp->d_sb->s_anon);
- hlist_bl_unlock(&tmp->d_sb->s_anon);
-@@ -2327,7 +2327,7 @@ int d_validate(struct dentry *dentry, struct dentry *dparent)
- struct dentry *child;
-
- spin_lock(&dparent->d_lock);
-- list_for_each_entry(child, &dparent->d_subdirs, d_u.d_child) {
-+ list_for_each_entry(child, &dparent->d_subdirs, d_child) {
- if (dentry == child) {
- spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
- __dget_dlock(dentry);
-@@ -2574,8 +2574,8 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
- /* Unhash the target: dput() will then get rid of it */
- __d_drop(target);
-
-- list_del(&dentry->d_u.d_child);
-- list_del(&target->d_u.d_child);
-+ list_del(&dentry->d_child);
-+ list_del(&target->d_child);
-
- /* Switch the names.. */
- switch_names(dentry, target);
-@@ -2585,15 +2585,15 @@ static void __d_move(struct dentry * dentry, struct dentry * target)
- if (IS_ROOT(dentry)) {
- dentry->d_parent = target->d_parent;
- target->d_parent = target;
-- INIT_LIST_HEAD(&target->d_u.d_child);
-+ INIT_LIST_HEAD(&target->d_child);
- } else {
- swap(dentry->d_parent, target->d_parent);
-
- /* And add them back to the (new) parent lists */
-- list_add(&target->d_u.d_child, &target->d_parent->d_subdirs);
-+ list_add(&target->d_child, &target->d_parent->d_subdirs);
- }
-
-- list_add(&dentry->d_u.d_child, &dentry->d_parent->d_subdirs);
-+ list_add(&dentry->d_child, &dentry->d_parent->d_subdirs);
-
- write_seqcount_end(&target->d_seq);
- write_seqcount_end(&dentry->d_seq);
-@@ -2700,9 +2700,9 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
- swap(dentry->d_name.hash, anon->d_name.hash);
-
- dentry->d_parent = dentry;
-- list_del_init(&dentry->d_u.d_child);
-+ list_del_init(&dentry->d_child);
- anon->d_parent = dparent;
-- list_move(&anon->d_u.d_child, &dparent->d_subdirs);
-+ list_move(&anon->d_child, &dparent->d_subdirs);
-
- write_seqcount_end(&dentry->d_seq);
- write_seqcount_end(&anon->d_seq);
-@@ -3333,7 +3333,7 @@ void d_tmpfile(struct dentry *dentry, struct inode *inode)
- {
- inode_dec_link_count(inode);
- BUG_ON(dentry->d_name.name != dentry->d_iname ||
-- !hlist_unhashed(&dentry->d_alias) ||
-+ !hlist_unhashed(&dentry->d_u.d_alias) ||
- !d_unlinked(dentry));
- spin_lock(&dentry->d_parent->d_lock);
- spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
-diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
-index 1ff8fe5..4a9f0e0 100644
---- a/fs/debugfs/inode.c
-+++ b/fs/debugfs/inode.c
-@@ -552,7 +552,7 @@ void debugfs_remove_recursive(struct dentry *dentry)
- * use the d_u.d_child as the rcu head and corrupt this list.
- */
- spin_lock(&parent->d_lock);
-- list_for_each_entry(child, &parent->d_subdirs, d_u.d_child) {
-+ list_for_each_entry(child, &parent->d_subdirs, d_child) {
- if (!debugfs_positive(child))
- continue;
-
-diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
-index 48a359d..831d4f0 100644
---- a/fs/exportfs/expfs.c
-+++ b/fs/exportfs/expfs.c
-@@ -50,7 +50,7 @@ find_acceptable_alias(struct dentry *result,
-
- inode = result->d_inode;
- spin_lock(&inode->i_lock);
-- hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
- dget(dentry);
- spin_unlock(&inode->i_lock);
- if (toput)
-diff --git a/fs/libfs.c b/fs/libfs.c
-index a184424..868c0b7 100644
---- a/fs/libfs.c
-+++ b/fs/libfs.c
-@@ -113,18 +113,18 @@ loff_t dcache_dir_lseek(struct file *file, loff_t offset, int whence)
-
- spin_lock(&dentry->d_lock);
- /* d_lock not required for cursor */
-- list_del(&cursor->d_u.d_child);
-+ list_del(&cursor->d_child);
- p = dentry->d_subdirs.next;
- while (n && p != &dentry->d_subdirs) {
- struct dentry *next;
-- next = list_entry(p, struct dentry, d_u.d_child);
-+ next = list_entry(p, struct dentry, d_child);
- spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED);
- if (simple_positive(next))
- n--;
- spin_unlock(&next->d_lock);
- p = p->next;
- }
-- list_add_tail(&cursor->d_u.d_child, p);
-+ list_add_tail(&cursor->d_child, p);
- spin_unlock(&dentry->d_lock);
- }
- }
-@@ -149,7 +149,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx)
- {
- struct dentry *dentry = file->f_path.dentry;
- struct dentry *cursor = file->private_data;
-- struct list_head *p, *q = &cursor->d_u.d_child;
-+ struct list_head *p, *q = &cursor->d_child;
-
- if (!dir_emit_dots(file, ctx))
- return 0;
-@@ -158,7 +158,7 @@ int dcache_readdir(struct file *file, struct dir_context *ctx)
- list_move(q, &dentry->d_subdirs);
-
- for (p = q->next; p != &dentry->d_subdirs; p = p->next) {
-- struct dentry *next = list_entry(p, struct dentry, d_u.d_child);
-+ struct dentry *next = list_entry(p, struct dentry, d_child);
- spin_lock_nested(&next->d_lock, DENTRY_D_LOCK_NESTED);
- if (!simple_positive(next)) {
- spin_unlock(&next->d_lock);
-@@ -286,7 +286,7 @@ int simple_empty(struct dentry *dentry)
- int ret = 0;
-
- spin_lock(&dentry->d_lock);
-- list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child) {
-+ list_for_each_entry(child, &dentry->d_subdirs, d_child) {
- spin_lock_nested(&child->d_lock, DENTRY_D_LOCK_NESTED);
- if (simple_positive(child)) {
- spin_unlock(&child->d_lock);
-diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c
-index c320ac5..dc9747d 100644
---- a/fs/ncpfs/dir.c
-+++ b/fs/ncpfs/dir.c
-@@ -406,7 +406,7 @@ ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos)
- spin_lock(&parent->d_lock);
- next = parent->d_subdirs.next;
- while (next != &parent->d_subdirs) {
-- dent = list_entry(next, struct dentry, d_u.d_child);
-+ dent = list_entry(next, struct dentry, d_child);
- if ((unsigned long)dent->d_fsdata == fpos) {
- if (dent->d_inode)
- dget(dent);
-diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h
-index 32c0658..6d5e7c5 100644
---- a/fs/ncpfs/ncplib_kernel.h
-+++ b/fs/ncpfs/ncplib_kernel.h
-@@ -194,7 +194,7 @@ ncp_renew_dentries(struct dentry *parent)
- spin_lock(&parent->d_lock);
- next = parent->d_subdirs.next;
- while (next != &parent->d_subdirs) {
-- dentry = list_entry(next, struct dentry, d_u.d_child);
-+ dentry = list_entry(next, struct dentry, d_child);
-
- if (dentry->d_fsdata == NULL)
- ncp_age_dentry(server, dentry);
-@@ -216,7 +216,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)
- spin_lock(&parent->d_lock);
- next = parent->d_subdirs.next;
- while (next != &parent->d_subdirs) {
-- dentry = list_entry(next, struct dentry, d_u.d_child);
-+ dentry = list_entry(next, struct dentry, d_child);
- dentry->d_fsdata = NULL;
- ncp_age_dentry(server, dentry);
- next = next->next;
-diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c
-index 66984a9..5b8ab0e 100644
---- a/fs/nfs/getroot.c
-+++ b/fs/nfs/getroot.c
-@@ -58,7 +58,7 @@ static int nfs_superblock_set_dummy_root(struct super_block *sb, struct inode *i
- */
- spin_lock(&sb->s_root->d_inode->i_lock);
- spin_lock(&sb->s_root->d_lock);
-- hlist_del_init(&sb->s_root->d_alias);
-+ hlist_del_init(&sb->s_root->d_u.d_alias);
- spin_unlock(&sb->s_root->d_lock);
- spin_unlock(&sb->s_root->d_inode->i_lock);
- }
-diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c
-index 9d3e9c5..7001299 100644
---- a/fs/notify/fsnotify.c
-+++ b/fs/notify/fsnotify.c
-@@ -63,14 +63,14 @@ void __fsnotify_update_child_dentry_flags(struct inode *inode)
- spin_lock(&inode->i_lock);
- /* run all of the dentries associated with this inode. Since this is a
- * directory, there damn well better only be one item on this list */
-- hlist_for_each_entry(alias, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(alias, &inode->i_dentry, d_u.d_alias) {
- struct dentry *child;
-
- /* run all of the children of the original inode and fix their
- * d_flags to indicate parental interest (their parent is the
- * original inode) */
- spin_lock(&alias->d_lock);
-- list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) {
-+ list_for_each_entry(child, &alias->d_subdirs, d_child) {
- if (!child->d_inode)
- continue;
-
-diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c
-index 0d3a97d..1167485 100644
---- a/fs/ocfs2/dcache.c
-+++ b/fs/ocfs2/dcache.c
-@@ -173,7 +173,7 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode,
- struct dentry *dentry;
-
- spin_lock(&inode->i_lock);
-- hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) {
-+ hlist_for_each_entry(dentry, &inode->i_dentry, d_u.d_alias) {
- spin_lock(&dentry->d_lock);
- if (ocfs2_match_dentry(dentry, parent_blkno, skip_unhashed)) {
- trace_ocfs2_find_local_alias(dentry->d_name.len,
-diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index c254671..eaa7374 100644
---- a/fs/proc/task_mmu.c
-+++ b/fs/proc/task_mmu.c
-@@ -993,9 +993,8 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
- struct vm_area_struct *vma;
- struct pagemapread *pm = walk->private;
- spinlock_t *ptl;
-- pte_t *pte;
-+ pte_t *pte, *orig_pte;
- int err = 0;
-- pagemap_entry_t pme = make_pme(PM_NOT_PRESENT(pm->v2));
-
- /* find the first VMA at or above 'addr' */
- vma = find_vma(walk->mm, addr);
-@@ -1009,6 +1008,7 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
-
- for (; addr != end; addr += PAGE_SIZE) {
- unsigned long offset;
-+ pagemap_entry_t pme;
-
- offset = (addr & ~PAGEMAP_WALK_MASK) >>
- PAGE_SHIFT;
-@@ -1023,32 +1023,55 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
-
- if (pmd_trans_unstable(pmd))
- return 0;
-- for (; addr != end; addr += PAGE_SIZE) {
-- int flags2;
--
-- /* check to see if we've left 'vma' behind
-- * and need a new, higher one */
-- if (vma && (addr >= vma->vm_end)) {
-- vma = find_vma(walk->mm, addr);
-- if (vma && (vma->vm_flags & VM_SOFTDIRTY))
-- flags2 = __PM_SOFT_DIRTY;
-- else
-- flags2 = 0;
-- pme = make_pme(PM_NOT_PRESENT(pm->v2) | PM_STATUS2(pm->v2, flags2));
-+
-+ while (1) {
-+ /* End of address space hole, which we mark as non-present. */
-+ unsigned long hole_end;
-+
-+ if (vma)
-+ hole_end = min(end, vma->vm_start);
-+ else
-+ hole_end = end;
-+
-+ for (; addr < hole_end; addr += PAGE_SIZE) {
-+ pagemap_entry_t pme = make_pme(PM_NOT_PRESENT(pm->v2));
-+
-+ err = add_to_pagemap(addr, &pme, pm);
-+ if (err)
-+ return err;
- }
-
-- /* check that 'vma' actually covers this address,
-- * and that it isn't a huge page vma */
-- if (vma && (vma->vm_start <= addr) &&
-- !is_vm_hugetlb_page(vma)) {
-- pte = pte_offset_map(pmd, addr);
-+ if (!vma || vma->vm_start >= end)
-+ break;
-+ /*
-+ * We can't possibly be in a hugetlb VMA. In general,
-+ * for a mm_walk with a pmd_entry and a hugetlb_entry,
-+ * the pmd_entry can only be called on addresses in a
-+ * hugetlb if the walk starts in a non-hugetlb VMA and
-+ * spans a hugepage VMA. Since pagemap_read walks are
-+ * PMD-sized and PMD-aligned, this will never be true.
-+ */
-+ BUG_ON(is_vm_hugetlb_page(vma));
-+
-+ /* Addresses in the VMA. */
-+ orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
-+ for (; addr < min(end, vma->vm_end); pte++, addr += PAGE_SIZE) {
-+ pagemap_entry_t pme;
-+
- pte_to_pagemap_entry(&pme, pm, vma, addr, *pte);
-- /* unmap before userspace copy */
-- pte_unmap(pte);
-+ err = add_to_pagemap(addr, &pme, pm);
-+ if (err)
-+ break;
- }
-- err = add_to_pagemap(addr, &pme, pm);
-+ pte_unmap_unlock(orig_pte, ptl);
-+
- if (err)
- return err;
-+
-+ if (addr == end)
-+ break;
-+
-+ vma = find_vma(walk->mm, addr);
- }
-
- cond_resched();
-diff --git a/include/linux/dcache.h b/include/linux/dcache.h
-index 3b50cac..0f0eb1c 100644
---- a/include/linux/dcache.h
-+++ b/include/linux/dcache.h
-@@ -124,15 +124,15 @@ struct dentry {
- void *d_fsdata; /* fs-specific data */
-
- struct list_head d_lru; /* LRU list */
-+ struct list_head d_child; /* child of parent list */
-+ struct list_head d_subdirs; /* our children */
- /*
-- * d_child and d_rcu can share memory
-+ * d_alias and d_rcu can share memory
- */
- union {
-- struct list_head d_child; /* child of parent list */
-+ struct hlist_node d_alias; /* inode alias list */
- struct rcu_head d_rcu;
- } d_u;
-- struct list_head d_subdirs; /* our children */
-- struct hlist_node d_alias; /* inode alias list */
- };
-
- /*
-diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 46b8ab5..a7b311d 100644
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -1009,6 +1009,7 @@ static inline int page_mapped(struct page *page)
- #define VM_FAULT_WRITE 0x0008 /* Special case for get_user_pages */
- #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */
- #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */
-+#define VM_FAULT_SIGSEGV 0x0040
-
- #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */
- #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */
-@@ -1017,8 +1018,9 @@ static inline int page_mapped(struct page *page)
-
- #define VM_FAULT_HWPOISON_LARGE_MASK 0xf000 /* encodes hpage index for large hwpoison */
-
--#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | \
-- VM_FAULT_FALLBACK | VM_FAULT_HWPOISON_LARGE)
-+#define VM_FAULT_ERROR (VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | \
-+ VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE | \
-+ VM_FAULT_FALLBACK)
-
- /* Encode hstate index for a hwpoisoned large page */
- #define VM_FAULT_SET_HINDEX(x) ((x) << 12)
-diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index 911718f..bf46cc8 100644
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1880,6 +1880,12 @@ void netdev_freemem(struct net_device *dev);
- void synchronize_net(void);
- int init_dummy_netdev(struct net_device *dev);
-
-+DECLARE_PER_CPU(int, xmit_recursion);
-+static inline int dev_recursion_level(void)
-+{
-+ return this_cpu_read(xmit_recursion);
-+}
-+
- struct net_device *dev_get_by_index(struct net *net, int ifindex);
- struct net_device *__dev_get_by_index(struct net *net, int ifindex);
- struct net_device *dev_get_by_index_rcu(struct net *net, int ifindex);
-diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 218b058..91fe6a3 100644
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -1695,7 +1695,7 @@ static inline pid_t task_tgid_vnr(struct task_struct *tsk)
- }
-
-
--static int pid_alive(const struct task_struct *p);
-+static inline int pid_alive(const struct task_struct *p);
- static inline pid_t task_ppid_nr_ns(const struct task_struct *tsk, struct pid_namespace *ns)
- {
- pid_t pid = 0;
-diff --git a/include/net/ip.h b/include/net/ip.h
-index 3446cdd..5128fa7 100644
---- a/include/net/ip.h
-+++ b/include/net/ip.h
-@@ -407,22 +407,6 @@ static __inline__ void inet_reset_saddr(struct sock *sk)
-
- #endif
-
--static inline int sk_mc_loop(struct sock *sk)
--{
-- if (!sk)
-- return 1;
-- switch (sk->sk_family) {
-- case AF_INET:
-- return inet_sk(sk)->mc_loop;
--#if IS_ENABLED(CONFIG_IPV6)
-- case AF_INET6:
-- return inet6_sk(sk)->mc_loop;
--#endif
-- }
-- WARN_ON(1);
-- return 1;
--}
--
- bool ip_call_ra_chain(struct sk_buff *skb);
-
- /*
-diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
-index 2e74c6c..ee2d53a 100644
---- a/include/net/ip6_route.h
-+++ b/include/net/ip6_route.h
-@@ -168,7 +168,8 @@ int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
-
- static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
- {
-- struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL;
-+ struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
-+ inet6_sk(skb->sk) : NULL;
-
- return (np && np->pmtudisc >= IPV6_PMTUDISC_PROBE) ?
- skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
-diff --git a/include/net/sock.h b/include/net/sock.h
-index f66b2b1..0c79a74 100644
---- a/include/net/sock.h
-+++ b/include/net/sock.h
-@@ -1815,6 +1815,8 @@ struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie);
-
- struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie);
-
-+bool sk_mc_loop(struct sock *sk);
-+
- static inline bool sk_can_gso(const struct sock *sk)
- {
- return net_gso_ok(sk->sk_route_caps, sk->sk_gso_type);
-diff --git a/kernel/cgroup.c b/kernel/cgroup.c
-index 550e205..18711f3 100644
---- a/kernel/cgroup.c
-+++ b/kernel/cgroup.c
-@@ -971,7 +971,7 @@ static void cgroup_d_remove_dir(struct dentry *dentry)
- parent = dentry->d_parent;
- spin_lock(&parent->d_lock);
- spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
-- list_del_init(&dentry->d_u.d_child);
-+ list_del_init(&dentry->d_child);
- spin_unlock(&dentry->d_lock);
- spin_unlock(&parent->d_lock);
- remove_dir(dentry);
-diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index 813b021..a2d62b3 100644
---- a/kernel/trace/trace.c
-+++ b/kernel/trace/trace.c
-@@ -6158,7 +6158,7 @@ static int instance_mkdir (struct inode *inode, struct dentry *dentry, umode_t m
- int ret;
-
- /* Paranoid: Make sure the parent is the "instances" directory */
-- parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias);
-+ parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
- if (WARN_ON_ONCE(parent != trace_instance_dir))
- return -ENOENT;
-
-@@ -6185,7 +6185,7 @@ static int instance_rmdir(struct inode *inode, struct dentry *dentry)
- int ret;
-
- /* Paranoid: Make sure the parent is the "instances" directory */
-- parent = hlist_entry(inode->i_dentry.first, struct dentry, d_alias);
-+ parent = hlist_entry(inode->i_dentry.first, struct dentry, d_u.d_alias);
- if (WARN_ON_ONCE(parent != trace_instance_dir))
- return -ENOENT;
-
-diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
-index e4c4efc..c6646a5 100644
---- a/kernel/trace/trace_events.c
-+++ b/kernel/trace/trace_events.c
-@@ -428,7 +428,7 @@ static void remove_event_file_dir(struct ftrace_event_file *file)
-
- if (dir) {
- spin_lock(&dir->d_lock); /* probably unneeded */
-- list_for_each_entry(child, &dir->d_subdirs, d_u.d_child) {
-+ list_for_each_entry(child, &dir->d_subdirs, d_child) {
- if (child->d_inode) /* probably unneeded */
- child->d_inode->i_private = NULL;
- }
-diff --git a/mm/ksm.c b/mm/ksm.c
-index 68710e8..5e706e3 100644
---- a/mm/ksm.c
-+++ b/mm/ksm.c
-@@ -376,7 +376,7 @@ static int break_ksm(struct vm_area_struct *vma, unsigned long addr)
- else
- ret = VM_FAULT_WRITE;
- put_page(page);
-- } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_OOM)));
-+ } while (!(ret & (VM_FAULT_WRITE | VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV | VM_FAULT_OOM)));
- /*
- * We must loop because handle_mm_fault() may back out if there's
- * any difficulty e.g. if pte accessed bit gets updated concurrently.
-diff --git a/mm/memory-failure.c b/mm/memory-failure.c
-index a98c7fc..ffc7bf0 100644
---- a/mm/memory-failure.c
-+++ b/mm/memory-failure.c
-@@ -1645,8 +1645,6 @@ static int __soft_offline_page(struct page *page, int flags)
- * setting PG_hwpoison.
- */
- if (!is_free_buddy_page(page))
-- lru_add_drain_all();
-- if (!is_free_buddy_page(page))
- drain_all_pages();
- SetPageHWPoison(page);
- if (!is_free_buddy_page(page))
-diff --git a/mm/memory.c b/mm/memory.c
-index 102af09..749e1c6 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1836,7 +1836,8 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
- else
- return -EFAULT;
- }
-- if (ret & VM_FAULT_SIGBUS)
-+ if (ret & (VM_FAULT_SIGBUS |
-+ VM_FAULT_SIGSEGV))
- return i ? i : -EFAULT;
- BUG();
- }
-@@ -1946,7 +1947,7 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm,
- return -ENOMEM;
- if (ret & (VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE))
- return -EHWPOISON;
-- if (ret & VM_FAULT_SIGBUS)
-+ if (ret & (VM_FAULT_SIGBUS | VM_FAULT_SIGSEGV))
- return -EFAULT;
- BUG();
- }
-@@ -3235,7 +3236,7 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
-
- /* Check if we need to add a guard page to the stack */
- if (check_stack_guard_page(vma, address) < 0)
-- return VM_FAULT_SIGBUS;
-+ return VM_FAULT_SIGSEGV;
-
- /* Use the zero-page for reads */
- if (!(flags & FAULT_FLAG_WRITE)) {
-diff --git a/net/core/dev.c b/net/core/dev.c
-index f6d8d7f..73abbd7 100644
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -2775,7 +2775,9 @@ static void skb_update_prio(struct sk_buff *skb)
- #define skb_update_prio(skb)
- #endif
-
--static DEFINE_PER_CPU(int, xmit_recursion);
-+DEFINE_PER_CPU(int, xmit_recursion);
-+EXPORT_SYMBOL(xmit_recursion);
-+
- #define RECURSION_LIMIT 10
-
- /**
-diff --git a/net/core/sock.c b/net/core/sock.c
-index c806956..650dd58 100644
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -659,6 +659,25 @@ static inline void sock_valbool_flag(struct sock *sk, int bit, int valbool)
- sock_reset_flag(sk, bit);
- }
-
-+bool sk_mc_loop(struct sock *sk)
-+{
-+ if (dev_recursion_level())
-+ return false;
-+ if (!sk)
-+ return true;
-+ switch (sk->sk_family) {
-+ case AF_INET:
-+ return inet_sk(sk)->mc_loop;
-+#if IS_ENABLED(CONFIG_IPV6)
-+ case AF_INET6:
-+ return inet6_sk(sk)->mc_loop;
-+#endif
-+ }
-+ WARN_ON(1);
-+ return true;
-+}
-+EXPORT_SYMBOL(sk_mc_loop);
-+
- /*
- * This is meant for all protocols to use and covers goings on
- * at the socket level. Everything here is generic.
-diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
-index 2291791..9fbd69e 100644
---- a/net/ipv4/tcp_input.c
-+++ b/net/ipv4/tcp_input.c
-@@ -3064,10 +3064,11 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
- if (seq_rtt < 0) {
- seq_rtt = ca_seq_rtt;
- }
-- if (!(sacked & TCPCB_SACKED_ACKED))
-+ if (!(sacked & TCPCB_SACKED_ACKED)) {
- reord = min(pkts_acked, reord);
-- if (!after(scb->end_seq, tp->high_seq))
-- flag |= FLAG_ORIG_SACK_ACKED;
-+ if (!after(scb->end_seq, tp->high_seq))
-+ flag |= FLAG_ORIG_SACK_ACKED;
-+ }
- }
-
- if (sacked & TCPCB_SACKED_ACKED)
-diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
-index b7effad..e2f8bd0 100644
---- a/net/ipv4/tcp_ipv4.c
-+++ b/net/ipv4/tcp_ipv4.c
-@@ -1875,7 +1875,7 @@ void tcp_v4_early_demux(struct sk_buff *skb)
- skb->sk = sk;
- skb->destructor = sock_edemux;
- if (sk->sk_state != TCP_TIME_WAIT) {
-- struct dst_entry *dst = sk->sk_rx_dst;
-+ struct dst_entry *dst = ACCESS_ONCE(sk->sk_rx_dst);
-
- if (dst)
- dst = dst_check(dst, 0);
-diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
-index 96f64e5..8c70c73 100644
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -2796,6 +2796,8 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
- }
- #endif
-
-+ /* Do not fool tcpdump (if any), clean our debris */
-+ skb->tstamp.tv64 = 0;
- return skb;
- }
- EXPORT_SYMBOL(tcp_make_synack);
-diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
-index d7907ec..066d0b0 100644
---- a/net/ipv6/ip6_output.c
-+++ b/net/ipv6/ip6_output.c
-@@ -555,7 +555,8 @@ int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
- {
- struct sk_buff *frag;
- struct rt6_info *rt = (struct rt6_info*)skb_dst(skb);
-- struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL;
-+ struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
-+ inet6_sk(skb->sk) : NULL;
- struct ipv6hdr *tmp_hdr;
- struct frag_hdr *fh;
- unsigned int mtu, hlen, left, len;
-diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
-index 09a22f4..bcd6518 100644
---- a/net/ipv6/ndisc.c
-+++ b/net/ipv6/ndisc.c
-@@ -1193,7 +1193,14 @@ static void ndisc_router_discovery(struct sk_buff *skb)
- if (rt)
- rt6_set_expires(rt, jiffies + (HZ * lifetime));
- if (ra_msg->icmph.icmp6_hop_limit) {
-- in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
-+ /* Only set hop_limit on the interface if it is higher than
-+ * the current hop_limit.
-+ */
-+ if (in6_dev->cnf.hop_limit < ra_msg->icmph.icmp6_hop_limit) {
-+ in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
-+ } else {
-+ ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than current\n");
-+ }
- if (rt)
- dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
- ra_msg->icmph.icmp6_hop_limit);
-diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
-index a4f890d..9d4332d 100644
---- a/net/ipv6/tcp_ipv6.c
-+++ b/net/ipv6/tcp_ipv6.c
-@@ -1633,7 +1633,7 @@ static void tcp_v6_early_demux(struct sk_buff *skb)
- skb->sk = sk;
- skb->destructor = sock_edemux;
- if (sk->sk_state != TCP_TIME_WAIT) {
-- struct dst_entry *dst = sk->sk_rx_dst;
-+ struct dst_entry *dst = ACCESS_ONCE(sk->sk_rx_dst);
-
- if (dst)
- dst = dst_check(dst, inet6_sk(sk)->rx_dst_cookie);
-diff --git a/net/netfilter/nf_conntrack_proto_generic.c b/net/netfilter/nf_conntrack_proto_generic.c
-index d25f293..957c1db 100644
---- a/net/netfilter/nf_conntrack_proto_generic.c
-+++ b/net/netfilter/nf_conntrack_proto_generic.c
-@@ -14,6 +14,30 @@
-
- static unsigned int nf_ct_generic_timeout __read_mostly = 600*HZ;
-
-+static bool nf_generic_should_process(u8 proto)
-+{
-+ switch (proto) {
-+#ifdef CONFIG_NF_CT_PROTO_SCTP_MODULE
-+ case IPPROTO_SCTP:
-+ return false;
-+#endif
-+#ifdef CONFIG_NF_CT_PROTO_DCCP_MODULE
-+ case IPPROTO_DCCP:
-+ return false;
-+#endif
-+#ifdef CONFIG_NF_CT_PROTO_GRE_MODULE
-+ case IPPROTO_GRE:
-+ return false;
-+#endif
-+#ifdef CONFIG_NF_CT_PROTO_UDPLITE_MODULE
-+ case IPPROTO_UDPLITE:
-+ return false;
-+#endif
-+ default:
-+ return true;
-+ }
-+}
-+
- static inline struct nf_generic_net *generic_pernet(struct net *net)
- {
- return &net->ct.nf_ct_proto.generic;
-@@ -67,7 +91,7 @@ static int generic_packet(struct nf_conn *ct,
- static bool generic_new(struct nf_conn *ct, const struct sk_buff *skb,
- unsigned int dataoff, unsigned int *timeouts)
- {
-- return true;
-+ return nf_generic_should_process(nf_ct_protonum(ct));
- }
-
- #if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)
-diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
-index 6c4cbd9..fc68bf6 100644
---- a/security/selinux/selinuxfs.c
-+++ b/security/selinux/selinuxfs.c
-@@ -1200,7 +1200,7 @@ static void sel_remove_entries(struct dentry *de)
- spin_lock(&de->d_lock);
- node = de->d_subdirs.next;
- while (node != &de->d_subdirs) {
-- struct dentry *d = list_entry(node, struct dentry, d_u.d_child);
-+ struct dentry *d = list_entry(node, struct dentry, d_child);
-
- spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
- list_del_init(node);
-@@ -1674,12 +1674,12 @@ static void sel_remove_classes(void)
-
- list_for_each(class_node, &class_dir->d_subdirs) {
- struct dentry *class_subdir = list_entry(class_node,
-- struct dentry, d_u.d_child);
-+ struct dentry, d_child);
- struct list_head *class_subdir_node;
-
- list_for_each(class_subdir_node, &class_subdir->d_subdirs) {
- struct dentry *d = list_entry(class_subdir_node,
-- struct dentry, d_u.d_child);
-+ struct dentry, d_child);
-
- if (d->d_inode)
- if (d->d_inode->i_mode & S_IFDIR)