[packages/kernel] - up to 4.3.0; builds on x86_64; untested, so rel 0.1

arekm arekm at pld-linux.org
Wed Nov 11 20:59:00 CET 2015


commit 79b8bda9ad47aabbc62f9933f878976e61a8e183
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Wed Nov 11 20:58:51 2015 +0100

    - up to 4.3.0; builds on x86_64; untested, so rel 0.1

 kernel-aufs4.patch       | 561 ++++++++++++++++++++++++++++-------------------
 kernel-imq.patch         |  57 ++---
 kernel-multiarch.config  | 284 +++++++++++++++++-------
 kernel-small_fixes.patch |  70 ------
 kernel.spec              |  11 +-
 5 files changed, 583 insertions(+), 400 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 9e438ed..a09995f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -69,9 +69,9 @@
 %define		have_pcmcia	0
 %endif
 
-%define		rel		1
-%define		basever		4.2
-%define		postver		.6
+%define		rel		0.1
+%define		basever		4.3
+%define		postver		.0
 
 # define this to '-%{basever}' for longterm branch
 %define		versuffix	%{nil}
@@ -117,7 +117,7 @@ Epoch:		3
 License:	GPL v2
 Group:		Base/Kernel
 Source0:	http://www.kernel.org/pub/linux/kernel/v4.x/linux-%{basever}.tar.xz
-# Source0-md5:	3d5ea06d767e2f35c999eeadafc76523
+# Source0-md5:	58b35794eee3b6d52ce7be39357801e7
 %if "%{postver}" != ".0"
 Patch0:		http://www.kernel.org/pub/linux/kernel/v4.x/patch-%{version}.xz
 # Patch0-md5:	408f9975969da326b5804a04dbf0d4de
@@ -200,7 +200,7 @@ Patch101:	kernel-vserver-fixes.patch
 # Patch creation:
 # git clone git://github.com/sfjro/aufs4-standalone.git
 # cd aufs4-standalone
-# git checkout -b aufs4.1 origin/aufs4.1
+# git checkout -b aufs4.3 origin/aufs4.3
 # cat aufs4-kbuild.patch aufs4-base.patch aufs4-mmap.patch aufs4-standalone.patch > ~/rpm/packages/kernel/kernel-aufs4.patch
 # mkdir linux
 # cp -a Documentation fs include linux
@@ -1487,6 +1487,7 @@ fi
 %exclude %{_kernelsrcdir}/drivers/lguest/lg.h
 %exclude %{_kernelsrcdir}/drivers/media/pci/bt8xx/bttv.h
 %{_kernelsrcdir}/block
+%{_kernelsrcdir}/certs
 %{_kernelsrcdir}/crypto
 %{_kernelsrcdir}/drivers
 %{_kernelsrcdir}/firmware
diff --git a/kernel-aufs4.patch b/kernel-aufs4.patch
index 8ab7d27..b69df80 100644
--- a/kernel-aufs4.patch
+++ b/kernel-aufs4.patch
@@ -1,10 +1,10 @@
-aufs4.x-rcN kbuild patch
+aufs4.3 kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
-index 011f433..b1083f6 100644
+index da3f32f..b9879fe 100644
 --- a/fs/Kconfig
 +++ b/fs/Kconfig
-@@ -218,6 +218,7 @@ source "fs/pstore/Kconfig"
+@@ -215,6 +215,7 @@ source "fs/pstore/Kconfig"
  source "fs/sysv/Kconfig"
  source "fs/ufs/Kconfig"
  source "fs/exofs/Kconfig"
@@ -13,16 +13,16 @@ index 011f433..b1083f6 100644
  endif # MISC_FILESYSTEMS
  
 diff --git a/fs/Makefile b/fs/Makefile
-index cb20e4b..dd81418 100644
+index f79cf40..7562a4d 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
-@@ -126,3 +126,4 @@ obj-y				+= exofs/ # Multiple modules
+@@ -125,3 +125,4 @@ obj-y				+= exofs/ # Multiple modules
  obj-$(CONFIG_CEPH_FS)		+= ceph/
  obj-$(CONFIG_PSTORE)		+= pstore/
  obj-$(CONFIG_EFIVAR_FS)		+= efivarfs/
 +obj-$(CONFIG_AUFS_FS)           += aufs/
 diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
-index 1ff9942..31efc0a 100644
+index f7b2db4..47098aed 100644
 --- a/include/uapi/linux/Kbuild
 +++ b/include/uapi/linux/Kbuild
 @@ -59,6 +59,7 @@ header-y += atmsvc.h
@@ -33,13 +33,13 @@ index 1ff9942..31efc0a 100644
  header-y += auto_fs4.h
  header-y += auto_fs.h
  header-y += auxvec.h
-aufs4.x-rcN base patch
+aufs4.3 base patch
 
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 8133cef..04beb19 100644
+index 747c653..53ecc33 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -1939,6 +1939,19 @@ F:	include/linux/audit.h
+@@ -1985,6 +1985,19 @@ F:	include/linux/audit.h
  F:	include/uapi/linux/audit.h
  F:	kernel/audit*
  
@@ -60,7 +60,7 @@ index 8133cef..04beb19 100644
  M:	Miguel Ojeda Sandonis <miguel.ojeda.sandonis at gmail.com>
  W:	http://miguelojeda.es/auxdisplay.htm
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index f7a4c9d..23103ad 100644
+index 674f800a..291ec9e 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
 @@ -560,6 +560,24 @@ static inline int is_loop_device(struct file *file)
@@ -89,10 +89,10 @@ index f7a4c9d..23103ad 100644
  
  static ssize_t loop_attr_show(struct device *dev, char *page,
 diff --git a/fs/dcache.c b/fs/dcache.c
-index 7a3f3e5..0b40298 100644
+index 5c33aeb..8aa7f26 100644
 --- a/fs/dcache.c
 +++ b/fs/dcache.c
-@@ -1164,7 +1164,7 @@ enum d_walk_ret {
+@@ -1167,7 +1167,7 @@ enum d_walk_ret {
   *
   * The @enter() and @finish() callbacks are called with d_lock held.
   */
@@ -175,10 +175,10 @@ index f87d308..9a290b3 100644
  static inline void fput_light(struct file *file, int fput_needed)
  {
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index a0653e5..86080ea 100644
+index 72d8a84..fabd9d7a 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -1661,6 +1661,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
+@@ -1687,6 +1687,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
  			      struct iovec *fast_pointer,
  			      struct iovec **ret_pointer);
  
@@ -206,10 +206,10 @@ index da2751d..2e0fca6 100644
 +			 struct pipe_inode_info *pipe, size_t len,
 +			 unsigned int flags);
  #endif
-aufs4.x-rcN mmap patch
+aufs4.3 mmap patch
 
 diff --git a/fs/buffer.c b/fs/buffer.c
-index 1cf7a53..076aff86 100644
+index 82283ab..477e5f3 100644
 --- a/fs/buffer.c
 +++ b/fs/buffer.c
 @@ -2473,7 +2473,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
@@ -222,10 +222,10 @@ index 1cf7a53..076aff86 100644
  	ret = __block_page_mkwrite(vma, vmf, get_block);
  	sb_end_pagefault(sb);
 diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 87782e8..b287e64 100644
+index b25eee4..c83d588 100644
 --- a/fs/proc/base.c
 +++ b/fs/proc/base.c
-@@ -1934,7 +1934,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
+@@ -1914,7 +1914,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
  	down_read(&mm->mmap_sem);
  	vma = find_exact_vma(mm, vm_start, vm_end);
  	if (vma && vma->vm_file) {
@@ -251,10 +251,10 @@ index f8595e8..cb8eda0 100644
  		ino = inode->i_ino;
  	}
 diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index ca1e091..8940e47 100644
+index e2d46ad..5e7e631 100644
 --- a/fs/proc/task_mmu.c
 +++ b/fs/proc/task_mmu.c
-@@ -279,7 +279,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
+@@ -280,7 +280,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
  	const char *name = NULL;
  
  	if (file) {
@@ -266,7 +266,7 @@ index ca1e091..8940e47 100644
  		dev = inode->i_sb->s_dev;
  		ino = inode->i_ino;
  		pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
-@@ -1479,7 +1482,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
+@@ -1465,7 +1468,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
  	struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
  	struct vm_area_struct *vma = v;
  	struct numa_maps *md = &numa_priv->md;
@@ -292,10 +292,10 @@ index e0d64c9..7aa92db 100644
  		ino = inode->i_ino;
  		pgoff = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
 diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 2e872f9..2494ed2 100644
+index 80001de..9248b97 100644
 --- a/include/linux/mm.h
 +++ b/include/linux/mm.h
-@@ -1173,6 +1173,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
+@@ -1211,6 +1211,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
  }
  #endif
  
@@ -325,10 +325,10 @@ index 2e872f9..2494ed2 100644
  extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
  		void *buf, int len, int write);
 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
-index 0038ac7..409940d 100644
+index 3d6baa7..750ca95 100644
 --- a/include/linux/mm_types.h
 +++ b/include/linux/mm_types.h
-@@ -259,6 +259,7 @@ struct vm_region {
+@@ -250,6 +250,7 @@ struct vm_region {
  	unsigned long	vm_top;		/* region allocated to here */
  	unsigned long	vm_pgoff;	/* the offset in vm_file corresponding to vm_start */
  	struct file	*vm_file;	/* the backing file or NULL */
@@ -336,7 +336,7 @@ index 0038ac7..409940d 100644
  
  	int		vm_usage;	/* region usage count (access under nommu_region_sem) */
  	bool		vm_icache_flushed : 1; /* true if the icache has been flushed for
-@@ -323,6 +324,7 @@ struct vm_area_struct {
+@@ -324,6 +325,7 @@ struct vm_area_struct {
  	unsigned long vm_pgoff;		/* Offset (within vm_file) in PAGE_SIZE
  					   units, *not* PAGE_CACHE_SIZE */
  	struct file * vm_file;		/* File we map to (can be NULL). */
@@ -345,10 +345,10 @@ index 0038ac7..409940d 100644
  
  #ifndef CONFIG_MMU
 diff --git a/kernel/fork.c b/kernel/fork.c
-index 1bfefc6..a86bd7f 100644
+index 2845623..71004bd 100644
 --- a/kernel/fork.c
 +++ b/kernel/fork.c
-@@ -456,7 +456,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
+@@ -462,7 +462,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
  			struct inode *inode = file_inode(file);
  			struct address_space *mapping = file->f_mapping;
  
@@ -358,7 +358,7 @@ index 1bfefc6..a86bd7f 100644
  				atomic_dec(&inode->i_writecount);
  			i_mmap_lock_write(mapping);
 diff --git a/mm/Makefile b/mm/Makefile
-index 98c4eae..3f0c9b9 100644
+index 2ed4319..e3a53f5 100644
 --- a/mm/Makefile
 +++ b/mm/Makefile
 @@ -21,7 +21,7 @@ obj-y			:= filemap.o mempool.o oom_kill.o \
@@ -371,7 +371,7 @@ index 98c4eae..3f0c9b9 100644
  obj-y += init-mm.o
  
 diff --git a/mm/filemap.c b/mm/filemap.c
-index 1283fc8..128f18f 100644
+index 327910c..7bbc372 100644
 --- a/mm/filemap.c
 +++ b/mm/filemap.c
 @@ -2089,7 +2089,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
@@ -384,10 +384,10 @@ index 1283fc8..128f18f 100644
  	if (page->mapping != inode->i_mapping) {
  		unlock_page(page);
 diff --git a/mm/memory.c b/mm/memory.c
-index a84fbb7..13973d2 100644
+index deb679c..df2ce3e 100644
 --- a/mm/memory.c
 +++ b/mm/memory.c
-@@ -2034,7 +2034,7 @@ static inline int wp_page_reuse(struct mm_struct *mm,
+@@ -2035,7 +2035,7 @@ static inline int wp_page_reuse(struct mm_struct *mm,
  		}
  
  		if (!page_mkwrite)
@@ -397,10 +397,10 @@ index a84fbb7..13973d2 100644
  
  	return VM_FAULT_WRITE;
 diff --git a/mm/mmap.c b/mm/mmap.c
-index aa632ad..3ff75d3 100644
+index 79bcc9f..da28c8a 100644
 --- a/mm/mmap.c
 +++ b/mm/mmap.c
-@@ -274,7 +274,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
+@@ -275,7 +275,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
  	if (vma->vm_ops && vma->vm_ops->close)
  		vma->vm_ops->close(vma);
  	if (vma->vm_file)
@@ -409,7 +409,7 @@ index aa632ad..3ff75d3 100644
  	mpol_put(vma_policy(vma));
  	kmem_cache_free(vm_area_cachep, vma);
  	return next;
-@@ -886,7 +886,7 @@ again:			remove_next = 1 + (end > next->vm_end);
+@@ -887,7 +887,7 @@ again:			remove_next = 1 + (end > next->vm_end);
  	if (remove_next) {
  		if (file) {
  			uprobe_munmap(next, next->vm_start, next->vm_end);
@@ -418,7 +418,7 @@ index aa632ad..3ff75d3 100644
  		}
  		if (next->anon_vma)
  			anon_vma_merge(vma, next);
-@@ -1671,8 +1671,8 @@ out:
+@@ -1683,8 +1683,8 @@ out:
  	return addr;
  
  unmap_and_free_vma:
@@ -428,7 +428,7 @@ index aa632ad..3ff75d3 100644
  
  	/* Undo any partial mapping done by a device driver. */
  	unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end);
-@@ -2473,7 +2473,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2485,7 +2485,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
  		goto out_free_mpol;
  
  	if (new->vm_file)
@@ -437,7 +437,7 @@ index aa632ad..3ff75d3 100644
  
  	if (new->vm_ops && new->vm_ops->open)
  		new->vm_ops->open(new);
-@@ -2492,7 +2492,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -2504,7 +2504,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
  	if (new->vm_ops && new->vm_ops->close)
  		new->vm_ops->close(new);
  	if (new->vm_file)
@@ -446,7 +446,7 @@ index aa632ad..3ff75d3 100644
  	unlink_anon_vmas(new);
   out_free_mpol:
  	mpol_put(vma_policy(new));
-@@ -2635,7 +2635,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -2646,7 +2646,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
  	struct vm_area_struct *vma;
  	unsigned long populate = 0;
  	unsigned long ret = -EINVAL;
@@ -454,7 +454,7 @@ index aa632ad..3ff75d3 100644
  
  	pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. "
  			"See Documentation/vm/remap_file_pages.txt.\n",
-@@ -2679,10 +2678,10 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
+@@ -2690,10 +2689,10 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
  		munlock_vma_pages_range(vma, start, start + size);
  	}
  
@@ -467,17 +467,17 @@ index aa632ad..3ff75d3 100644
  out:
  	up_write(&mm->mmap_sem);
  	if (populate)
-@@ -2949,7 +2948,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
- 			if (anon_vma_clone(new_vma, vma))
- 				goto out_free_mempol;
- 			if (new_vma->vm_file)
--				get_file(new_vma->vm_file);
-+				vma_get_file(new_vma);
- 			if (new_vma->vm_ops && new_vma->vm_ops->open)
- 				new_vma->vm_ops->open(new_vma);
- 			vma_link(mm, new_vma, prev, rb_link, rb_parent);
+@@ -2963,7 +2962,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
+ 		if (anon_vma_clone(new_vma, vma))
+ 			goto out_free_mempol;
+ 		if (new_vma->vm_file)
+-			get_file(new_vma->vm_file);
++			vma_get_file(new_vma);
+ 		if (new_vma->vm_ops && new_vma->vm_ops->open)
+ 			new_vma->vm_ops->open(new_vma);
+ 		vma_link(mm, new_vma, prev, rb_link, rb_parent);
 diff --git a/mm/nommu.c b/mm/nommu.c
-index 58ea364..f937b7e 100644
+index ab14a20..fffc566 100644
 --- a/mm/nommu.c
 +++ b/mm/nommu.c
 @@ -671,7 +671,7 @@ static void __put_nommu_region(struct vm_region *region)
@@ -498,7 +498,7 @@ index 58ea364..f937b7e 100644
  	put_nommu_region(vma->vm_region);
  	kmem_cache_free(vm_area_cachep, vma);
  }
-@@ -1354,7 +1354,7 @@ unsigned long do_mmap_pgoff(struct file *file,
+@@ -1355,7 +1355,7 @@ unsigned long do_mmap(struct file *file,
  					goto error_just_free;
  				}
  			}
@@ -507,7 +507,7 @@ index 58ea364..f937b7e 100644
  			kmem_cache_free(vm_region_jar, region);
  			region = pregion;
  			result = start;
-@@ -1429,10 +1429,10 @@ error_just_free:
+@@ -1430,10 +1430,10 @@ error_just_free:
  	up_write(&nommu_region_sem);
  error:
  	if (region->vm_file)
@@ -612,13 +612,13 @@ index 0000000..b323b8a
 +		fput(pr);
 +}
 +#endif /* !CONFIG_MMU */
-aufs4.x-rcN standalone patch
+aufs4.3 standalone patch
 
 diff --git a/fs/dcache.c b/fs/dcache.c
-index 0b40298..4844e61 100644
+index 8aa7f26..f997345 100644
 --- a/fs/dcache.c
 +++ b/fs/dcache.c
-@@ -1269,6 +1269,7 @@ rename_retry:
+@@ -1272,6 +1272,7 @@ rename_retry:
  	seq = 1;
  	goto again;
  }
@@ -626,11 +626,23 @@ index 0b40298..4844e61 100644
  
  /*
   * Search for at least 1 mount point in the dentry's subdirs.
+diff --git a/fs/exec.c b/fs/exec.c
+index b06623a..b9206c5 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -103,6 +103,7 @@ bool path_noexec(const struct path *path)
+ 	return (path->mnt->mnt_flags & MNT_NOEXEC) ||
+ 	       (path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
+ }
++EXPORT_SYMBOL(path_noexec);
+ 
+ #ifdef CONFIG_USELIB
+ /*
 diff --git a/fs/file_table.c b/fs/file_table.c
-index 7f9d407..8c9ec1d 100644
+index ad17e05..df66450 100644
 --- a/fs/file_table.c
 +++ b/fs/file_table.c
-@@ -146,6 +146,7 @@ over:
+@@ -147,6 +147,7 @@ over:
  	}
  	return ERR_PTR(-ENFILE);
  }
@@ -638,28 +650,16 @@ index 7f9d407..8c9ec1d 100644
  
  /**
   * alloc_file - allocate and initialize a 'struct file'
-@@ -307,6 +308,7 @@ void put_filp(struct file *file)
+@@ -308,6 +309,7 @@ void put_filp(struct file *file)
  		file_free(file);
  	}
  }
 +EXPORT_SYMBOL(put_filp);
  
- void __init files_init(unsigned long mempages)
+ void __init files_init(void)
  { 
-diff --git a/fs/inode.c b/fs/inode.c
-index d30640f..1ecc715 100644
---- a/fs/inode.c
-+++ b/fs/inode.c
-@@ -58,6 +58,7 @@ static struct hlist_head *inode_hashtable __read_mostly;
- static __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_hash_lock);
- 
- __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_sb_list_lock);
-+EXPORT_SYMBOL(inode_sb_list_lock);
- 
- /*
-  * Empty aops. Can be used for the cases where the user does not
 diff --git a/fs/namespace.c b/fs/namespace.c
-index c7cb8a5..08723de 100644
+index 0570729..ec560d8 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
 @@ -463,6 +463,7 @@ void __mnt_drop_write(struct vfsmount *mnt)
@@ -670,7 +670,7 @@ index c7cb8a5..08723de 100644
  
  /**
   * mnt_drop_write - give up write access to a mount
-@@ -1779,6 +1780,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -1803,6 +1804,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
  	}
  	return 0;
  }
@@ -715,7 +715,7 @@ index d16b62c..06ca6bc 100644
  int fsnotify_fasync(int fd, struct file *file, int on)
  {
 diff --git a/fs/notify/mark.c b/fs/notify/mark.c
-index 92e48c7..d2c4b68 100644
+index fc0df44..325b5c6 100644
 --- a/fs/notify/mark.c
 +++ b/fs/notify/mark.c
 @@ -109,6 +109,7 @@ void fsnotify_put_mark(struct fsnotify_mark *mark)
@@ -726,15 +726,15 @@ index 92e48c7..d2c4b68 100644
  
  /* Calculate mask of events for a list of marks */
  u32 fsnotify_recalc_mask(struct hlist_head *head)
-@@ -202,6 +203,7 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark,
- 	fsnotify_destroy_mark_locked(mark, group);
+@@ -208,6 +209,7 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark,
  	mutex_unlock(&group->mark_mutex);
+ 	fsnotify_free_mark(mark);
  }
 +EXPORT_SYMBOL(fsnotify_destroy_mark);
  
- /*
-  * Destroy all marks in the given list. The marks must be already detached from
-@@ -376,6 +378,7 @@ err:
+ void fsnotify_destroy_marks(struct hlist_head *head, spinlock_t *lock)
+ {
+@@ -392,6 +394,7 @@ err:
  
  	return ret;
  }
@@ -742,7 +742,7 @@ index 92e48c7..d2c4b68 100644
  
  int fsnotify_add_mark(struct fsnotify_mark *mark, struct fsnotify_group *group,
  		      struct inode *inode, struct vfsmount *mnt, int allow_dups)
-@@ -455,6 +458,7 @@ void fsnotify_init_mark(struct fsnotify_mark *mark,
+@@ -492,6 +495,7 @@ void fsnotify_init_mark(struct fsnotify_mark *mark,
  	atomic_set(&mark->refcnt, 1);
  	mark->free_mark = free_mark;
  }
@@ -751,7 +751,7 @@ index 92e48c7..d2c4b68 100644
  static int fsnotify_mark_destroy(void *ignored)
  {
 diff --git a/fs/open.c b/fs/open.c
-index e33dab2..b84b828 100644
+index b6f1e96..4ab0d4e 100644
 --- a/fs/open.c
 +++ b/fs/open.c
 @@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
@@ -823,10 +823,10 @@ index 072fee1..a7677af 100644
  /* Compare an extended attribute value with the given value */
  int vfs_xattr_cmp(struct dentry *dentry, const char *xattr_name,
 diff --git a/security/commoncap.c b/security/commoncap.c
-index d103f5a4..393654e 100644
+index 1832cf7..987ff5f 100644
 --- a/security/commoncap.c
 +++ b/security/commoncap.c
-@@ -970,12 +970,14 @@ int cap_mmap_addr(unsigned long addr)
+@@ -1053,12 +1053,14 @@ int cap_mmap_addr(unsigned long addr)
  	}
  	return ret;
  }
@@ -842,7 +842,7 @@ index d103f5a4..393654e 100644
  #ifdef CONFIG_SECURITY
  
 diff --git a/security/device_cgroup.c b/security/device_cgroup.c
-index 188c1d2..426d9af 100644
+index 03c1652..b00aa76 100644
 --- a/security/device_cgroup.c
 +++ b/security/device_cgroup.c
 @@ -7,6 +7,7 @@
@@ -862,10 +862,10 @@ index 188c1d2..426d9af 100644
  int devcgroup_inode_mknod(int mode, dev_t dev)
  {
 diff --git a/security/security.c b/security/security.c
-index 595fffa..346bad6 100644
+index 46f405c..54488b0 100644
 --- a/security/security.c
 +++ b/security/security.c
-@@ -438,6 +438,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
+@@ -433,6 +433,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
  		return 0;
  	return call_int_hook(path_rmdir, 0, dir, dentry);
  }
@@ -873,7 +873,7 @@ index 595fffa..346bad6 100644
  
  int security_path_unlink(struct path *dir, struct dentry *dentry)
  {
-@@ -454,6 +455,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
+@@ -449,6 +450,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
  		return 0;
  	return call_int_hook(path_symlink, 0, dir, dentry, old_name);
  }
@@ -881,7 +881,7 @@ index 595fffa..346bad6 100644
  
  int security_path_link(struct dentry *old_dentry, struct path *new_dir,
  		       struct dentry *new_dentry)
-@@ -462,6 +464,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
+@@ -457,6 +459,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
  		return 0;
  	return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
  }
@@ -889,7 +889,7 @@ index 595fffa..346bad6 100644
  
  int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
  			 struct path *new_dir, struct dentry *new_dentry,
-@@ -489,6 +492,7 @@ int security_path_truncate(struct path *path)
+@@ -484,6 +487,7 @@ int security_path_truncate(struct path *path)
  		return 0;
  	return call_int_hook(path_truncate, 0, path);
  }
@@ -897,7 +897,7 @@ index 595fffa..346bad6 100644
  
  int security_path_chmod(struct path *path, umode_t mode)
  {
-@@ -496,6 +500,7 @@ int security_path_chmod(struct path *path, umode_t mode)
+@@ -491,6 +495,7 @@ int security_path_chmod(struct path *path, umode_t mode)
  		return 0;
  	return call_int_hook(path_chmod, 0, path, mode);
  }
@@ -905,7 +905,7 @@ index 595fffa..346bad6 100644
  
  int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
  {
-@@ -503,6 +508,7 @@ int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
+@@ -498,6 +503,7 @@ int security_path_chown(struct path *path, kuid_t uid, kgid_t gid)
  		return 0;
  	return call_int_hook(path_chown, 0, path, uid, gid);
  }
@@ -913,7 +913,7 @@ index 595fffa..346bad6 100644
  
  int security_path_chroot(struct path *path)
  {
-@@ -588,6 +594,7 @@ int security_inode_readlink(struct dentry *dentry)
+@@ -583,6 +589,7 @@ int security_inode_readlink(struct dentry *dentry)
  		return 0;
  	return call_int_hook(inode_readlink, 0, dentry);
  }
@@ -921,7 +921,7 @@ index 595fffa..346bad6 100644
  
  int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
  			       bool rcu)
-@@ -603,6 +610,7 @@ int security_inode_permission(struct inode *inode, int mask)
+@@ -598,6 +605,7 @@ int security_inode_permission(struct inode *inode, int mask)
  		return 0;
  	return call_int_hook(inode_permission, 0, inode, mask);
  }
@@ -929,7 +929,7 @@ index 595fffa..346bad6 100644
  
  int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
  {
-@@ -741,6 +749,7 @@ int security_file_permission(struct file *file, int mask)
+@@ -736,6 +744,7 @@ int security_file_permission(struct file *file, int mask)
  
  	return fsnotify_perm(file, mask);
  }
@@ -937,7 +937,7 @@ index 595fffa..346bad6 100644
  
  int security_file_alloc(struct file *file)
  {
-@@ -800,6 +809,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
+@@ -795,6 +804,7 @@ int security_mmap_file(struct file *file, unsigned long prot,
  		return ret;
  	return ima_file_mmap(file, prot);
  }
@@ -2743,8 +2743,8 @@ diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
 +#endif /* __AUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 --- /usr/share/empty/fs/aufs/branch.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.c	2015-09-24 10:47:58.248052907 +0200
-@@ -0,0 +1,1414 @@
++++ linux/fs/aufs/branch.c	2015-11-11 17:21:46.915530388 +0100
+@@ -0,0 +1,1413 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -3301,7 +3301,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+static unsigned long long au_farray_cb(void *a,
++static unsigned long long au_farray_cb(struct super_block *sb, void *a,
 +				       unsigned long long max __maybe_unused,
 +				       void *arg)
 +{
@@ -3309,7 +3309,6 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +	struct file **p, *f;
 +	struct au_sphlhead *files;
 +	struct au_finfo *finfo;
-+	struct super_block *sb = arg;
 +
 +	n = 0;
 +	p = a;
@@ -3334,7 +3333,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +				     unsigned long long *max)
 +{
 +	*max = atomic_long_read(&au_sbi(sb)->si_nfiles);
-+	return au_array_alloc(max, au_farray_cb, sb);
++	return au_array_alloc(max, au_farray_cb, sb, /*arg*/NULL);
 +}
 +
 +static void au_farray_free(struct file **a, unsigned long long max)
@@ -3732,8 +3731,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +	au_br_do_free(br);
 +}
 +
-+static unsigned long long empty_cb(void *array, unsigned long long max,
-+				   void *arg)
++static unsigned long long empty_cb(struct super_block *sb, void *array,
++				   unsigned long long max, void *arg)
 +{
 +	return max;
 +}
@@ -3778,7 +3777,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +	br_id = br->br_id;
 +	opened = atomic_read(&br->br_count);
 +	if (unlikely(opened)) {
-+		to_free = au_array_alloc(&opened, empty_cb, NULL);
++		to_free = au_array_alloc(&opened, empty_cb, sb, NULL);
 +		err = PTR_ERR(to_free);
 +		if (IS_ERR(to_free))
 +			goto out;
@@ -4161,7 +4160,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +}
 diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 --- /usr/share/empty/fs/aufs/branch.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.h	2015-09-24 10:47:58.248052907 +0200
++++ linux/fs/aufs/branch.h	2015-11-11 17:21:46.915530388 +0100
 @@ -0,0 +1,279 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -4321,7 +4320,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 +
 +	err = 0;
 +	exec_flag = oflag & __FMODE_EXEC;
-+	if (unlikely(exec_flag && (au_br_mnt(br)->mnt_flags & MNT_NOEXEC)))
++	if (unlikely(exec_flag && path_noexec(&br->br_path)))
 +		err = -EACCES;
 +
 +	return err;
@@ -4486,7 +4485,7 @@ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
 +-include ${srctree}/${src}/conf_priv.mk
 diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 --- /usr/share/empty/fs/aufs/cpup.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.c	2015-09-24 10:47:58.248052907 +0200
++++ linux/fs/aufs/cpup.c	2015-11-11 17:21:46.915530388 +0100
 @@ -0,0 +1,1319 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -5213,9 +5212,9 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +				goto out_parent;
 +			if (unlikely(d_is_negative(h_src))) {
 +				err = -EIO;
-+				AuIOErr("i%lu exists on a upper branch "
++				AuIOErr("i%lu exists on b%d "
 +					"but not pseudo-linked\n",
-+					inode->i_ino);
++					inode->i_ino, cpg->bdst);
 +				dput(h_src);
 +				goto out_parent;
 +			}
@@ -7436,8 +7435,8 @@ diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
 +#endif /* __AUFS_DEBUG_H__ */
 diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 --- /usr/share/empty/fs/aufs/dentry.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.c	2015-09-24 10:47:58.251386326 +0200
-@@ -0,0 +1,1105 @@
++++ linux/fs/aufs/dentry.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,1136 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -7632,7 +7631,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +		if (dirperm1)
 +			au_fset_lkup(args.flags, IGNORE_PERM);
 +
-+		if (au_dbwh(dentry) >= 0)
++		if (au_dbwh(dentry) == bindex)
 +			break;
 +		if (!h_dentry)
 +			continue;
@@ -8138,6 +8137,28 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +	return err;
 +}
 +
++void au_refresh_dop(struct dentry *dentry, int force_reval)
++{
++	const struct dentry_operations *dop
++		= force_reval ? &aufs_dop : dentry->d_sb->s_d_op;
++	static const unsigned int mask
++		= DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE;
++
++	BUILD_BUG_ON(sizeof(mask) != sizeof(dentry->d_flags));
++
++	if (dentry->d_op == dop)
++		return;
++
++	AuDbg("%pd\n", dentry);
++	spin_lock(&dentry->d_lock);
++	if (dop == &aufs_dop)
++		dentry->d_flags |= mask;
++	else
++		dentry->d_flags &= ~mask;
++	dentry->d_op = dop;
++	spin_unlock(&dentry->d_lock);
++}
++
 +int au_refresh_dentry(struct dentry *dentry, struct dentry *parent)
 +{
 +	int err, ebrange;
@@ -8493,8 +8514,10 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +	if (!(flags & (LOOKUP_OPEN | LOOKUP_EMPTY))
 +	    && inode
 +	    && !(inode->i_state && I_LINKABLE)
-+	    && (IS_DEADDIR(inode) || !inode->i_nlink))
++	    && (IS_DEADDIR(inode) || !inode->i_nlink)) {
++		AuTraceErr(err);
 +		goto out_inval;
++	}
 +
 +	do_udba = !au_opt_test(au_mntflags(sb), UDBA_NONE);
 +	if (do_udba && inode) {
@@ -8503,8 +8526,10 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +
 +		if (bstart >= 0) {
 +			h_inode = au_h_iptr(inode, bstart);
-+			if (h_inode && au_test_higen(inode, h_inode))
++			if (h_inode && au_test_higen(inode, h_inode)) {
++				AuTraceErr(err);
 +				goto out_inval;
++			}
 +		}
 +	}
 +
@@ -8543,10 +8568,15 @@ diff -urN /usr/share/empty/fs/aufs/dentry.c linux/fs/aufs/dentry.c
 +	.d_weak_revalidate	= aufs_d_revalidate,
 +	.d_release		= aufs_d_release
 +};
++
++/* aufs_dop without d_revalidate */
++const struct dentry_operations aufs_dop_noreval = {
++	.d_release		= aufs_d_release
++};
 diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 --- /usr/share/empty/fs/aufs/dentry.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dentry.h	2015-09-24 10:47:58.251386326 +0200
-@@ -0,0 +1,233 @@
++++ linux/fs/aufs/dentry.h	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,234 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -8593,7 +8623,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +/* ---------------------------------------------------------------------- */
 +
 +/* dentry.c */
-+extern const struct dentry_operations aufs_dop;
++extern const struct dentry_operations aufs_dop, aufs_dop_noreval;
 +struct au_branch;
 +struct dentry *au_sio_lkup_one(struct qstr *name, struct dentry *parent);
 +int au_h_verify(struct dentry *h_dentry, unsigned int udba, struct inode *h_dir,
@@ -8603,6 +8633,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +int au_lkup_neg(struct dentry *dentry, aufs_bindex_t bindex, int wh);
 +int au_refresh_dentry(struct dentry *dentry, struct dentry *parent);
 +int au_reval_dpath(struct dentry *dentry, unsigned int sigen);
++void au_refresh_dop(struct dentry *dentry, int force_reval);
 +
 +/* dinfo.c */
 +void au_di_init_once(void *_di);
@@ -11945,8 +11976,8 @@ diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
 +}
 diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 --- /usr/share/empty/fs/aufs/file.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.c	2015-09-24 10:47:58.251386326 +0200
-@@ -0,0 +1,841 @@
++++ linux/fs/aufs/file.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,844 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -12744,9 +12775,11 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +{ AuUnsupport(); }
 +static int aufs_releasepage(struct page *page, gfp_t gfp)
 +{ AuUnsupport(); return 0; }
++#if 0 /* called by memory compaction regardless file */
 +static int aufs_migratepage(struct address_space *mapping, struct page *newpage,
 +			    struct page *page, enum migrate_mode mode)
 +{ AuUnsupport(); return 0; }
++#endif
 +static int aufs_launder_page(struct page *page)
 +{ AuUnsupport(); return 0; }
 +static int aufs_is_partially_uptodate(struct page *page,
@@ -12779,7 +12812,8 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +	/* no bmap, no block device */
 +	.invalidatepage		= aufs_invalidatepage,
 +	.releasepage		= aufs_releasepage,
-+	.migratepage		= aufs_migratepage,
++	/* is fallback_migrate_page ok? */
++	/* .migratepage		= aufs_migratepage, */
 +	.launder_page		= aufs_launder_page,
 +	.is_partially_uptodate	= aufs_is_partially_uptodate,
 +	.is_dirty_writeback	= aufs_is_dirty_writeback,
@@ -18079,8 +18113,8 @@ diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 +}
 diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 --- /usr/share/empty/fs/aufs/i_op.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,1483 @@
++++ linux/fs/aufs/i_op.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,1482 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -18104,13 +18138,12 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +
 +#include <linux/device_cgroup.h>
 +#include <linux/fs_stack.h>
-+#include <linux/mm.h>
 +#include <linux/namei.h>
 +#include <linux/security.h>
 +#include "aufs.h"
 +
 +static int h_permission(struct inode *h_inode, int mask,
-+			struct vfsmount *h_mnt, int brperm)
++			struct path *h_path, int brperm)
 +{
 +	int err;
 +	const unsigned char write_mask = !!(mask & (MAY_WRITE | MAY_APPEND));
@@ -18119,7 +18152,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +	if ((write_mask && IS_IMMUTABLE(h_inode))
 +	    || ((mask & MAY_EXEC)
 +		&& S_ISREG(h_inode->i_mode)
-+		&& ((h_mnt->mnt_flags & MNT_NOEXEC)
++		&& (path_noexec(h_path)
 +		    || !(h_inode->i_mode & S_IXUGO))))
 +		goto out;
 +
@@ -18204,7 +18237,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +		err = 0;
 +		bindex = au_ibstart(inode);
 +		br = au_sbr(sb, bindex);
-+		err = h_permission(h_inode, mask, au_br_mnt(br), br->br_perm);
++		err = h_permission(h_inode, mask, &br->br_path, br->br_perm);
 +		if (write_mask
 +		    && !err
 +		    && !special_file(h_inode->i_mode)) {
@@ -18230,7 +18263,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +				break;
 +
 +			br = au_sbr(sb, bindex);
-+			err = h_permission(h_inode, mask, au_br_mnt(br),
++			err = h_permission(h_inode, mask, &br->br_path,
 +					   br->br_perm);
 +		}
 +	}
@@ -19380,7 +19413,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +	int err;
 +	aufs_bindex_t bindex;
 +
-+	ret = NULL; /* supress a warning */
++	ret = NULL; /* suppress a warning */
 +	err = aufs_read_lock(dentry, AuLock_IR | AuLock_GEN);
 +	if (unlikely(err))
 +		goto out;
@@ -20080,7 +20113,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 +}
 diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 --- /usr/share/empty/fs/aufs/i_op_ren.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_ren.c	2015-09-24 10:47:58.254719746 +0200
++++ linux/fs/aufs/i_op_ren.c	2015-11-11 17:21:46.918863802 +0100
 @@ -0,0 +1,1017 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -20174,7 +20207,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +/*
 + * functions for reverting.
 + * when an error happened in a single rename systemcall, we should revert
-+ * everything as if nothing happend.
++ * everything as if nothing happened.
 + * we don't need to revert the copied-up/down the parent dir since they are
 + * harmless.
 + */
@@ -20956,7 +20989,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +
 +	/*
 +	 * is it possible?
-+	 * yes, it happend (in linux-3.3-rcN) but I don't know why.
++	 * yes, it happened (in linux-3.3-rcN) but I don't know why.
 +	 * there may exist a problem somewhere else.
 +	 */
 +	err = -EINVAL;
@@ -21290,8 +21323,8 @@ diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
 +endif
 diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
 --- /usr/share/empty/fs/aufs/loop.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/loop.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,145 @@
++++ linux/fs/aufs/loop.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,146 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -21421,7 +21454,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
 +	int err;
 +	struct super_block *sb __maybe_unused;
 +
-+	AuDebugOn(sizeof(sb->s_magic) != sizeof(unsigned long));
++	BUILD_BUG_ON(sizeof(sb->s_magic) != sizeof(unsigned long));
 +
 +	err = 0;
 +	au_warn_loopback_array = kcalloc(au_warn_loopback_step,
@@ -21434,7 +21467,8 @@ diff -urN /usr/share/empty/fs/aufs/loop.c linux/fs/aufs/loop.c
 +
 +void au_loopback_fin(void)
 +{
-+	symbol_put(loop_backing_file);
++	if (backing_file_func)
++		symbol_put(loop_backing_file);
 +	kfree(au_warn_loopback_array);
 +}
 diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h
@@ -21577,8 +21611,8 @@ diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
 +aufs-$(CONFIG_AUFS_MAGIC_SYSRQ) += sysrq.o
 diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 --- /usr/share/empty/fs/aufs/module.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,210 @@
++++ linux/fs/aufs/module.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,217 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -21653,11 +21687,10 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 +
 +	/* excluding AuCache_HNOTIFY */
 +	BUILD_BUG_ON(AuCache_HNOTIFY + 1 != AuCache_Last);
-+	for (i = 0; i < AuCache_HNOTIFY; i++)
-+		if (au_cachep[i]) {
-+			kmem_cache_destroy(au_cachep[i]);
-+			au_cachep[i] = NULL;
-+		}
++	for (i = 0; i < AuCache_HNOTIFY; i++) {
++		kmem_cache_destroy(au_cachep[i]);
++		au_cachep[i] = NULL;
++	}
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -21701,7 +21734,15 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 +
 +int au_seq_path(struct seq_file *seq, struct path *path)
 +{
-+	return seq_path(seq, path, au_esc_chars);
++	int err;
++
++	err = seq_path(seq, path, au_esc_chars);
++	if (err > 0)
++		err = 0;
++	else if (err < 0)
++		err = -ENOMEM;
++
++	return err;
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -21899,8 +21940,8 @@ diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
 +#endif /* __AUFS_MODULE_H__ */
 diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 --- /usr/share/empty/fs/aufs/mvdown.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/mvdown.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,694 @@
++++ linux/fs/aufs/mvdown.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,703 @@
 +/*
 + * Copyright (C) 2011-2015 Junjiro R. Okajima
 + *
@@ -22269,6 +22310,12 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +		au_set_dbstart(a->dentry, a->mvd_bdst);
 +		au_set_h_iptr(a->inode, a->mvd_bsrc, NULL, /*flags*/0);
 +		au_set_ibstart(a->inode, a->mvd_bdst);
++	} else {
++		/* hide the lower */
++		au_set_h_dptr(a->dentry, a->mvd_bdst, NULL);
++		au_set_dbend(a->dentry, a->mvd_bsrc);
++		au_set_h_iptr(a->inode, a->mvd_bdst, NULL, /*flags*/0);
++		au_set_ibend(a->inode, a->mvd_bsrc);
 +	}
 +	if (au_dbend(a->dentry) < a->mvd_bdst)
 +		au_set_dbend(a->dentry, a->mvd_bdst);
@@ -22524,7 +22571,9 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +	int err, e;
 +	unsigned char dmsg;
 +	struct au_mvd_args *args;
++	struct inode *inode;
 +
++	inode = d_inode(dentry);
 +	err = -EPERM;
 +	if (unlikely(!capable(CAP_SYS_ADMIN)))
 +		goto out;
@@ -22546,7 +22595,7 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +	args->mvdown.flags &= ~(AUFS_MVDOWN_ROLOWER_R | AUFS_MVDOWN_ROUPPER_R);
 +	args->mvdown.au_errno = 0;
 +	args->dentry = dentry;
-+	args->inode = d_inode(dentry);
++	args->inode = inode;
 +	args->sb = dentry->d_sb;
 +
 +	err = -ENOENT;
@@ -22560,7 +22609,7 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +		goto out_dir;
 +	}
 +
-+	mutex_lock_nested(&args->inode->i_mutex, I_MUTEX_CHILD);
++	mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
 +	err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH);
 +	if (unlikely(err))
 +		goto out_inode;
@@ -22575,15 +22624,16 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +		goto out_parent;
 +
 +	au_cpup_attr_timesizes(args->dir);
-+	au_cpup_attr_timesizes(args->inode);
-+	au_cpup_igen(args->inode, au_h_iptr(args->inode, args->mvd_bdst));
++	au_cpup_attr_timesizes(inode);
++	if (!(args->mvdown.flags & AUFS_MVDOWN_KUPPER))
++		au_cpup_igen(inode, au_h_iptr(inode, args->mvd_bdst));
 +	/* au_digen_dec(dentry); */
 +
 +out_parent:
 +	di_write_unlock(args->parent);
 +	aufs_read_unlock(dentry, AuLock_DW);
 +out_inode:
-+	mutex_unlock(&args->inode->i_mutex);
++	mutex_unlock(&inode->i_mutex);
 +out_dir:
 +	mutex_unlock(&args->dir->i_mutex);
 +out_free:
@@ -22597,8 +22647,8 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c
 +}
 diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 --- /usr/share/empty/fs/aufs/opts.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/opts.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,1835 @@
++++ linux/fs/aufs/opts.c	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,1859 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -24169,10 +24219,10 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +{
 +	int err, fhsm;
 +	aufs_bindex_t bindex, bend;
-+	unsigned char do_plink, skip, do_free;
++	unsigned char do_plink, skip, do_free, can_no_dreval;
 +	struct au_branch *br;
 +	struct au_wbr *wbr;
-+	struct dentry *root;
++	struct dentry *root, *dentry;
 +	struct inode *dir, *h_dir;
 +	struct au_sbinfo *sbinfo;
 +	struct au_hinode *hdir;
@@ -24202,6 +24252,8 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +	root = sb->s_root;
 +	dir = d_inode(root);
 +	do_plink = !!au_opt_test(sbinfo->si_mntflags, PLINK);
++	can_no_dreval = !!au_opt_test((sbinfo->si_mntflags | pending),
++				      UDBA_NONE);
 +	bend = au_sbend(sb);
 +	for (bindex = 0; !err && bindex <= bend; bindex++) {
 +		skip = 0;
@@ -24250,6 +24302,15 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +		if (wbr)
 +			wbr_wh_read_unlock(wbr);
 +
++		if (can_no_dreval) {
++			dentry = br->br_path.dentry;
++			spin_lock(&dentry->d_lock);
++			if (dentry->d_flags &
++			    (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE))
++				can_no_dreval = 0;
++			spin_unlock(&dentry->d_lock);
++		}
++
 +		if (au_br_fhsm(br->br_perm)) {
 +			fhsm++;
 +			AuDebugOn(!br->br_fhsm);
@@ -24273,6 +24334,11 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +		}
 +	}
 +
++	if (can_no_dreval)
++		au_fset_si(sbinfo, NO_DREVAL);
++	else
++		au_fclr_si(sbinfo, NO_DREVAL);
++
 +	if (fhsm >= 2) {
 +		au_fset_si(sbinfo, FHSM);
 +		for (bindex = bend; bindex >= 0; bindex--) {
@@ -24384,6 +24450,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +int au_opts_remount(struct super_block *sb, struct au_opts *opts)
 +{
 +	int err, rerr;
++	unsigned char no_dreval;
 +	struct inode *dir;
 +	struct au_opt_xino *opt_xino;
 +	struct au_opt *opt;
@@ -24391,9 +24458,9 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +
 +	SiMustWriteLock(sb);
 +
++	err = 0;
 +	dir = d_inode(sb->s_root);
 +	sbinfo = au_sbi(sb);
-+	err = 0;
 +	opt_xino = NULL;
 +	opt = opts->opt;
 +	while (err >= 0 && opt->type != Opt_tail) {
@@ -24409,10 +24476,14 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +	AuTraceErr(err);
 +	/* go on even err */
 +
++	no_dreval = !!au_ftest_si(sbinfo, NO_DREVAL);
 +	rerr = au_opts_verify(sb, opts->sb_flags, /*pending*/0);
 +	if (unlikely(rerr && !err))
 +		err = rerr;
 +
++	if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL))
++		au_fset_opts(opts->flags, REFRESH_DOP);
++
 +	if (au_ftest_opts(opts->flags, TRUNC_XIB)) {
 +		rerr = au_xib_trunc(sb);
 +		if (unlikely(rerr && !err))
@@ -24421,7 +24492,10 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +
 +	/* will be handled by the caller */
 +	if (!au_ftest_opts(opts->flags, REFRESH)
-+	    && (opts->given_udba || au_opt_test(sbinfo->si_mntflags, XINO)))
++	    && (opts->given_udba
++		|| au_opt_test(sbinfo->si_mntflags, XINO)
++		|| au_ftest_opts(opts->flags, REFRESH_DOP)
++		    ))
 +		au_fset_opts(opts->flags, REFRESH);
 +
 +	AuDbg("status 0x%x\n", opts->flags);
@@ -24436,8 +24510,8 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c
 +}
 diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 --- /usr/share/empty/fs/aufs/opts.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/opts.h	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,210 @@
++++ linux/fs/aufs/opts.h	2015-11-11 17:21:46.918863802 +0100
+@@ -0,0 +1,211 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -24614,6 +24688,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 +#define AuOpts_REFRESH		(1 << 1)
 +#define AuOpts_TRUNC_XIB	(1 << 2)
 +#define AuOpts_REFRESH_DYAOP	(1 << 3)
++#define AuOpts_REFRESH_DOP	(1 << 4)
 +#define au_ftest_opts(flags, name)	((flags) & AuOpts_##name)
 +#define au_fset_opts(flags, name) \
 +	do { (flags) |= AuOpts_##name; } while (0)
@@ -26101,8 +26176,8 @@ diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h
 +#endif /* __AUFS_RWSEM_H__ */
 diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 --- /usr/share/empty/fs/aufs/sbinfo.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sbinfo.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,360 @@
++++ linux/fs/aufs/sbinfo.c	2015-11-11 17:21:46.922197217 +0100
+@@ -0,0 +1,363 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -26355,7 +26430,10 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 +
 +	if (au_ftest_lock(flags, GEN)) {
 +		err = au_digen_test(dentry, au_sigen(sb));
-+		AuDebugOn(!err && au_dbrange_test(dentry));
++		if (!au_opt_test(au_mntflags(sb), UDBA_NONE))
++			AuDebugOn(!err && au_dbrange_test(dentry));
++		else if (!err)
++			err = au_dbrange_test(dentry);
 +		if (unlikely(err))
 +			aufs_read_unlock(dentry, flags);
 +	}
@@ -26580,8 +26658,8 @@ diff -urN /usr/share/empty/fs/aufs/spl.h linux/fs/aufs/spl.h
 +#endif /* __AUFS_SPL_H__ */
 diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 --- /usr/share/empty/fs/aufs/super.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,1004 @@
++++ linux/fs/aufs/super.c	2015-11-11 17:21:46.922197217 +0100
+@@ -0,0 +1,1035 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -26688,15 +26766,15 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +		path.mnt = au_br_mnt(br);
 +		path.dentry = hdp[bindex].hd_dentry;
 +		err = au_seq_path(seq, &path);
-+		if (err > 0) {
++		if (!err) {
 +			au_optstr_br_perm(&perm, br->br_perm);
-+			err = seq_printf(seq, "=%s", perm.a);
-+			if (err == -1)
-+				err = -E2BIG;
++			seq_printf(seq, "=%s", perm.a);
++			if (bindex != bend)
++				seq_putc(seq, ':');
 +		}
-+		if (!err && bindex != bend)
-+			err = seq_putc(seq, ':');
 +	}
++	if (unlikely(err || seq_has_overflowed(seq)))
++		err = -E2BIG;
 +
 +	return err;
 +}
@@ -27063,7 +27141,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	}
 +}
 +
-+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, void *arg)
++void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb,
++		     struct super_block *sb, void *arg)
 +{
 +	void *array;
 +	unsigned long long n, sz;
@@ -27088,7 +27167,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +		goto out;
 +	}
 +
-+	n = cb(array, *hint, arg);
++	n = cb(sb, array, *hint, arg);
 +	AuDebugOn(n > *hint);
 +
 +out:
@@ -27096,7 +27175,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	return array;
 +}
 +
-+static unsigned long long au_iarray_cb(void *a,
++static unsigned long long au_iarray_cb(struct super_block *sb, void *a,
 +				       unsigned long long max __maybe_unused,
 +				       void *arg)
 +{
@@ -27107,7 +27186,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	n = 0;
 +	p = a;
 +	head = arg;
-+	spin_lock(&inode_sb_list_lock);
++	spin_lock(&sb->s_inode_list_lock);
 +	list_for_each_entry(inode, head, i_sb_list) {
 +		if (!is_bad_inode(inode)
 +		    && au_ii(inode)->ii_bstart >= 0) {
@@ -27121,7 +27200,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +			spin_unlock(&inode->i_lock);
 +		}
 +	}
-+	spin_unlock(&inode_sb_list_lock);
++	spin_unlock(&sb->s_inode_list_lock);
 +
 +	return n;
 +}
@@ -27129,7 +27208,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max)
 +{
 +	*max = atomic_long_read(&au_sbi(sb)->si_ninodes);
-+	return au_array_alloc(max, au_iarray_cb, &sb->s_inodes);
++	return au_array_alloc(max, au_iarray_cb, sb, &sb->s_inodes);
 +}
 +
 +void au_iarray_free(struct inode **a, unsigned long long max)
@@ -27165,7 +27244,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +
 +static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen,
 +			   struct au_sbinfo *sbinfo,
-+			   const unsigned int dir_flags)
++			   const unsigned int dir_flags, unsigned int do_dop)
 +{
 +	int err;
 +	struct dentry *parent;
@@ -27188,11 +27267,17 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	}
 +	dput(parent);
 +
++	if (!err) {
++		if (do_dop)
++			au_refresh_dop(dentry, /*force_reval*/0);
++	} else
++		au_refresh_dop(dentry, /*force_reval*/1);
++
 +	AuTraceErr(err);
 +	return err;
 +}
 +
-+static int au_refresh_d(struct super_block *sb)
++static int au_refresh_d(struct super_block *sb, unsigned int do_dop)
 +{
 +	int err, i, j, ndentry, e;
 +	unsigned int sigen;
@@ -27203,6 +27288,9 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	struct dentry *root = sb->s_root;
 +	const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1);
 +
++	if (do_dop)
++		au_refresh_dop(root, /*force_reval*/0);
++
 +	err = au_dpages_init(&dpages, GFP_NOFS);
 +	if (unlikely(err))
 +		goto out;
@@ -27218,7 +27306,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +		ndentry = dpage->ndentry;
 +		for (j = 0; j < ndentry; j++) {
 +			d = dentries[j];
-+			e = au_do_refresh_d(d, sigen, sbinfo, dir_flags);
++			e = au_do_refresh_d(d, sigen, sbinfo, dir_flags,
++					    do_dop);
 +			if (unlikely(e && !err))
 +				err = e;
 +			/* go on even err */
@@ -27268,7 +27357,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	return err;
 +}
 +
-+static void au_remount_refresh(struct super_block *sb)
++static void au_remount_refresh(struct super_block *sb, unsigned int do_dop)
 +{
 +	int err, e;
 +	unsigned int udba;
@@ -27276,9 +27365,11 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	struct dentry *root;
 +	struct inode *inode;
 +	struct au_branch *br;
++	struct au_sbinfo *sbi;
 +
 +	au_sigen_inc(sb);
-+	au_fclr_si(au_sbi(sb), FAILED_REFRESH_DIR);
++	sbi = au_sbi(sb);
++	au_fclr_si(sbi, FAILED_REFRESH_DIR);
 +
 +	root = sb->s_root;
 +	DiMustNoWaiters(root);
@@ -27297,8 +27388,19 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	}
 +	au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1));
 +
++	if (do_dop) {
++		if (au_ftest_si(sbi, NO_DREVAL)) {
++			AuDebugOn(sb->s_d_op == &aufs_dop_noreval);
++			sb->s_d_op = &aufs_dop_noreval;
++		} else {
++			AuDebugOn(sb->s_d_op == &aufs_dop);
++			sb->s_d_op = &aufs_dop;
++		}
++		pr_info("reset to %pf\n", sb->s_d_op);
++	}
++
 +	di_write_unlock(root);
-+	err = au_refresh_d(sb);
++	err = au_refresh_d(sb, do_dop);
 +	e = au_refresh_i(sb);
 +	if (unlikely(e && !err))
 +		err = e;
@@ -27374,7 +27476,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	au_opts_free(&opts);
 +
 +	if (au_ftest_opts(opts.flags, REFRESH))
-+		au_remount_refresh(sb);
++		au_remount_refresh(sb, au_ftest_opts(opts.flags, REFRESH_DOP));
 +
 +	if (au_ftest_opts(opts.flags, REFRESH_DYAOP)) {
 +		mntflags = au_mntflags(sb);
@@ -27450,6 +27552,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +{
 +	int err;
 +	struct au_opts opts;
++	struct au_sbinfo *sbinfo;
 +	struct dentry *root;
 +	struct inode *inode;
 +	char *arg = raw_data;
@@ -27471,6 +27574,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	err = au_si_alloc(sb);
 +	if (unlikely(err))
 +		goto out_opts;
++	sbinfo = au_sbi(sb);
 +
 +	/* all timestamps always follow the ones on the branch */
 +	sb->s_flags |= MS_NOATIME | MS_NODIRATIME;
@@ -27506,6 +27610,11 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	aufs_write_lock(root);
 +	err = au_opts_mount(sb, &opts);
 +	au_opts_free(&opts);
++	if (!err && au_ftest_si(sbinfo, NO_DREVAL)) {
++		sb->s_d_op = &aufs_dop_noreval;
++		pr_info("%pf\n", sb->s_d_op);
++		au_refresh_dop(root, /*force_reval*/0);
++	}
 +	aufs_write_unlock(root);
 +	mutex_unlock(&inode->i_mutex);
 +	if (!err)
@@ -27515,8 +27624,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	dput(root);
 +	sb->s_root = NULL;
 +out_info:
-+	dbgaufs_si_fin(au_sbi(sb));
-+	kobject_put(&au_sbi(sb)->si_kobj);
++	dbgaufs_si_fin(sbinfo);
++	kobject_put(&sbinfo->si_kobj);
 +	sb->s_fs_info = NULL;
 +out_opts:
 +	free_page((unsigned long)opts.opt);
@@ -27565,7 +27674,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +			sbinfo->si_wbr_create_ops->fin(sb);
 +		if (au_opt_test(sbinfo->si_mntflags, UDBA_HNOTIFY)) {
 +			au_opt_set_udba(sbinfo->si_mntflags, UDBA_NONE);
-+			au_remount_refresh(sb);
++			au_remount_refresh(sb, /*do_dop*/0);
 +		}
 +		if (au_opt_test(sbinfo->si_mntflags, PLINK))
 +			au_plink_put(sb, /*verbose*/1);
@@ -27588,8 +27697,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +};
 diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 --- /usr/share/empty/fs/aufs/super.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.h	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,638 @@
++++ linux/fs/aufs/super.h	2015-11-11 17:21:46.922197217 +0100
+@@ -0,0 +1,640 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -27816,6 +27925,7 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +#define AuSi_FAILED_REFRESH_DIR	1
 +
 +#define AuSi_FHSM		(1 << 1)	/* fhsm is active now */
++#define AuSi_NO_DREVAL		(1 << 2)	/* disable all d_revalidate */
 +
 +#ifndef CONFIG_AUFS_FHSM
 +#undef AuSi_FHSM
@@ -27866,10 +27976,11 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +/* super.c */
 +extern struct file_system_type aufs_fs_type;
 +struct inode *au_iget_locked(struct super_block *sb, ino_t ino);
-+typedef unsigned long long (*au_arraycb_t)(void *array, unsigned long long max,
-+					   void *arg);
++typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array,
++					   unsigned long long max, void *arg);
 +void au_array_free(void *array);
-+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb, void *arg);
++void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb,
++		     struct super_block *sb, void *arg);
 +struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max);
 +void au_iarray_free(struct inode **a, unsigned long long max);
 +
@@ -28443,8 +28554,8 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h
 +#endif /* __SYSAUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 --- /usr/share/empty/fs/aufs/sysfs.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysfs.c	2015-09-24 10:47:58.254719746 +0200
-@@ -0,0 +1,372 @@
++++ linux/fs/aufs/sysfs.c	2015-11-11 17:21:46.922197217 +0100
+@@ -0,0 +1,376 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -28544,16 +28655,18 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 +	case AuBrSysfs_BR:
 +		path.mnt = au_br_mnt(br);
 +		path.dentry = au_h_dptr(root, bindex);
-+		au_seq_path(seq, &path);
-+		au_optstr_br_perm(&perm, br->br_perm);
-+		err = seq_printf(seq, "=%s\n", perm.a);
++		err = au_seq_path(seq, &path);
++		if (!err) {
++			au_optstr_br_perm(&perm, br->br_perm);
++			seq_printf(seq, "=%s\n", perm.a);
++		}
 +		break;
 +	case AuBrSysfs_BRID:
-+		err = seq_printf(seq, "%d\n", br->br_id);
++		seq_printf(seq, "%d\n", br->br_id);
 +		break;
 +	}
 +	di_read_unlock(root, !AuLock_IR);
-+	if (err == -1)
++	if (unlikely(err || seq_has_overflowed(seq)))
 +		err = -E2BIG;
 +
 +	return err;
@@ -28707,9 +28820,11 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 +		if (unlikely(err))
 +			break;
 +
-+		au_seq_path(seq, &br->br_path);
-+		err = seq_putc(seq, '\0');
-+		if (!err && seq->count <= sz) {
++		err = au_seq_path(seq, &br->br_path);
++		if (unlikely(err))
++			break;
++		seq_putc(seq, '\0');
++		if (!seq_has_overflowed(seq)) {
 +			err = copy_to_user(arg->path, seq->buf, seq->count);
 +			seq->count = 0;
 +			if (unlikely(err))
@@ -28819,7 +28934,7 @@ diff -urN /usr/share/empty/fs/aufs/sysfs.c linux/fs/aufs/sysfs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 --- /usr/share/empty/fs/aufs/sysrq.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysrq.c	2015-09-24 10:47:58.254719746 +0200
++++ linux/fs/aufs/sysrq.c	2015-11-11 17:21:46.922197217 +0100
 @@ -0,0 +1,157 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28900,14 +29015,14 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +		struct inode *i;
 +
 +		pr("isolated inode\n");
-+		spin_lock(&inode_sb_list_lock);
++		spin_lock(&sb->s_inode_list_lock);
 +		list_for_each_entry(i, &sb->s_inodes, i_sb_list) {
 +			spin_lock(&i->i_lock);
 +			if (1 || hlist_empty(&i->i_dentry))
 +				au_dpri_inode(i);
 +			spin_unlock(&i->i_lock);
 +		}
-+		spin_unlock(&inode_sb_list_lock);
++		spin_unlock(&sb->s_inode_list_lock);
 +	}
 +#endif
 +	pr("files\n");
@@ -28980,7 +29095,7 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 --- /usr/share/empty/fs/aufs/vdir.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vdir.c	2015-09-24 10:47:58.258053165 +0200
++++ linux/fs/aufs/vdir.c	2015-11-11 17:21:46.922197217 +0100
 @@ -0,0 +1,888 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -29037,7 +29152,7 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+/* estimate the apropriate size for name hash table */
++/* estimate the appropriate size for name hash table */
 +unsigned int au_rdhash_est(loff_t sz)
 +{
 +	unsigned int n;
@@ -29363,7 +29478,7 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +
 +	vdir->vd_deblk_sz = au_sbi(sb)->si_rdblk;
 +	if (!vdir->vd_deblk_sz) {
-+		/* estimate the apropriate size for deblk */
++		/* estimate the appropriate size for deblk */
 +		vdir->vd_deblk_sz = au_dir_size(file, /*dentry*/NULL);
 +		/* pr_info("vd_deblk_sz %u\n", vdir->vd_deblk_sz); */
 +	}
@@ -30724,8 +30839,8 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 --- /usr/share/empty/fs/aufs/vfsub.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.h	2015-09-24 10:47:58.258053165 +0200
-@@ -0,0 +1,286 @@
++++ linux/fs/aufs/vfsub.h	2015-11-11 17:21:46.922197217 +0100
+@@ -0,0 +1,287 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -30760,7 +30875,6 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +/* copied from linux/fs/internal.h */
 +/* todo: BAD approach!! */
 +extern void __mnt_drop_write(struct vfsmount *);
-+extern spinlock_t inode_sb_list_lock;
 +extern int open_check_o_direct(struct file *f);
 +
 +/* ---------------------------------------------------------------------- */
@@ -30924,6 +31038,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +}
 +#endif
 +
++#if 0 /* reserved */
 +static inline void vfsub_touch_atime(struct vfsmount *h_mnt,
 +				     struct dentry *h_dentry)
 +{
@@ -30934,6 +31049,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +	touch_atime(&h_path);
 +	vfsub_update_h_iattr(&h_path, /*did*/NULL); /*ignore*/
 +}
++#endif
 +
 +static inline int vfsub_update_time(struct inode *h_inode, struct timespec *ts,
 +				    int flags)
@@ -33599,8 +33715,8 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +#endif
 diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 --- /usr/share/empty/fs/aufs/xino.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xino.c	2015-09-24 10:47:58.258053165 +0200
-@@ -0,0 +1,1297 @@
++++ linux/fs/aufs/xino.c	2015-11-11 17:21:46.922197217 +0100
+@@ -0,0 +1,1296 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -34885,10 +35001,9 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +	int err;
 +
 +	err = au_seq_path(seq, &file->f_path);
-+	if (unlikely(err < 0))
++	if (unlikely(err))
 +		goto out;
 +
-+	err = 0;
 +#define Deleted "\\040(deleted)"
 +	seq->count -= sizeof(Deleted) - 1;
 +	AuDebugOn(memcmp(seq->buf + seq->count, Deleted,
@@ -34900,7 +35015,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +}
 diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/linux/aufs_type.h
 --- /usr/share/empty/include/uapi/linux/aufs_type.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/include/uapi/linux/aufs_type.h	2015-09-24 10:47:58.258053165 +0200
++++ linux/include/uapi/linux/aufs_type.h	2015-11-11 17:22:06.926020273 +0100
 @@ -0,0 +1,419 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -34943,7 +35058,7 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +
 +#include <linux/limits.h>
 +
-+#define AUFS_VERSION	"4.x-rcN-20150921"
++#define AUFS_VERSION	"4.3-20151109"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC	('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -35321,10 +35436,10 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin
 +#define AUFS_CTL_FHSM_FD	_IOW(AuCtlType, AuCtl_FHSM_FD, int)
 +
 +#endif /* __AUFS_TYPE_H__ */
-aufs4.x-rcN loopback patch
+aufs4.3 loopback patch
 
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
-index 23103ad..5c3263f 100644
+index 291ec9e..1b8190d 100644
 --- a/drivers/block/loop.c
 +++ b/drivers/block/loop.c
 @@ -417,7 +417,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
@@ -35516,11 +35631,11 @@ index 91c2ce7..d4ee5a7 100644
  		if (file->f_mapping != h_file->f_mapping) {
  			file->f_mapping = h_file->f_mapping;
 diff --git a/fs/aufs/loop.c b/fs/aufs/loop.c
-index 69f7e96..7941063 100644
+index f324758..4555e7b 100644
 --- a/fs/aufs/loop.c
 +++ b/fs/aufs/loop.c
-@@ -130,3 +130,19 @@ void au_loopback_fin(void)
- 	symbol_put(loop_backing_file);
+@@ -131,3 +131,19 @@ void au_loopback_fin(void)
+ 		symbol_put(loop_backing_file);
  	kfree(au_warn_loopback_array);
  }
 +
@@ -35565,10 +35680,10 @@ index 6d9864d..3322557 100644
  
  #endif /* __KERNEL__ */
 diff --git a/fs/aufs/super.c b/fs/aufs/super.c
-index ee5780d..da35759 100644
+index 1b25343..3b0c6c5 100644
 --- a/fs/aufs/super.c
 +++ b/fs/aufs/super.c
-@@ -807,7 +807,10 @@ static const struct super_operations aufs_sop = {
+@@ -831,7 +831,10 @@ static const struct super_operations aufs_sop = {
  	.statfs		= aufs_statfs,
  	.put_super	= aufs_put_super,
  	.sync_fs	= aufs_sync_fs,
@@ -35581,10 +35696,10 @@ index ee5780d..da35759 100644
  
  /* ---------------------------------------------------------------------- */
 diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 86080ea..5f8e0f2 100644
+index fabd9d7a..90174cf 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -1708,6 +1708,10 @@ struct super_operations {
+@@ -1734,6 +1734,10 @@ struct super_operations {
  				  struct shrink_control *);
  	long (*free_cached_objects)(struct super_block *,
  				    struct shrink_control *);
diff --git a/kernel-imq.patch b/kernel-imq.patch
index a8cd77e..d50ab11 100644
--- a/kernel-imq.patch
+++ b/kernel-imq.patch
@@ -1,5 +1,5 @@
 diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
-index c18f9e6..ec43bde 100644
+index d18eb60..739a98a 100644
 --- a/drivers/net/Kconfig
 +++ b/drivers/net/Kconfig
 @@ -234,6 +234,125 @@ config RIONET_RX_SIZE
@@ -129,7 +129,7 @@ index c18f9e6..ec43bde 100644
  	tristate "Universal TUN/TAP device driver support"
  	depends on INET
 diff --git a/drivers/net/Makefile b/drivers/net/Makefile
-index c12cb22..03b82c6 100644
+index 900b0c5..e093402 100644
 --- a/drivers/net/Makefile
 +++ b/drivers/net/Makefile
 @@ -10,6 +10,7 @@ obj-$(CONFIG_IPVLAN) += ipvlan/
@@ -1074,10 +1074,10 @@ index 0000000..1babb09
 +#endif /* _IMQ_H */
 +
 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index e20979d..9c8f9a1 100644
+index 2d15e38..ebbecce 100644
 --- a/include/linux/netdevice.h
 +++ b/include/linux/netdevice.h
-@@ -3279,6 +3279,19 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
+@@ -3330,6 +3330,19 @@ static inline void netif_tx_unlock_bh(struct net_device *dev)
  	}						\
  }
  
@@ -1145,20 +1145,21 @@ index 0000000..198ac01
 +#endif /* _IP6T_IMQ_H */
 +
 diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
-index 9b88536..61686b0 100644
+index 2b0a30a..f8e727c 100644
 --- a/include/linux/skbuff.h
 +++ b/include/linux/skbuff.h
-@@ -37,6 +37,9 @@
- #include <net/flow_dissector.h>
+@@ -38,6 +38,10 @@
  #include <linux/splice.h>
  #include <linux/in6.h>
+ #include <net/flow.h>
 +#if defined(CONFIG_IMQ) || defined(CONFIG_IMQ_MODULE)
 +#include <linux/imq.h>
 +#endif
++
  
  /* A. Checksumming of received packets by device.
   *
-@@ -548,6 +551,9 @@ struct sk_buff {
+@@ -557,6 +561,9 @@ struct sk_buff {
  	 * first. This is owned by whoever has the skb queued ATM.
  	 */
  	char			cb[48] __aligned(8);
@@ -1168,7 +1169,7 @@ index 9b88536..61686b0 100644
  
  	unsigned long		_skb_refdst;
  	void			(*destructor)(struct sk_buff *skb);
-@@ -557,6 +563,9 @@ struct sk_buff {
+@@ -566,6 +573,9 @@ struct sk_buff {
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
  	struct nf_conntrack	*nfct;
  #endif
@@ -1178,7 +1179,7 @@ index 9b88536..61686b0 100644
  #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
  	struct nf_bridge_info	*nf_bridge;
  #endif
-@@ -624,6 +633,9 @@ struct sk_buff {
+@@ -633,6 +643,9 @@ struct sk_buff {
  	__u8			inner_protocol_type:1;
  	__u8			remcsum_offload:1;
  	/* 3 or 5 bit hole */
@@ -1188,7 +1189,7 @@ index 9b88536..61686b0 100644
  
  #ifdef CONFIG_NET_SCHED
  	__u16			tc_index;	/* traffic control index */
-@@ -774,6 +786,12 @@ void kfree_skb_list(struct sk_buff *segs);
+@@ -789,6 +802,12 @@ void kfree_skb_list(struct sk_buff *segs);
  void skb_tx_error(struct sk_buff *skb);
  void consume_skb(struct sk_buff *skb);
  void  __kfree_skb(struct sk_buff *skb);
@@ -1201,7 +1202,7 @@ index 9b88536..61686b0 100644
  extern struct kmem_cache *skbuff_head_cache;
  
  void kfree_skb_partial(struct sk_buff *skb, bool head_stolen);
-@@ -3232,6 +3250,10 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
+@@ -3335,6 +3354,10 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
  	if (copy)
  		dst->nfctinfo = src->nfctinfo;
  #endif
@@ -1230,7 +1231,7 @@ index e863585..40904cb 100644
  bool nf_queue_entry_get_refs(struct nf_queue_entry *entry);
  void nf_queue_entry_release_refs(struct nf_queue_entry *entry);
 diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
-index 2342bf1..149dec9 100644
+index 401038d..4668849 100644
 --- a/include/net/pkt_sched.h
 +++ b/include/net/pkt_sched.h
 @@ -104,6 +104,8 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
@@ -1243,10 +1244,10 @@ index 2342bf1..149dec9 100644
  {
  	if (qdisc_run_begin(q))
 diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
-index 2738f6f..cc0af3e 100644
+index 444faa8..e652d8d 100644
 --- a/include/net/sch_generic.h
 +++ b/include/net/sch_generic.h
-@@ -501,6 +501,12 @@ static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
+@@ -502,6 +502,12 @@ static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
  	return sch->enqueue(skb, sch);
  }
  
@@ -1274,7 +1275,7 @@ index d93f949..23fb6d1 100644
  /* we overload the higher bits for encoding auxiliary data such as the queue
   * number or errno values. Not nice, but better than additional function
 diff --git a/net/core/dev.c b/net/core/dev.c
-index a8e4dd4..f84cd5a 100644
+index 6bb6470..13cda63 100644
 --- a/net/core/dev.c
 +++ b/net/core/dev.c
 @@ -136,6 +136,9 @@
@@ -1317,7 +1318,7 @@ index a8e4dd4..f84cd5a 100644
  static void qdisc_pkt_len_init(struct sk_buff *skb)
  {
 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index 7b84330..a313d22 100644
+index dad4dd3..9c71959 100644
 --- a/net/core/skbuff.c
 +++ b/net/core/skbuff.c
 @@ -79,6 +79,87 @@
@@ -1463,7 +1464,7 @@ index 7b84330..a313d22 100644
  
  /**
 diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
-index d5f7716..dd12857 100644
+index 92b1aa3..e5a5dd5 100644
 --- a/net/ipv6/ip6_output.c
 +++ b/net/ipv6/ip6_output.c
 @@ -64,9 +64,6 @@ static int ip6_finish_output2(struct sock *sk, struct sk_buff *skb)
@@ -1491,7 +1492,7 @@ index d5f7716..dd12857 100644
  			    NULL, dev,
  			    ip6_finish_output,
 diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
-index 6eae69a..ca3b763 100644
+index 3e1b4ab..8721e48 100644
 --- a/net/netfilter/Kconfig
 +++ b/net/netfilter/Kconfig
 @@ -784,6 +784,18 @@ config NETFILTER_XT_TARGET_LOG
@@ -1526,10 +1527,10 @@ index 70d026d..5469b14 100644
  obj-$(CONFIG_NETFILTER_XT_TARGET_LOG) += xt_LOG.o
  obj-$(CONFIG_NETFILTER_XT_TARGET_NETMAP) += xt_NETMAP.o
 diff --git a/net/netfilter/core.c b/net/netfilter/core.c
-index a0e5497..a24276c 100644
+index 8e47f81..fa4ddd3 100644
 --- a/net/netfilter/core.c
 +++ b/net/netfilter/core.c
-@@ -206,9 +206,11 @@ next_hook:
+@@ -309,9 +309,11 @@ next_hook:
  		ret = NF_DROP_GETERR(verdict);
  		if (ret == 0)
  			ret = -EPERM;
@@ -1544,7 +1545,7 @@ index a0e5497..a24276c 100644
  			if (err == -ECANCELED)
  				goto next_hook;
 diff --git a/net/netfilter/nf_internals.h b/net/netfilter/nf_internals.h
-index 3992106..35cbc7b 100644
+index 0655225..25d4141 100644
 --- a/net/netfilter/nf_internals.h
 +++ b/net/netfilter/nf_internals.h
 @@ -18,7 +18,7 @@ unsigned int nf_iterate(struct list_head *head, struct sk_buff *skb,
@@ -1553,11 +1554,11 @@ index 3992106..35cbc7b 100644
  int nf_queue(struct sk_buff *skb, struct nf_hook_ops *elem,
 -	     struct nf_hook_state *state, unsigned int queuenum);
 +	     struct nf_hook_state *state, unsigned int queuenum, unsigned int queuetype);
- void nf_queue_nf_hook_drop(struct nf_hook_ops *ops);
+ void nf_queue_nf_hook_drop(struct net *net, struct nf_hook_ops *ops);
  int __init netfilter_queue_init(void);
  
 diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c
-index 8a8b2ab..91ba768 100644
+index 96777f9..c42d671 100644
 --- a/net/netfilter/nf_queue.c
 +++ b/net/netfilter/nf_queue.c
 @@ -28,6 +28,23 @@
@@ -1584,7 +1585,7 @@ index 8a8b2ab..91ba768 100644
  /* return EBUSY when somebody else is registered, return EEXIST if the
   * same handler is registered, return 0 in case of success. */
  void nf_register_queue_handler(const struct nf_queue_handler *qh)
-@@ -129,7 +146,8 @@ void nf_queue_nf_hook_drop(struct nf_hook_ops *ops)
+@@ -123,7 +140,8 @@ void nf_queue_nf_hook_drop(struct net *net, struct nf_hook_ops *ops)
  int nf_queue(struct sk_buff *skb,
  	     struct nf_hook_ops *elem,
  	     struct nf_hook_state *state,
@@ -1594,7 +1595,7 @@ index 8a8b2ab..91ba768 100644
  {
  	int status = -ENOENT;
  	struct nf_queue_entry *entry = NULL;
-@@ -139,7 +157,17 @@ int nf_queue(struct sk_buff *skb,
+@@ -133,7 +151,17 @@ int nf_queue(struct sk_buff *skb,
  	/* QUEUE == DROP if no one is waiting, to be safe. */
  	rcu_read_lock();
  
@@ -1613,7 +1614,7 @@ index 8a8b2ab..91ba768 100644
  	if (!qh) {
  		status = -ESRCH;
  		goto err_unlock;
-@@ -225,8 +253,10 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
+@@ -219,8 +247,10 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
  		local_bh_enable();
  		break;
  	case NF_QUEUE:
@@ -1704,7 +1705,7 @@ index 0000000..86d7b84
 +MODULE_ALIAS("ip6t_IMQ");
 +
 diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
-index 6efca30..a4e448f 100644
+index cb5d4ad..0d818be 100644
 --- a/net/sched/sch_generic.c
 +++ b/net/sched/sch_generic.c
 @@ -108,6 +108,14 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,
diff --git a/kernel-multiarch.config b/kernel-multiarch.config
index e178e6e..7bd3aa1 100644
--- a/kernel-multiarch.config
+++ b/kernel-multiarch.config
@@ -2,6 +2,7 @@
 #-
 #- *** FILE: arch/* - ARCH SPECIFIC OPTIONS ***
 #-
+AMD_MCE_INJ all=m
 ARCH_MEMORY_PROBE all=n
 CC_STACKPROTECTOR all=y
 CC_STACKPROTECTOR_NONE all=n
@@ -19,10 +20,12 @@ KVM_DEBUG_FS all=n
 KVM_DEVICE_ASSIGNMENT all=y
 PHYSICAL_ALIGN all=0x1000000
 PUNIT_ATOM_DEBUG all=m
+STATIC_KEYS_SELFTEST all=y
 X86_AMD_PLATFORM_DEVICE all=y
 X86_DEBUG_FPU all=n
 X86_DEBUG_STATIC_CPU_HAS all=n
 X86_SYSFB all=y
+XEN_512GB all=y
 XEN_PVH all=y
 
 #-
@@ -82,6 +85,12 @@ SYSV68_PARTITION all=y
 CMDLINE_PARTITION all=y
 
 #-
+#- *** FILE: certs/Kconfig ***
+#-
+SYSTEM_TRUSTED_KEYRING all=y
+SYSTEM_TRUSTED_KEYS all=""
+
+#-
 #- *** FILE: crypto/Kconfig ***
 #-
 #- file crypto/async_tx/Kconfig goes here
@@ -131,6 +140,7 @@ CRYPTO_CRCT10DIF all=m
 CRYPTO_CRCT10DIF_PCLMUL all=m
 CRYPTO_GHASH all=m
 CRYPTO_POLY1305 all=m
+CRYPTO_POLY1305_X86_64 all=m
 CRYPTO_MD4 all=m
 CRYPTO_MD5 all=y
 CRYPTO_MICHAEL_MIC all=m
@@ -173,6 +183,7 @@ CRYPTO_SALSA20 all=m
 CRYPTO_SALSA20_586 all=m
 CRYPTO_SALSA20_X86_64 x86_64=m
 CRYPTO_CHACHA20 all=m
+CRYPTO_CHACHA20_X86_64 all=m
 CRYPTO_SEED all=m
 CRYPTO_SERPENT all=m
 CRYPTO_SERPENT_SSE2_X86_64 all=m
@@ -205,6 +216,7 @@ CRYPTO_USER_API_RNG all=m
 CRYPTO_USER_API_AEAD all=m
 #- file drivers/crypto/Kconfig goes here
 #- file crypto/asymmetric_keys/Kconfig goes here
+#- file certs/Kconfig goes here
 
 #-
 #- *** FILE: crypto/asymmetric_keys/Kconfig ***
@@ -559,6 +571,7 @@ BT_HCIUART_LL all=y
 BT_HCIUART_3WIRE all=y
 BT_HCIUART_INTEL all=y
 BT_HCIUART_BCM all=y
+BT_HCIUART_QCA all=y
 BT_HCIBCM203X all=m
 BT_HCIBPA10X all=m
 BT_HCIBFUSB all=m
@@ -797,6 +810,7 @@ CRYPTO_DEV_CCP_CRYPTO all=m
 #- *** FILE: drivers/crypto/qat/Kconfig ***
 #-
 CRYPTO_DEV_QAT_DH895xCC all=m
+CRYPTO_DEV_QAT_DH895xCCVF all=m
 
 #-
 #- *** FILE: drivers/devfreq/Kconfig ***
@@ -821,16 +835,17 @@ PM_DEVFREQ_EVENT all=y
 DMADEVICES all=y
 DMADEVICES_DEBUG all=n
 #- DMA Devices
-INTEL_MIC_X100_DMA all=m
+DMA_ENGINE all=y
+FSL_DMA ppc=y ppc64=y
+IDMA64 all=m
 INTEL_IOATDMA i386=m x86_64=m
+INTEL_MIC_X100_DMA all=m
+PCH_DMA all=m
+TIMB_DMA all=m
+#- file drivers/dma/bestcomm/Kconfig goes here
 #- file drivers/dma/dw/Kconfig goes here
-FSL_DMA ppc=y ppc64=y
 #- file drivers/dma/hsu/Kconfig goes here
-#- file drivers/dma/bestcomm/Kconfig goes here
 #- file drivers/dma/sh/Kconfig goes here
-TIMB_DMA all=m
-PCH_DMA all=m
-DMA_ENGINE all=y
 #- DMA Clients
 ASYNC_TX_DMA all=y
 DMATEST all=n
@@ -839,9 +854,9 @@ DMATEST all=n
 #- *** FILE: drivers/dma/dw/Kconfig ***
 #-
 DW_DMAC_CORE all=m
+DW_DMAC_BIG_ENDIAN_IO all=n
 DW_DMAC all=m
 DW_DMAC_PCI all=m
-DW_DMAC_BIG_ENDIAN_IO all=n
 
 #-
 #- *** FILE: drivers/dma/hsu/Kconfig ***
@@ -855,7 +870,6 @@ EDAC all=y
 EDAC_LEGACY_SYSFS all=y
 EDAC_DEBUG all=n
 EDAC_DECODE_MCE all=m
-EDAC_MCE_INJ all=m
 EDAC_MM_EDAC all=m
 EDAC_AMD64 all=m
 EDAC_AMD64_ERROR_INJECTION all=y
@@ -996,15 +1010,16 @@ GPIO_74X164 all=m
 GPIO_MAX7301 all=m
 GPIO_MCP23S08 all=m
 GPIO_MC33880 all=m
+GPIO_ZX all=y
 GPIO_VIPERBOARD all=m
 
 #-
 #- *** FILE: drivers/gpu/drm/Kconfig ***
 #-
 DRM all=m
+DRM_FBDEV_EMULATION all=y
 DRM_LOAD_EDID_FIRMWARE all=y
 #- file drivers/gpu/drm/i2c/Kconfig goes here
-#- file drivers/gpu/drm/bridge/Kconfig goes here
 DRM_TDFX all=m
 DRM_R128 all=m
 DRM_RADEON all=m
@@ -1037,8 +1052,10 @@ DRM_VGEM all=m
 #- file drivers/gpu/drm/bochs/Kconfig goes here
 #- file drivers/gpu/drm/virtio/Kconfig goes here
 #- file drivers/gpu/drm/msm/Kconfig goes here
+#- file drivers/gpu/drm/fsl-dcu/Kconfig goes here
 #- file drivers/gpu/drm/tegra/Kconfig goes here
 #- file drivers/gpu/drm/panel/Kconfig goes here
+#- file drivers/gpu/drm/bridge/Kconfig goes here
 #- file drivers/gpu/drm/sti/Kconfig goes here
 #- file drivers/gpu/drm/amd/amdkfd/Kconfig goes here
 #- file drivers/gpu/drm/imx/Kconfig goes here
@@ -1065,11 +1082,6 @@ DRM_AST all=m
 DRM_BOCHS all=m
 
 #-
-#- *** FILE: drivers/gpu/drm/bridge/Kconfig ***
-#-
-DRM_PTN3460 all=m
-
-#-
 #- *** FILE: drivers/gpu/drm/cirrus/Kconfig ***
 #-
 DRM_CIRRUS_QEMU all=m
@@ -1093,8 +1105,6 @@ DRM_I2C_NXP_TDA998X all=m
 #- *** FILE: drivers/gpu/drm/i915/Kconfig ***
 #-
 DRM_I915 i386=m x86_64=m
-DRM_I915_KMS all=y
-DRM_I915_FBDEV all=y
 DRM_I915_PRELIMINARY_HW_SUPPORT all=y
 
 #-
@@ -1171,6 +1181,7 @@ HID_EMS_FF all=m
 HID_ELECOM all=m
 HID_ELO all=m
 HID_EZKEY all=m
+HID_GEMBIRD all=m
 HID_HOLTEK all=m
 HOLTEK_FF all=y
 HID_GT683R all=m
@@ -1431,6 +1442,7 @@ SENSORS_LM25066 all=m
 SENSORS_LTC2978 all=m
 SENSORS_LTC2978_REGULATOR all=y
 SENSORS_MAX16064 all=m
+SENSORS_MAX20751 all=m
 SENSORS_MAX34440 all=m
 SENSORS_MAX8688 all=m
 SENSORS_TPS40422 all=m
@@ -1497,6 +1509,7 @@ I2C_DESIGNWARE_PLATFORM all=m
 I2C_DESIGNWARE_PCI all=m
 I2C_DESIGNWARE_BAYTRAIL i386=y
 I2C_EG20T all=m
+I2C_EMEV2 all=m
 I2C_GPIO all=m
 I2C_KEMPLD all=m
 I2C_MPC ppc=n
@@ -1528,6 +1541,7 @@ I2C_MUX_GPIO all=m
 I2C_MUX_PCA9541 all=m
 I2C_MUX_PCA954x all=m
 I2C_MUX_PINCTRL all=m
+I2C_MUX_REG all=m
 
 #-
 #- *** FILE: drivers/ide/Kconfig ***
@@ -1641,8 +1655,8 @@ BMC150_ACCEL all=m
 HID_SENSOR_ACCEL_3D all=m
 IIO_ST_ACCEL_3AXIS all=m
 KXSD9 all=m
-MMA8452 all=m
 KXCJK1013 all=m
+MMA8452 all=m
 MMA9551 all=m
 MMA9553 all=m
 STK8312 all=m
@@ -1762,8 +1776,11 @@ ISL29125 all=m
 HID_SENSOR_ALS all=m
 HID_SENSOR_PROX all=m
 JSA1212 all=m
+RPR0521 all=m
 SENSORS_LM3533 all=m
 LTR501 all=m
+OPT3001 all=m
+PA12203001 all=m
 STK3310 all=m
 TCS3414 all=m
 TCS3472 all=m
@@ -1829,10 +1846,7 @@ INFINIBAND_USER_MEM all=y sparc=
 INFINIBAND_ON_DEMAND_PAGING all=y
 INFINIBAND_ADDR_TRANS all=y sparc=
 #- file drivers/infiniband/hw/mthca/Kconfig goes here
-#- file drivers/infiniband/hw/ipath/Kconfig goes here
 #- file drivers/infiniband/hw/qib/Kconfig goes here
-#- file drivers/infiniband/hw/ehca/Kconfig goes here
-#- file drivers/infiniband/hw/amso1100/Kconfig goes here
 #- file drivers/infiniband/hw/cxgb3/Kconfig goes here
 #- file drivers/infiniband/hw/cxgb4/Kconfig goes here
 #- file drivers/infiniband/hw/mlx4/Kconfig goes here
@@ -1847,12 +1861,6 @@ INFINIBAND_ADDR_TRANS all=y sparc=
 #- file drivers/infiniband/ulp/isert/Kconfig goes here
 
 #-
-#- *** FILE: drivers/infiniband/hw/amso1100/Kconfig ***
-#-
-INFINIBAND_AMSO1100 all=m sparc=
-INFINIBAND_AMSO1100_DEBUG all=n sparc=
-
-#-
 #- *** FILE: drivers/infiniband/hw/cxgb3/Kconfig ***
 #-
 INFINIBAND_CXGB3 all=m sparc=
@@ -1864,11 +1872,6 @@ INFINIBAND_CXGB3_DEBUG all=n sparc=
 INFINIBAND_CXGB4 all=m
 
 #-
-#- *** FILE: drivers/infiniband/hw/ipath/Kconfig ***
-#-
-INFINIBAND_IPATH all=m
-
-#-
 #- *** FILE: drivers/infiniband/hw/mlx4/Kconfig ***
 #-
 MLX4_INFINIBAND all=m sparc=
@@ -2440,7 +2443,6 @@ LEDS_OT200 all=m
 LEDS_MENF21BMC all=m
 #- LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
 LEDS_BLINKM all=m
-LEDS_PM8941_WLED all=m
 #- LED Triggers
 #- file drivers/leds/trigger/Kconfig goes here
 
@@ -2780,13 +2782,13 @@ SMS_SDIO_DRV all=m
 MEDIA_PCI_SUPPORT all=y
 #- Media capture support
 #- file drivers/media/pci/meye/Kconfig goes here
+#- file drivers/media/pci/solo6x10/Kconfig goes here
 #- file drivers/media/pci/sta2x11/Kconfig goes here
+#- file drivers/media/pci/tw68/Kconfig goes here
+#- file drivers/media/pci/zoran/Kconfig goes here
 #- Media capture/analog TV support
 #- file drivers/media/pci/ivtv/Kconfig goes here
-#- file drivers/media/pci/zoran/Kconfig goes here
 #- file drivers/media/pci/saa7146/Kconfig goes here
-#- file drivers/media/pci/solo6x10/Kconfig goes here
-#- file drivers/media/pci/tw68/Kconfig goes here
 #- file drivers/media/pci/dt3155/Kconfig goes here
 #- Media capture/analog/hybrid TV support
 #- file drivers/media/pci/cx18/Kconfig goes here
@@ -2808,6 +2810,7 @@ MEDIA_PCI_SUPPORT all=y
 #- file drivers/media/pci/ngene/Kconfig goes here
 #- file drivers/media/pci/ddbridge/Kconfig goes here
 #- file drivers/media/pci/smipcie/Kconfig goes here
+#- file drivers/media/pci/netup_unidvb/Kconfig goes here
 
 #-
 #- *** FILE: drivers/media/pci/b2c2/Kconfig ***
@@ -2889,6 +2892,11 @@ DVB_HOPPER all=m
 VIDEO_MEYE i386=m x86_64=m
 
 #-
+#- *** FILE: drivers/media/pci/netup_unidvb/Kconfig ***
+#-
+DVB_NETUP_UNIDVB all=m
+
+#-
 #- *** FILE: drivers/media/pci/ngene/Kconfig ***
 #-
 DVB_NGENE all=m
@@ -2988,6 +2996,8 @@ VIDEO_SH_VEU all=m
 VIDEO_RENESAS_VSP1 all=m
 V4L_TEST_DRIVERS all=n
 #- file drivers/media/platform/vivid/Kconfig goes here
+DVB_PLATFORM_DRIVERS all=y
+#- file drivers/media/platform/sti/c8sectpfe/Kconfig goes here
 
 #-
 #- *** FILE: drivers/media/platform/marvell-ccic/Kconfig ***
@@ -3488,6 +3498,8 @@ HTC_PASIC3 all=m
 MFD_INTEL_QUARK_I2C_GPIO all=m
 LPC_ICH all=m
 LPC_SCH all=m
+MFD_INTEL_LPSS_ACPI all=m
+MFD_INTEL_LPSS_PCI all=m
 MFD_JANZ_CMODIO all=m
 MFD_KEMPLD all=m
 MFD_MT6397 all=m
@@ -3534,6 +3546,7 @@ MFD_ARIZONA_SPI all=m
 MFD_WM5102 all=y
 MFD_WM5110 all=y
 MFD_WM8997 all=y
+MFD_WM8998 all=y
 MFD_WM831X all=y
 MFD_WM831X_SPI all=y
 MFD_WM8350_I2C all=y
@@ -3918,6 +3931,7 @@ TUN_VNET_CROSS_LE all=n
 VETH all=m
 VIRTIO_NET all=m
 NLMON all=m
+NET_VRF all=m
 #- file drivers/net/arcnet/Kconfig goes here
 #- file drivers/atm/Kconfig goes here
 #- file drivers/net/caif/Kconfig goes here
@@ -3939,6 +3953,7 @@ NET_SB1000 all=m
 XEN_NETDEV_FRONTEND all=m
 XEN_NETDEV_BACKEND all=m
 VMXNET3 all=m
+FUJITSU_ES all=m
 #- file drivers/net/hyperv/Kconfig goes here
 
 #-
@@ -4162,6 +4177,7 @@ ETHOC all=m
 #- file drivers/net/ethernet/smsc/Kconfig goes here
 #- file drivers/net/ethernet/stmicro/Kconfig goes here
 #- file drivers/net/ethernet/sun/Kconfig goes here
+#- file drivers/net/ethernet/synopsys/Kconfig goes here
 #- file drivers/net/ethernet/tehuti/Kconfig goes here
 #- file drivers/net/ethernet/ti/Kconfig goes here
 #- file drivers/net/ethernet/tile/Kconfig goes here
@@ -4246,6 +4262,7 @@ CNIC all=m
 TIGON3 all=m
 BNX2X all=m
 BNX2X_SRIOV all=y
+BNX2X_VXLAN all=y
 
 #-
 #- *** FILE: drivers/net/ethernet/brocade/Kconfig ***
@@ -4272,9 +4289,10 @@ NET_CALXEDA_XGMAC all=m
 #-
 #- *** FILE: drivers/net/ethernet/cavium/Kconfig ***
 #-
-NET_VENDOR_CAVIUM all=m
+NET_VENDOR_CAVIUM all=y
 THUNDER_NIC_PF all=m
 THUNDER_NIC_VF all=m
+THUNDER_NIC_BGX all=m
 LIQUIDIO all=m
 
 #-
@@ -4442,6 +4460,13 @@ MLX5_CORE all=m
 MLX5_CORE_EN all=y
 
 #-
+#- *** FILE: drivers/net/ethernet/mellanox/mlxsw/Kconfig ***
+#-
+MLXSW_CORE all=m
+MLXSW_PCI all=m
+MLXSW_SWITCHX2 all=m
+
+#-
 #- *** FILE: drivers/net/ethernet/micrel/Kconfig ***
 #-
 NET_VENDOR_MICREL all=y
@@ -4626,6 +4651,11 @@ SUNVNET sparc64=m
 NIU all=m
 
 #-
+#- *** FILE: drivers/net/ethernet/synopsys/Kconfig ***
+#-
+NET_VENDOR_SYNOPSYS all=y
+
+#-
 #- *** FILE: drivers/net/ethernet/tehuti/Kconfig ***
 #-
 NET_VENDOR_TEHUTI all=y
@@ -4757,6 +4787,7 @@ MCS_FIR all=m
 #-
 PHYLIB all=y
 #- MII PHY device drivers
+AQUANTIA_PHY all=m
 AT803X_PHY all=m
 AMD_PHY all=m
 MARVELL_PHY all=m
@@ -4765,6 +4796,7 @@ QSEMI_PHY all=m
 LXT_PHY all=m
 CICADA_PHY all=m
 VITESSE_PHY all=m
+TERANETICS_PHY all=m
 SMSC_PHY all=m
 BROADCOM_PHY all=m
 BCM63XX_PHY all=m
@@ -4776,10 +4808,13 @@ NATIONAL_PHY all=m
 STE10XP all=m
 LSI_ET1011C_PHY all=m
 MICREL_PHY all=m
+DP83848_PHY all=m
 DP83867_PHY all=m
+MICROCHIP_PHY all=m
 FIXED_PHY all=y
 MDIO_BITBANG all=m
 MDIO_GPIO all=m
+MDIO_OCTEON all=m
 MDIO_BCM_UNIMAC all=m
 MICREL_KS8995MA all=m
 
@@ -4832,6 +4867,7 @@ USB_KAWETH all=m
 USB_PEGASUS all=m
 USB_RTL8150 all=m
 USB_RTL8152 all=m
+USB_LAN78XX all=m
 USB_USBNET all=m
 USB_NET_AX8817X all=m
 USB_NET_AX88179_178A all=m
@@ -4867,6 +4903,7 @@ USB_CDC_PHONET all=m
 USB_IPHETH all=m
 USB_SIERRA_NET all=m
 USB_VL600 all=m
+USB_NET_CH9200 all=m
 
 #-
 #- *** FILE: drivers/net/wan/Kconfig ***
@@ -5280,6 +5317,7 @@ NFC_PORT100 all=m
 #- file drivers/nfc/st21nfca/Kconfig goes here
 #- file drivers/nfc/st-nci/Kconfig goes here
 #- file drivers/nfc/nxp-nci/Kconfig goes here
+#- file drivers/nfc/s3fwrn5/Kconfig goes here
 
 #-
 #- *** FILE: drivers/nfc/microread/Kconfig ***
@@ -5309,10 +5347,16 @@ NFC_PN544_I2C all=m
 NFC_PN544_MEI all=m
 
 #-
+#- *** FILE: drivers/nfc/s3fwrn5/Kconfig ***
+#-
+NFC_S3FWRN5_I2C all=m
+
+#-
 #- *** FILE: drivers/nfc/st-nci/Kconfig ***
 #-
 NFC_ST_NCI all=m
 NFC_ST_NCI_I2C all=m
+NFC_ST_NCI_SPI all=m
 
 #-
 #- *** FILE: drivers/nfc/st21nfca/Kconfig ***
@@ -5347,6 +5391,11 @@ ND_BLK all=m
 BTT all=y
 
 #-
+#- *** FILE: drivers/nvmem/Kconfig ***
+#-
+NVMEM all=m
+
+#-
 #- *** FILE: drivers/of/Kconfig ***
 #-
 OF all=n
@@ -5485,6 +5534,7 @@ PINCTRL_AMD all=y
 #- file drivers/pinctrl/sh-pfc/Kconfig goes here
 #- file drivers/pinctrl/spear/Kconfig goes here
 #- file drivers/pinctrl/sunxi/Kconfig goes here
+#- file drivers/pinctrl/uniphier/Kconfig goes here
 #- file drivers/pinctrl/vt8500/Kconfig goes here
 #- file drivers/pinctrl/mediatek/Kconfig goes here
 
@@ -5565,6 +5615,7 @@ INTEL_RST all=m
 INTEL_SMARTCONNECT all=m
 PVPANIC all=m
 INTEL_PMC_IPC all=m
+SURFACE_PRO3_BUTTON all=m
 
 #-
 #- *** FILE: drivers/pnp/Kconfig ***
@@ -5747,6 +5798,7 @@ REGULATOR_MAX8952 all=m
 REGULATOR_MAX8973 all=m
 REGULATOR_MC13783 all=m
 REGULATOR_MC13892 all=m
+REGULATOR_MT6311 all=m
 REGULATOR_MT6397 all=m
 REGULATOR_PCAP all=m
 REGULATOR_PCF50633 all=m
@@ -5925,6 +5977,7 @@ ISCSI_TCP all=m
 #- file drivers/scsi/bnx2i/Kconfig goes here
 #- file drivers/scsi/bnx2fc/Kconfig goes here
 #- file drivers/scsi/be2iscsi/Kconfig goes here
+#- file drivers/scsi/cxlflash/Kconfig goes here
 BLK_DEV_3W_XXXX_RAID all=m
 SCSI_HPSA all=m
 SCSI_3W_9XXX all=m
@@ -6093,7 +6146,7 @@ SCSI_CXGB4_ISCSI all=m
 #-
 #- *** FILE: drivers/scsi/device_handler/Kconfig ***
 #-
-SCSI_DH all=m
+SCSI_DH all=y
 SCSI_DH_RDAC all=m
 SCSI_DH_HP_SW all=m
 SCSI_DH_EMC all=m
@@ -6258,7 +6311,6 @@ STAGING all=y
 #- file drivers/staging/vt6655/Kconfig goes here
 #- file drivers/staging/vt6656/Kconfig goes here
 #- file drivers/staging/iio/Kconfig goes here
-#- file drivers/staging/sm7xxfb/Kconfig goes here
 #- file drivers/staging/sm750fb/Kconfig goes here
 #- file drivers/staging/xgifb/Kconfig goes here
 #- file drivers/staging/emxx_udc/Kconfig goes here
@@ -6267,9 +6319,9 @@ STAGING all=y
 #- file drivers/staging/ste_rmi4/Kconfig goes here
 #- file drivers/staging/nvec/Kconfig goes here
 #- file drivers/staging/media/Kconfig goes here
+#- file drivers/staging/rdma/Kconfig goes here
 #- file drivers/staging/android/Kconfig goes here
 #- file drivers/staging/board/Kconfig goes here
-#- file drivers/staging/ozwpan/Kconfig goes here
 #- file drivers/staging/gdm72xx/Kconfig goes here
 #- file drivers/staging/gdm724x/Kconfig goes here
 #- file drivers/staging/fwserial/Kconfig goes here
@@ -6286,6 +6338,7 @@ STAGING all=y
 #- file drivers/staging/fbtft/Kconfig goes here
 #- file drivers/staging/fsl-mc/Kconfig goes here
 #- file drivers/staging/wilc1000/Kconfig goes here
+#- file drivers/staging/most/Kconfig goes here
 
 #-
 #- *** FILE: drivers/staging/comedi/Kconfig ***
@@ -6455,6 +6508,7 @@ FB_TFT_SSD1351 all=m
 FB_TFT_ST7735R all=m
 FB_TFT_TINYLCD all=m
 FB_TFT_TLS8204 all=m
+FB_TFT_UC1611 all=m
 FB_TFT_UC1701 all=m
 FB_TFT_UPD161704 all=m
 FB_TFT_WATTEROTT all=m
@@ -6668,15 +6722,58 @@ DVB_MN88472 all=m
 DVB_MN88473 all=m
 
 #-
-#- *** FILE: drivers/staging/mt29f_spinand/Kconfig ***
+#- *** FILE: drivers/staging/most/Kconfig ***
 #-
-MTD_SPINAND_MT29F all=m
-MTD_SPINAND_ONDIEECC all=y
+MOST all=m
+#- file drivers/staging/most/mostcore/Kconfig goes here
+#- file drivers/staging/most/aim-cdev/Kconfig goes here
+#- file drivers/staging/most/aim-network/Kconfig goes here
+#- file drivers/staging/most/aim-sound/Kconfig goes here
+#- file drivers/staging/most/aim-v4l2/Kconfig goes here
+#- file drivers/staging/most/hdm-dim2/Kconfig goes here
+#- file drivers/staging/most/hdm-i2c/Kconfig goes here
+#- file drivers/staging/most/hdm-usb/Kconfig goes here
 
 #-
-#- *** FILE: drivers/staging/ozwpan/Kconfig ***
+#- *** FILE: drivers/staging/most/aim-cdev/Kconfig ***
 #-
-USB_WPAN_HCD all=m
+AIM_CDEV all=m
+
+#-
+#- *** FILE: drivers/staging/most/aim-network/Kconfig ***
+#-
+AIM_NETWORK all=m
+
+#-
+#- *** FILE: drivers/staging/most/aim-sound/Kconfig ***
+#-
+AIM_SOUND all=m
+
+#-
+#- *** FILE: drivers/staging/most/aim-v4l2/Kconfig ***
+#-
+AIM_V4L2 all=m
+
+#-
+#- *** FILE: drivers/staging/most/hdm-dim2/Kconfig ***
+#-
+HDM_DIM2 all=m
+
+#-
+#- *** FILE: drivers/staging/most/hdm-i2c/Kconfig ***
+#-
+HDM_I2C all=m
+
+#-
+#- *** FILE: drivers/staging/most/hdm-usb/Kconfig ***
+#-
+HDM_USB all=m
+
+#-
+#- *** FILE: drivers/staging/mt29f_spinand/Kconfig ***
+#-
+MTD_SPINAND_MT29F all=m
+MTD_SPINAND_ONDIEECC all=y
 
 #-
 #- *** FILE: drivers/staging/panel/Kconfig ***
@@ -6687,6 +6784,35 @@ PANEL_PROFILE all=5
 PANEL_CHANGE_MESSAGE all=n
 
 #-
+#- *** FILE: drivers/staging/rdma/Kconfig ***
+#-
+STAGING_RDMA all=y
+#- file drivers/staging/rdma/amso1100/Kconfig goes here
+#- file drivers/staging/rdma/ehca/Kconfig goes here
+#- file drivers/staging/rdma/hfi1/Kconfig goes here
+#- file drivers/staging/rdma/ipath/Kconfig goes here
+
+#-
+#- *** FILE: drivers/staging/rdma/amso1100/Kconfig ***
+#-
+INFINIBAND_AMSO1100 all=m sparc=
+INFINIBAND_AMSO1100_DEBUG all=n sparc=
+
+#-
+#- *** FILE: drivers/staging/rdma/hfi1/Kconfig ***
+#-
+INFINIBAND_HFI1 all=m
+HFI1_DEBUG_SDMA_ORDER all=n
+HFI1_VERBS_31BIT_PSN all=y
+SDMA_VERBOSITY all=n
+PRESCAN_RXQ all=y
+
+#-
+#- *** FILE: drivers/staging/rdma/ipath/Kconfig ***
+#-
+INFINIBAND_IPATH all=m
+
+#-
 #- *** FILE: drivers/staging/rtl8188eu/Kconfig ***
 #-
 R8188EU all=m
@@ -6744,11 +6870,6 @@ SLICOSS all=m
 FB_SM750 all=m
 
 #-
-#- *** FILE: drivers/staging/sm7xxfb/Kconfig ***
-#-
-FB_SM7XX all=m
-
-#-
 #- *** FILE: drivers/staging/speakup/Kconfig ***
 #-
 SPEAKUP all=m
@@ -6870,6 +6991,7 @@ X86_PKG_TEMP_THERMAL all=m
 INTEL_SOC_DTS_THERMAL all=m
 INTEL_QUARK_DTS_THERMAL i386=m
 INT340X_THERMAL all=m
+INTEL_PCH_THERMAL all=m
 #- file drivers/thermal/ti-soc-thermal/Kconfig goes here
 #- file drivers/thermal/samsung/Kconfig goes here
 #- file drivers/thermal/st/Kconfig goes here
@@ -7102,8 +7224,6 @@ USB_DWC3_OMAP all=m
 USB_DWC3_EXYNOS all=m
 USB_DWC3_PCI all=m
 USB_DWC3_KEYSTONE all=m
-#- Debugging features
-USB_DWC3_DEBUG all=n
 
 #-
 #- *** FILE: drivers/usb/gadget/Kconfig ***
@@ -7298,6 +7418,7 @@ USB_MON all=m
 #-
 USB_MUSB_HDRC all=n
 #- Platform Glue Layer
+#- MUSB DMA mode
 
 #-
 #- *** FILE: drivers/usb/phy/Kconfig ***
@@ -7495,6 +7616,7 @@ BACKLIGHT_PWM all=m
 BACKLIGHT_DA903X all=m
 BACKLIGHT_DA9052 all=m
 BACKLIGHT_APPLE all=m
+BACKLIGHT_PM8941_WLED all=m
 BACKLIGHT_SAHARA all=m
 BACKLIGHT_WM831X all=m
 BACKLIGHT_ADP8860 all=m
@@ -7658,6 +7780,7 @@ FB_SIMPLE all=y
 #- file drivers/video/fbdev/omap2/Kconfig goes here
 #- file drivers/video/fbdev/exynos/Kconfig goes here
 #- file drivers/video/fbdev/mmp/Kconfig goes here
+FB_SM712 all=m
 
 #-
 #- *** FILE: drivers/video/fbdev/exynos/Kconfig ***
@@ -7848,6 +7971,7 @@ XEN_PCIDEV_BACKEND all=m
 XEN_SCSI_BACKEND all=m
 XEN_ACPI_PROCESSOR all=m
 XEN_MCE_LOG all=y
+XEN_SYMS all=y
 
 #-
 #- *** FILE: fs/9p/Kconfig ***
@@ -7861,9 +7985,7 @@ XEN_MCE_LOG all=y
 #- *** FILE: fs/Kconfig ***
 #-
 #- file fs/ext2/Kconfig goes here
-#- file fs/ext3/Kconfig goes here
 #- file fs/ext4/Kconfig goes here
-#- file fs/jbd/Kconfig goes here
 #- file fs/jbd2/Kconfig goes here
 FS_MBCACHE all=m
 #- file fs/reiserfs/Kconfig goes here
@@ -8084,19 +8206,13 @@ EXT2_FS_POSIX_ACL all=y
 EXT2_FS_SECURITY all=y
 
 #-
-#- *** FILE: fs/ext3/Kconfig ***
+#- *** FILE: fs/ext4/Kconfig ***
 #-
 EXT3_FS all=n
-EXT3_DEFAULTS_TO_ORDERED all=n
-EXT3_FS_XATTR all=y
 EXT3_FS_POSIX_ACL all=y
 EXT3_FS_SECURITY all=y
-
-#-
-#- *** FILE: fs/ext4/Kconfig ***
-#-
 EXT4_FS all=m
-EXT4_USE_FOR_EXT23 all=y
+EXT4_USE_FOR_EXT2 all=y
 EXT4_FS_POSIX_ACL all=y
 EXT4_FS_SECURITY all=y
 EXT4_ENCRYPTION all=m
@@ -8173,12 +8289,6 @@ JOLIET all=y
 ZISOFS all=y
 
 #-
-#- *** FILE: fs/jbd/Kconfig ***
-#-
-JBD all=m
-JBD_DEBUG all=n
-
-#-
 #- *** FILE: fs/jbd2/Kconfig ***
 #-
 JBD2 all=m
@@ -8519,7 +8629,6 @@ TASK_IO_ACCOUNTING all=y
 TREE_RCU all=y
 RCU_EXPERT all=n
 TASKS_RCU all=n
-RCU_USER_QS all=n
 RCU_FANOUT all=32 alpha=64 ia64=64 ppc64=64 sparc64=64 x86_64=64
 RCU_FANOUT_LEAF all=16
 RCU_FAST_NO_HZ all=y
@@ -8537,6 +8646,7 @@ NUMA_BALANCING_DEFAULT_ENABLED all=y
 CGROUPS all=y
 CGROUP_DEBUG all=n
 CGROUP_FREEZER all=y
+CGROUP_PIDS al=y
 CGROUP_DEVICE all=y
 CPUSETS all=y
 PROC_PID_CPUSET all=n
@@ -8586,6 +8696,7 @@ EVENTFD all=y
 BPF_SYSCALL all=y
 SHMEM all=y
 AIO all=y
+USERFAULTFD all=y
 PCI_QUIRKS all=y
 EMBEDDED all=n
 PERF_EVENTS all=y
@@ -8596,7 +8707,6 @@ SLAB all=n
 SLUB all=y
 SLOB all=n
 SLUB_CPU_PARTIAL all=y
-SYSTEM_TRUSTED_KEYRING all=y
 PROFILING all=y
 #- file arch/Kconfig goes here
 SLABINFO all=y
@@ -8808,7 +8918,6 @@ SCHED_STACK_END_CHECK all=y
 DEBUG_TIMEKEEPING all=n
 TIMER_STATS all=y
 DEBUG_RT_MUTEXES all=n
-RT_MUTEX_TESTER all=n
 DEBUG_SPINLOCK all=n
 DEBUG_MUTEXES all=n
 DEBUG_WW_MUTEX_SLOWPATH all=n
@@ -8832,7 +8941,6 @@ RCU_TORTURE_TEST_SLOW_PREINIT all=n
 RCU_TORTURE_TEST_SLOW_INIT all=n
 RCU_TORTURE_TEST_SLOW_CLEANUP all=n
 RCU_CPU_STALL_TIMEOUT all=60
-RCU_CPU_STALL_INFO all=n
 RCU_TRACE all=n
 RCU_EQS_DEBUG all=n
 DEBUG_BLOCK_EXT_DEVT all=n
@@ -8863,6 +8971,7 @@ TEST_USER_COPY all=n
 TEST_BPF all=n
 TEST_FIRMWARE all=m
 TEST_UDELAY all=m
+TEST_STATIC_KEYS all=m
 #- file samples/Kconfig goes here
 #- file lib/Kconfig.kgdb goes here
 
@@ -8951,6 +9060,7 @@ ZSMALLOC all=y
 PGTABLE_MAPPING all=n
 ZSMALLOC_STAT all=y
 DEFERRED_STRUCT_PAGE_INIT all=n
+IDLE_PAGE_TRACKING all=y
 
 #-
 #- *** FILE: mm/Kconfig.debug ***
@@ -9104,6 +9214,7 @@ BT_BREDR all=y
 #- file net/bluetooth/bnep/Kconfig goes here
 #- file net/bluetooth/cmtp/Kconfig goes here
 #- file net/bluetooth/hidp/Kconfig goes here
+BT_HS all=y
 BT_LE all=y
 BT_6LOWPAN all=y
 BT_SELFTEST all=n
@@ -9279,7 +9390,6 @@ SYN_COOKIES all=y
 NET_IPVTI all=m
 NET_FOU all=m
 NET_FOU_IP_TUNNELS all=y
-GENEVE_CORE all=m
 INET_AH all=m
 INET_ESP all=m
 INET_IPCOMP all=m
@@ -9324,6 +9434,7 @@ NF_CONNTRACK_PROC_COMPAT all=y
 NF_TABLES_IPV4 all=m
 NFT_CHAIN_ROUTE_IPV4 all=m
 NFT_REJECT_IPV4 all=m
+NFT_DUP_IPV4 all=m
 NF_TABLES_ARP all=m
 NF_LOG_ARP all=m
 NF_LOG_IPV4 all=m
@@ -9366,6 +9477,7 @@ INET6_AH all=m
 INET6_ESP all=m
 INET6_IPCOMP all=m
 IPV6_MIP6 all=y
+IPV6_ILA all=m
 INET6_XFRM_TUNNEL all=m
 INET6_TUNNEL all=m
 INET6_XFRM_MODE_TRANSPORT all=m
@@ -9389,6 +9501,7 @@ IPV6_PIMSM_V2 all=y
 NF_CONNTRACK_IPV6 all=m
 NF_TABLES_IPV6 all=m
 NFT_CHAIN_ROUTE_IPV6 all=m
+NFT_DUP_IPV6 all=m
 NF_REJECT_IPV6 all=m
 NF_LOG_IPV6 all=m
 NF_NAT_IPV6 all=m
@@ -9497,6 +9610,7 @@ MAC802154 all=m
 #-
 NET_MPLS_GSO all=m
 MPLS_ROUTING all=m
+MPLS_IPTUNNEL all=m
 
 #-
 #- *** FILE: net/netfilter/Kconfig ***
@@ -9671,6 +9785,7 @@ IP_VS_WRR all=m
 IP_VS_LC all=m
 IP_VS_WLC all=m
 IP_VS_FO all=m
+IP_VS_OVF all==m
 IP_VS_LBLC all=m
 IP_VS_LBLCR all=m
 IP_VS_DH all=m
@@ -9935,7 +10050,6 @@ DEFAULT_SECURITY_SELINUX all=n
 DEFAULT_SECURITY_SMACK all=n
 DEFAULT_SECURITY_TOMOYO all=n
 DEFAULT_SECURITY_APPARMOR=n
-DEFAULT_SECURITY_YAMA all=n
 DEFAULT_SECURITY_DAC all=y
 DEFAULT_SECURITY all=""
 
@@ -10010,7 +10124,6 @@ SECURITY_TOMOYO_ACTIVATION_TRIGGER all="/sbin/init"
 #- *** FILE: security/yama/Kconfig ***
 #-
 SECURITY_YAMA all=y
-SECURITY_YAMA_STACKED all=y
 
 #-
 #- *** FILE: sound/Kconfig ***
@@ -10360,6 +10473,7 @@ SND_SOC all=m
 #- file sound/soc/sh/Kconfig goes here
 #- file sound/soc/sirf/Kconfig goes here
 #- file sound/soc/spear/Kconfig goes here
+#- file sound/soc/sti/Kconfig goes here
 #- file sound/soc/tegra/Kconfig goes here
 #- file sound/soc/txx9/Kconfig goes here
 #- file sound/soc/ux500/Kconfig goes here
@@ -10397,8 +10511,10 @@ SND_SOC_CS4271 all=m
 SND_SOC_CS4271_I2C all=m
 SND_SOC_CS4271_SPI all=m
 SND_SOC_CS42XX8_I2C all=m
+SND_SOC_CS4349 all=m
 SND_SOC_HDMI_CODEC all=m
 SND_SOC_ES8328 all=m
+SND_SOC_GTM601 all=m
 SND_SOC_MAX98095 all=m
 SND_SOC_MAX9850 all=m
 SND_SOC_PCM1681 all=m
@@ -10417,6 +10533,7 @@ SND_SOC_SSM2602_I2C all=m
 SND_SOC_SSM4567 all=m
 SND_SOC_STA32X all=m
 SND_SOC_STA350 all=m
+SND_SOC_STI_SAS all=m
 SND_SOC_TAS2552 all=m
 SND_SOC_TAS5086 all=m
 SND_SOC_TAS571X all=m
@@ -10559,11 +10676,21 @@ AMD_XGBE_PHY all=m
 ARM_AT91_ETHER all=m
 BLK_DEV_CELLEB ppc64=m
 BLK_DEV_XIP all=y
+DEFAULT_SECURITY_YAMA all=n
+DRM_I915_FBDEV all=y
+DRM_I915_KMS all=y
+DRM_PTN3460 all=m
 DT3155_CCIR all=y
 DT3155_STREAMING all=y
 DWC3_HOST_USB3_LPM_ENABLE all=y
+EDAC_MCE_INJ all=m
 EXT2_FS_XIP all=y
+EXT3_DEFAULTS_TO_ORDERED all=n
+EXT3_FS_XATTR all=y
+EXT4_USE_FOR_EXT23 all=y
+FB_SM7XX all=m
 FS_XIP all=y
+GENEVE_CORE all=m
 HID_HUION all=m
 HVC_BEAT ppc64=n
 I2O all=m sparc=n
@@ -10578,14 +10705,21 @@ I2O_PROC all=m
 I2O_SCSI all=m
 INIT_FALLBACK all=y
 INTEL_MID_DMAC all=m
+JBD all=m
+JBD_DEBUG all=n
 KEYS_DEBUG_PROC_KEYS all=n
+LEDS_PM8941_WLED all=m
 LINE6_USB all=m
 LINE6_USB_IMPULSE_RESPONSE all=n
 MEDIA_PARPORT_SUPPORT all=y
 NFC_ST21NFCB all=m
 NFC_ST21NFCB_I2C all=m
 PATA_SCC ppc64=m
+RCU_CPU_STALL_INFO all=n
 RCU_FANOUT_EXACT all=n
+RCU_USER_QS all=n
+RT_MUTEX_TESTER all=n
+SECURITY_YAMA_STACKED all=y
 SERIAL_MFD_HSU all=m
 SERIAL_MRST_MAX3110 all=m
 SND_HDA_INPUT_JACK all=y
@@ -10603,6 +10737,8 @@ UNISYS_VIRTPCI all=m
 UNISYS_VISORCHANNEL all=m
 UNISYS_VISORCHIPSET all=m
 UNISYS_VISORUTIL all=m
+USB_DWC3_DEBUG all=n
+USB_WPAN_HCD all=m
 VIDEO_BTCX all=m sparc=
 VIDEO_BWQCAM all=m
 VIDEO_CQCAM all=m
diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch
index f8c1e75..68d235c 100644
--- a/kernel-small_fixes.patch
+++ b/kernel-small_fixes.patch
@@ -27,76 +27,6 @@
  			fi
  		done
 
-From 30927520dbae297182990bb21d08762bcc35ce1d Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet at google.com>
-Date: Wed, 9 Sep 2015 21:55:07 -0700
-Subject: [PATCH] tcp_cubic: better follow cubic curve after idle period
-
-Jana Iyengar found an interesting issue on CUBIC :
-
-The epoch is only updated/reset initially and when experiencing losses.
-The delta "t" of now - epoch_start can be arbitrary large after app idle
-as well as the bic_target. Consequentially the slope (inverse of
-ca->cnt) would be really large, and eventually ca->cnt would be
-lower-bounded in the end to 2 to have delayed-ACK slow-start behavior.
-
-This particularly shows up when slow_start_after_idle is disabled
-as a dangerous cwnd inflation (1.5 x RTT) after few seconds of idle
-time.
-
-Jana initial fix was to reset epoch_start if app limited,
-but Neal pointed out it would ask the CUBIC algorithm to recalculate the
-curve so that we again start growing steeply upward from where cwnd is
-now (as CUBIC does just after a loss). Ideally we'd want the cwnd growth
-curve to be the same shape, just shifted later in time by the amount of
-the idle period.
-
-Reported-by: Jana Iyengar <jri at google.com>
-Signed-off-by: Eric Dumazet <edumazet at google.com>
-Signed-off-by: Yuchung Cheng <ycheng at google.com>
-Signed-off-by: Neal Cardwell <ncardwell at google.com>
-Cc: Stephen Hemminger <stephen at networkplumber.org>
-Cc: Sangtae Ha <sangtae.ha at gmail.com>
-Cc: Lawrence Brakmo <lawrence at brakmo.org>
-Signed-off-by: David S. Miller <davem at davemloft.net>
----
- net/ipv4/tcp_cubic.c | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
-
-diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
-index 28011fb1..c6ded6b 100644
---- a/net/ipv4/tcp_cubic.c
-+++ b/net/ipv4/tcp_cubic.c
-@@ -151,6 +151,21 @@ static void bictcp_init(struct sock *sk)
- 		tcp_sk(sk)->snd_ssthresh = initial_ssthresh;
- }
- 
-+static void bictcp_cwnd_event(struct sock *sk, enum tcp_ca_event event)
-+{
-+	if (event == CA_EVENT_TX_START) {
-+		s32 delta = tcp_time_stamp - tcp_sk(sk)->lsndtime;
-+		struct bictcp *ca = inet_csk_ca(sk);
-+
-+		/* We were application limited (idle) for a while.
-+		 * Shift epoch_start to keep cwnd growth to cubic curve.
-+		 */
-+		if (ca->epoch_start && delta > 0)
-+			ca->epoch_start += delta;
-+		return;
-+	}
-+}
-+
- /* calculate the cubic root of x using a table lookup followed by one
-  * Newton-Raphson iteration.
-  * Avg err ~= 0.195%
-@@ -450,6 +465,7 @@ static struct tcp_congestion_ops cubictcp __read_mostly = {
- 	.cong_avoid	= bictcp_cong_avoid,
- 	.set_state	= bictcp_state,
- 	.undo_cwnd	= bictcp_undo_cwnd,
-+	.cwnd_event	= bictcp_cwnd_event,
- 	.pkts_acked     = bictcp_acked,
- 	.owner		= THIS_MODULE,
- 	.name		= "cubic",
 From 7a29ac474a47eb8cf212b45917683ae89d6fa13b Mon Sep 17 00:00:00 2001
 From: Chris Mason <clm at fb.com>
 Date: Tue, 10 Nov 2015 10:10:34 +1100
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/79b8bda9ad47aabbc62f9933f878976e61a8e183



More information about the pld-cvs-commit mailing list