[packages/kernel/LINUX_4_1] - up to 4.1.14 (aufs and imq updated)

arekm arekm at pld-linux.org
Thu Dec 10 19:21:28 CET 2015


commit ab036dbd1ddc7ba5816911ea9d9c3f287845472e
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Thu Dec 10 19:21:19 2015 +0100

    - up to 4.1.14 (aufs and imq updated)

 kernel-aufs4.patch | 674 ++++++++++++++++++++++++++++++++---------------------
 kernel-imq.patch   |  58 +++--
 kernel.spec        |   4 +-
 3 files changed, 440 insertions(+), 296 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index ac465f7..bc7c04b 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -71,7 +71,7 @@
 
 %define		rel		1
 %define		basever		4.1
-%define		postver		.13
+%define		postver		.14
 
 # define this to '-%{basever}' for longterm branch
 %define		versuffix	-%{basever}
@@ -120,7 +120,7 @@ Source0:	http://www.kernel.org/pub/linux/kernel/v4.x/linux-%{basever}.tar.xz
 # Source0-md5:	fe9dc0f6729f36400ea81aa41d614c37
 %if "%{postver}" != ".0"
 Patch0:		http://www.kernel.org/pub/linux/kernel/v4.x/patch-%{version}.xz
-# Patch0-md5:	e1005015404c53692e8aa6dd14efff74
+# Patch0-md5:	3234544fd90dad9cab8fb4793f42ae79
 %endif
 Source1:	kernel.sysconfig
 
diff --git a/kernel-aufs4.patch b/kernel-aufs4.patch
index 505b512..9ebd5fc 100644
--- a/kernel-aufs4.patch
+++ b/kernel-aufs4.patch
@@ -1,4 +1,4 @@
-aufs4.x-rcN kbuild patch
+aufs4.1 kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
 index 011f433..b1083f6 100644
@@ -33,7 +33,7 @@ index 1a0006a..ddad01a 100644
  header-y += auto_fs4.h
  header-y += auto_fs.h
  header-y += auxvec.h
-aufs4.x-rcN base patch
+aufs4.1 base patch
 
 diff --git a/MAINTAINERS b/MAINTAINERS
 index d8afd29..feac5ea 100644
@@ -206,7 +206,7 @@ index da2751d..2e0fca6 100644
 +			 struct pipe_inode_info *pipe, size_t len,
 +			 unsigned int flags);
  #endif
-aufs4.x-rcN mmap patch
+aufs4.1 mmap patch
 
 diff --git a/fs/buffer.c b/fs/buffer.c
 index c7a5602..8c50a22 100644
@@ -383,25 +383,6 @@ index 6bf5e42..a863d0f 100644
  	lock_page(page);
  	if (page->mapping != inode->i_mapping) {
  		unlock_page(page);
-diff --git a/mm/madvise.c b/mm/madvise.c
-index d551475..1ebf71b 100644
---- a/mm/madvise.c
-+++ b/mm/madvise.c
-@@ -320,12 +320,12 @@ static long madvise_remove(struct vm_area_struct *vma,
- 	 * vma's reference to the file) can go away as soon as we drop
- 	 * mmap_sem.
- 	 */
--	get_file(f);
-+	vma_get_file(vma);
- 	up_read(&current->mm->mmap_sem);
- 	error = vfs_fallocate(f,
- 				FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
- 				offset, end - start);
--	fput(f);
-+	vma_fput(vma);
- 	down_read(&current->mm->mmap_sem);
- 	return error;
- }
 diff --git a/mm/memory.c b/mm/memory.c
 index 22e037e..62096a2 100644
 --- a/mm/memory.c
@@ -495,23 +476,6 @@ index bb50cac..1ab5e596 100644
  			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/msync.c b/mm/msync.c
-index bb04d53..5c24c54 100644
---- a/mm/msync.c
-+++ b/mm/msync.c
-@@ -84,10 +84,10 @@ SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
- 		start = vma->vm_end;
- 		if ((flags & MS_SYNC) && file &&
- 				(vma->vm_flags & VM_SHARED)) {
--			get_file(file);
-+			vma_get_file(vma);
- 			up_read(&mm->mmap_sem);
- 			error = vfs_fsync_range(file, fstart, fend, 1);
--			fput(file);
-+			vma_fput(vma);
- 			if (error || start >= end)
- 				goto out;
- 			down_read(&mm->mmap_sem);
 diff --git a/mm/nommu.c b/mm/nommu.c
 index e544508..dd6f74a 100644
 --- a/mm/nommu.c
@@ -558,7 +522,7 @@ index e544508..dd6f74a 100644
  	return ret;
 diff --git a/mm/prfile.c b/mm/prfile.c
 new file mode 100644
-index 0000000..6aa5ab5
+index 0000000..b323b8a
 --- /dev/null
 +++ b/mm/prfile.c
 @@ -0,0 +1,86 @@
@@ -583,7 +547,7 @@ index 0000000..6aa5ab5
 +{
 +#ifdef PRFILE_TRACE
 +	if (pr)
-+		pr_info("%s:%d: %s, %p\n", func, line, func2,
++		pr_info("%s:%d: %s, %s\n", func, line, func2,
 +			f ? (char *)f->f_path.dentry->d_name.name : "(null)");
 +#endif
 +}
@@ -648,7 +612,7 @@ index 0000000..6aa5ab5
 +		fput(pr);
 +}
 +#endif /* !CONFIG_MMU */
-aufs4.x-rcN standalone patch
+aufs4.1 standalone patch
 
 diff --git a/fs/dcache.c b/fs/dcache.c
 index bc261e2..8d7951d 100644
@@ -980,7 +944,7 @@ index 8e9b1f4..c1c7cd1 100644
  {
 diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Documentation/ABI/testing/debugfs-aufs
 --- /usr/share/empty/Documentation/ABI/testing/debugfs-aufs	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/debugfs-aufs	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/ABI/testing/debugfs-aufs	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,50 @@
 +What:		/debug/aufs/si_<id>/
 +Date:		March 2009
@@ -1034,7 +998,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/debugfs-aufs linux/Document
 +		will be empty. About XINO files, see the aufs manual.
 diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentation/ABI/testing/sysfs-aufs
 --- /usr/share/empty/Documentation/ABI/testing/sysfs-aufs	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/ABI/testing/sysfs-aufs	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/ABI/testing/sysfs-aufs	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,31 @@
 +What:		/sys/fs/aufs/si_<id>/
 +Date:		March 2009
@@ -1069,7 +1033,7 @@ diff -urN /usr/share/empty/Documentation/ABI/testing/sysfs-aufs linux/Documentat
 +		will be empty. About XINO files, see the aufs manual.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt linux/Documentation/filesystems/aufs/design/01intro.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/01intro.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/01intro.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,170 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1243,7 +1207,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/01intro.txt lin
 +about it. But currently I have implemented it in kernel space.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt linux/Documentation/filesystems/aufs/design/02struct.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/02struct.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/02struct.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,258 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1505,7 +1469,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/02struct.txt li
 +For this purpose, use "aumvdown" command in aufs-util.git.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.txt linux/Documentation/filesystems/aufs/design/03atomic_open.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/03atomic_open.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,85 @@
 +
 +# Copyright (C) 2015 Junjiro R. Okajima
@@ -1594,7 +1558,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03atomic_open.t
 +       be implemented in aufs, but not all I am afraid.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt linux/Documentation/filesystems/aufs/design/03lookup.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/03lookup.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/03lookup.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,113 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1711,7 +1675,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/03lookup.txt li
 +   by over-mounting something (or another method).
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt linux/Documentation/filesystems/aufs/design/04branch.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/04branch.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/04branch.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,74 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1789,7 +1753,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/04branch.txt li
 +    same named entry on the upper branch.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt linux/Documentation/filesystems/aufs/design/05wbr_policy.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/05wbr_policy.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,64 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -1857,7 +1821,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/05wbr_policy.tx
 +  copyup policy.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt linux/Documentation/filesystems/aufs/design/06fhsm.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06fhsm.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/06fhsm.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,120 @@
 +
 +# Copyright (C) 2011-2015 Junjiro R. Okajima
@@ -1981,7 +1945,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06fhsm.txt linu
 +should restore the original file state after an error happens.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linux/Documentation/filesystems/aufs/design/06mmap.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06mmap.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/06mmap.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,72 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2057,7 +2021,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06mmap.txt linu
 +I have to give up this "looks-smater" approach.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt linux/Documentation/filesystems/aufs/design/06xattr.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/06xattr.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/06xattr.txt	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,96 @@
 +
 +# Copyright (C) 2014-2015 Junjiro R. Okajima
@@ -2157,7 +2121,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/06xattr.txt lin
 +now, aufs implements the branch attributes to ignore the error.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt linux/Documentation/filesystems/aufs/design/07export.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/07export.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/07export.txt	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,58 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2219,7 +2183,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/07export.txt li
 +  lookup_one_len(), vfs_getattr(), encode_fh() and others.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linux/Documentation/filesystems/aufs/design/08shwh.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/08shwh.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/08shwh.txt	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,52 @@
 +
 +# Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2275,7 +2239,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/08shwh.txt linu
 +initramfs will use it to replace the old one at the next boot.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt linux/Documentation/filesystems/aufs/design/10dynop.txt
 --- /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/design/10dynop.txt	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/design/10dynop.txt	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,47 @@
 +
 +# Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -2326,7 +2290,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/design/10dynop.txt lin
 +regular files only.
 diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documentation/filesystems/aufs/README
 --- /usr/share/empty/Documentation/filesystems/aufs/README	1970-01-01 01:00:00.000000000 +0100
-+++ linux/Documentation/filesystems/aufs/README	2015-06-28 17:35:44.344717109 +0200
++++ linux/Documentation/filesystems/aufs/README	2015-09-24 10:47:58.244719488 +0200
 @@ -0,0 +1,383 @@
 +
 +Aufs4 -- advanced multi layered unification filesystem version 4.x
@@ -2691,7 +2655,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +The Parted Magic Project made a donation (2013/9 and 11).
 +Pavel Barta made a donation (2013/10).
 +Nikolay Pertsev made a donation (2014/5).
-+James B made a donation (2014/7).
++James B made a donation (2014/7 and 2015/7).
 +Stefano Di Biase made a donation (2014/8).
 +Daniel Epellei made a donation (2015/1).
 +
@@ -2713,7 +2677,7 @@ diff -urN /usr/share/empty/Documentation/filesystems/aufs/README linux/Documenta
 +# End: ;
 diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/aufs.h
 --- /usr/share/empty/fs/aufs/aufs.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/aufs.h	2015-06-28 17:35:44.344717109 +0200
++++ linux/fs/aufs/aufs.h	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,59 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -2776,7 +2740,7 @@ 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-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/branch.c	2015-12-10 18:46:31.223310574 +0100
 @@ -0,0 +1,1414 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -4194,7 +4158,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-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/branch.h	2015-12-10 18:46:31.223310574 +0100
 @@ -0,0 +1,279 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -4477,7 +4441,7 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 +#endif /* __AUFS_BRANCH_H__ */
 diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
 --- /usr/share/empty/fs/aufs/conf.mk	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/conf.mk	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/conf.mk	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,38 @@
 +
 +AuConfStr = CONFIG_AUFS_FS=${CONFIG_AUFS_FS}
@@ -4519,7 +4483,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-06-28 17:36:09.025073697 +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
@@ -5246,9 +5210,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;
 +			}
@@ -5842,7 +5806,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +}
 diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
 --- /usr/share/empty/fs/aufs/cpup.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/cpup.h	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,94 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -5940,7 +5904,7 @@ diff -urN /usr/share/empty/fs/aufs/cpup.h linux/fs/aufs/cpup.h
 +#endif /* __AUFS_CPUP_H__ */
 diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 --- /usr/share/empty/fs/aufs/dbgaufs.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dbgaufs.c	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,432 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6376,7 +6340,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.c linux/fs/aufs/dbgaufs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h
 --- /usr/share/empty/fs/aufs/dbgaufs.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dbgaufs.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dbgaufs.h	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,48 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6428,7 +6392,7 @@ diff -urN /usr/share/empty/fs/aufs/dbgaufs.h linux/fs/aufs/dbgaufs.h
 +#endif /* __DBGAUFS_H__ */
 diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
 --- /usr/share/empty/fs/aufs/dcsub.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dcsub.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dcsub.c	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,224 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6656,7 +6620,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
 --- /usr/share/empty/fs/aufs/dcsub.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dcsub.h	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dcsub.h	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,136 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -6796,7 +6760,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.h linux/fs/aufs/dcsub.h
 +#endif /* __AUFS_DCSUB_H__ */
 diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 --- /usr/share/empty/fs/aufs/debug.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/debug.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,440 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -7240,7 +7204,7 @@ diff -urN /usr/share/empty/fs/aufs/debug.c linux/fs/aufs/debug.c
 +}
 diff -urN /usr/share/empty/fs/aufs/debug.h linux/fs/aufs/debug.h
 --- /usr/share/empty/fs/aufs/debug.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/debug.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/debug.h	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,225 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -7469,8 +7433,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-06-28 17:36:09.025073697 +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
 + *
@@ -7665,7 +7629,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;
@@ -8171,6 +8135,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;
@@ -8526,8 +8512,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) {
@@ -8536,8 +8524,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;
++			}
 +		}
 +	}
 +
@@ -8576,10 +8566,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-06-28 17:35:44.348050491 +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
 + *
@@ -8626,7 +8621,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,
@@ -8636,6 +8631,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);
@@ -8815,7 +8811,7 @@ diff -urN /usr/share/empty/fs/aufs/dentry.h linux/fs/aufs/dentry.h
 +#endif /* __AUFS_DENTRY_H__ */
 diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
 --- /usr/share/empty/fs/aufs/dinfo.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dinfo.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dinfo.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,550 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -9369,7 +9365,7 @@ diff -urN /usr/share/empty/fs/aufs/dinfo.c linux/fs/aufs/dinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 --- /usr/share/empty/fs/aufs/dir.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/dir.c	2015-12-10 17:59:16.836166410 +0100
 @@ -0,0 +1,753 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -9488,9 +9484,9 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +	sb = a->dentry->d_sb;
 +	if (d_really_is_negative(a->dentry))
 +		goto out;
-+	aufs_read_lock(a->dentry, AuLock_DW | AuLock_DIR); /* noflush */
-+
 +	/* no dir->i_mutex lock */
++	aufs_read_lock(a->dentry, AuLock_DW); /* noflush */
++
 +	dir = d_inode(a->dentry);
 +	bstart = au_ibstart(dir);
 +	bindex = au_br_index(sb, a->brid);
@@ -10126,7 +10122,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.c linux/fs/aufs/dir.c
 +};
 diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h
 --- /usr/share/empty/fs/aufs/dir.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dir.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dir.h	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,131 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -10261,7 +10257,7 @@ diff -urN /usr/share/empty/fs/aufs/dir.h linux/fs/aufs/dir.h
 +#endif /* __AUFS_DIR_H__ */
 diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 --- /usr/share/empty/fs/aufs/dynop.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dynop.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,369 @@
 +/*
 + * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -10634,7 +10630,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 +}
 diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
 --- /usr/share/empty/fs/aufs/dynop.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/dynop.h	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,74 @@
 +/*
 + * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -10712,7 +10708,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
 +#endif /* __AUFS_DYNOP_H__ */
 diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 --- /usr/share/empty/fs/aufs/export.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/export.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/export.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,832 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -11548,7 +11544,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +}
 diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
 --- /usr/share/empty/fs/aufs/fhsm.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fhsm.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/fhsm.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,426 @@
 +/*
 + * Copyright (C) 2011-2015 Junjiro R. Okajima
@@ -11978,8 +11974,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-06-28 17:36:09.025073697 +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
 + *
@@ -12777,9 +12773,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,
@@ -12812,7 +12810,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,
@@ -12823,7 +12822,7 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +};
 diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
 --- /usr/share/empty/fs/aufs/file.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/file.h	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,291 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -13118,7 +13117,7 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
 +#endif /* __AUFS_FILE_H__ */
 diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
 --- /usr/share/empty/fs/aufs/finfo.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/finfo.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/finfo.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,157 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -13279,7 +13278,7 @@ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 --- /usr/share/empty/fs/aufs/f_op.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/f_op.c	2015-09-24 10:47:58.251386326 +0200
 @@ -0,0 +1,738 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -14021,7 +14020,7 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +};
 diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 --- /usr/share/empty/fs/aufs/fstype.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/fstype.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/fstype.h	2015-12-10 17:59:16.836166410 +0100
 @@ -0,0 +1,400 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -14051,8 +14050,8 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 +
 +#include <linux/fs.h>
 +#include <linux/magic.h>
-+#include <linux/romfs_fs.h>
 +#include <linux/nfs_fs.h>
++#include <linux/romfs_fs.h>
 +
 +static inline int au_test_aufs(struct super_block *sb)
 +{
@@ -14425,7 +14424,7 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h
 +#endif /* __AUFS_FSTYPE_H__ */
 diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 --- /usr/share/empty/fs/aufs/hfsnotify.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsnotify.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/hfsnotify.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,288 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -14717,7 +14716,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 +};
 diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
 --- /usr/share/empty/fs/aufs/hfsplus.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsplus.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/hfsplus.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,56 @@
 +/*
 + * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -14777,7 +14776,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsplus.c linux/fs/aufs/hfsplus.c
 +}
 diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 --- /usr/share/empty/fs/aufs/hnotify.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hnotify.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/hnotify.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,710 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -15491,7 +15490,7 @@ diff -urN /usr/share/empty/fs/aufs/hnotify.c linux/fs/aufs/hnotify.c
 +}
 diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
 --- /usr/share/empty/fs/aufs/iinfo.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/iinfo.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/iinfo.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,277 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -15772,8 +15771,8 @@ diff -urN /usr/share/empty/fs/aufs/iinfo.c linux/fs/aufs/iinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 --- /usr/share/empty/fs/aufs/inode.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.c	2015-06-28 17:36:09.025073697 +0200
-@@ -0,0 +1,500 @@
++++ linux/fs/aufs/inode.c	2015-12-10 17:59:16.836166410 +0100
+@@ -0,0 +1,528 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -15876,6 +15875,32 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +	return err;
 +}
 +
++void au_refresh_iop(struct inode *inode, int force_getattr)
++{
++	int type;
++	struct au_sbinfo *sbi = au_sbi(inode->i_sb);
++	const struct inode_operations *iop
++		= force_getattr ? aufs_iop : sbi->si_iop_array;
++
++	if (inode->i_op == iop)
++		return;
++
++	switch (inode->i_mode & S_IFMT) {
++	case S_IFDIR:
++		type = AuIop_DIR;
++		break;
++	case S_IFLNK:
++		type = AuIop_SYMLINK;
++		break;
++	default:
++		type = AuIop_OTHER;
++		break;
++	}
++
++	inode->i_op = iop + type;
++	/* unnecessary smp_wmb() */
++}
++
 +int au_refresh_hinode_self(struct inode *inode)
 +{
 +	int err, update;
@@ -15957,11 +15982,13 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +	struct dentry *h_dentry;
 +	struct inode *h_inode;
 +	struct au_iinfo *iinfo;
++	struct inode_operations *iop;
 +
 +	IiMustWriteLock(inode);
 +
 +	err = 0;
 +	isdir = 0;
++	iop = au_sbi(inode->i_sb)->si_iop_array;
 +	bstart = au_dbstart(dentry);
 +	h_dentry = au_h_dptr(dentry, bstart);
 +	h_inode = d_inode(h_dentry);
@@ -15969,7 +15996,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +	switch (mode & S_IFMT) {
 +	case S_IFREG:
 +		btail = au_dbtail(dentry);
-+		inode->i_op = &aufs_iop;
++		inode->i_op = iop + AuIop_OTHER;
 +		inode->i_fop = &aufs_file_fop;
 +		err = au_dy_iaop(inode, bstart, h_inode);
 +		if (unlikely(err))
@@ -15978,19 +16005,19 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +	case S_IFDIR:
 +		isdir = 1;
 +		btail = au_dbtaildir(dentry);
-+		inode->i_op = &aufs_dir_iop;
++		inode->i_op = iop + AuIop_DIR;
 +		inode->i_fop = &aufs_dir_fop;
 +		break;
 +	case S_IFLNK:
 +		btail = au_dbtail(dentry);
-+		inode->i_op = &aufs_symlink_iop;
++		inode->i_op = iop + AuIop_SYMLINK;
 +		break;
 +	case S_IFBLK:
 +	case S_IFCHR:
 +	case S_IFIFO:
 +	case S_IFSOCK:
 +		btail = au_dbtail(dentry);
-+		inode->i_op = &aufs_iop;
++		inode->i_op = iop + AuIop_OTHER;
 +		init_special_inode(inode, mode, h_inode->i_rdev);
 +		break;
 +	default:
@@ -16276,8 +16303,8 @@ diff -urN /usr/share/empty/fs/aufs/inode.c linux/fs/aufs/inode.c
 +}
 diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 --- /usr/share/empty/fs/aufs/inode.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/inode.h	2015-06-28 17:35:44.348050491 +0200
-@@ -0,0 +1,673 @@
++++ linux/fs/aufs/inode.h	2015-12-10 17:59:16.836166410 +0100
+@@ -0,0 +1,681 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -16410,6 +16437,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +
 +/* inode.c */
 +struct inode *au_igrab(struct inode *inode);
++void au_refresh_iop(struct inode *inode, int force_getattr);
 +int au_refresh_hinode_self(struct inode *inode);
 +int au_refresh_hinode(struct inode *inode, struct dentry *dentry);
 +int au_ino(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino,
@@ -16431,7 +16459,14 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +}
 +
 +/* i_op.c */
-+extern struct inode_operations aufs_iop, aufs_symlink_iop, aufs_dir_iop;
++enum {
++	AuIop_SYMLINK,
++	AuIop_DIR,
++	AuIop_OTHER,
++	AuIop_Last
++};
++extern struct inode_operations aufs_iop[AuIop_Last],
++	aufs_iop_nogetattr[AuIop_Last];
 +
 +/* au_wr_dir flags */
 +#define AuWrDir_ADD_ENTRY	1
@@ -16953,7 +16988,7 @@ diff -urN /usr/share/empty/fs/aufs/inode.h linux/fs/aufs/inode.h
 +#endif /* __AUFS_INODE_H__ */
 diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c
 --- /usr/share/empty/fs/aufs/ioctl.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/ioctl.c	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/ioctl.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,219 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -17176,7 +17211,7 @@ diff -urN /usr/share/empty/fs/aufs/ioctl.c linux/fs/aufs/ioctl.c
 +#endif
 diff -urN /usr/share/empty/fs/aufs/i_op_add.c linux/fs/aufs/i_op_add.c
 --- /usr/share/empty/fs/aufs/i_op_add.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_add.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/i_op_add.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,932 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -18112,8 +18147,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-06-28 17:36:09.025073697 +0200
-@@ -0,0 +1,1447 @@
++++ linux/fs/aufs/i_op.c	2015-12-10 18:46:31.223310574 +0100
+@@ -0,0 +1,1449 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -19486,84 +19521,86 @@ diff -urN /usr/share/empty/fs/aufs/i_op.c linux/fs/aufs/i_op.c
 +
 +/* ---------------------------------------------------------------------- */
 +
-+struct inode_operations aufs_symlink_iop = {
-+	.permission	= aufs_permission,
++/* no getattr version will be set by module.c:aufs_init() */
++struct inode_operations aufs_iop_nogetattr[AuIop_Last],
++	aufs_iop[] = {
++	[AuIop_SYMLINK] = {
++		.permission	= aufs_permission,
 +#ifdef CONFIG_FS_POSIX_ACL
-+	.get_acl	= aufs_get_acl,
-+	.set_acl	= aufs_set_acl, /* unsupport for symlink? */
++		.get_acl	= aufs_get_acl,
++		.set_acl	= aufs_set_acl, /* unsupport for symlink? */
 +#endif
 +
-+	.setattr	= aufs_setattr,
-+	.getattr	= aufs_getattr,
++		.setattr	= aufs_setattr,
++		.getattr	= aufs_getattr,
 +
 +#ifdef CONFIG_AUFS_XATTR
-+	.setxattr	= aufs_setxattr,
-+	.getxattr	= aufs_getxattr,
-+	.listxattr	= aufs_listxattr,
-+	.removexattr	= aufs_removexattr,
++		.setxattr	= aufs_setxattr,
++		.getxattr	= aufs_getxattr,
++		.listxattr	= aufs_listxattr,
++		.removexattr	= aufs_removexattr,
 +#endif
 +
-+	.readlink	= aufs_readlink,
-+	.follow_link	= aufs_follow_link,
-+	.put_link	= aufs_put_link,
-+
-+	/* .update_time	= aufs_update_time */
-+};
++		.readlink	= aufs_readlink,
++		.follow_link	= aufs_follow_link,
++		.put_link	= aufs_put_link,
 +
-+struct inode_operations aufs_dir_iop = {
-+	.create		= aufs_create,
-+	.lookup		= aufs_lookup,
-+	.link		= aufs_link,
-+	.unlink		= aufs_unlink,
-+	.symlink	= aufs_symlink,
-+	.mkdir		= aufs_mkdir,
-+	.rmdir		= aufs_rmdir,
-+	.mknod		= aufs_mknod,
-+	.rename		= aufs_rename,
-+
-+	.permission	= aufs_permission,
++		/* .update_time	= aufs_update_time */
++	},
++	[AuIop_DIR] = {
++		.create		= aufs_create,
++		.lookup		= aufs_lookup,
++		.link		= aufs_link,
++		.unlink		= aufs_unlink,
++		.symlink	= aufs_symlink,
++		.mkdir		= aufs_mkdir,
++		.rmdir		= aufs_rmdir,
++		.mknod		= aufs_mknod,
++		.rename		= aufs_rename,
++
++		.permission	= aufs_permission,
 +#ifdef CONFIG_FS_POSIX_ACL
-+	.get_acl	= aufs_get_acl,
-+	.set_acl	= aufs_set_acl,
++		.get_acl	= aufs_get_acl,
++		.set_acl	= aufs_set_acl,
 +#endif
 +
-+	.setattr	= aufs_setattr,
-+	.getattr	= aufs_getattr,
++		.setattr	= aufs_setattr,
++		.getattr	= aufs_getattr,
 +
 +#ifdef CONFIG_AUFS_XATTR
-+	.setxattr	= aufs_setxattr,
-+	.getxattr	= aufs_getxattr,
-+	.listxattr	= aufs_listxattr,
-+	.removexattr	= aufs_removexattr,
++		.setxattr	= aufs_setxattr,
++		.getxattr	= aufs_getxattr,
++		.listxattr	= aufs_listxattr,
++		.removexattr	= aufs_removexattr,
 +#endif
 +
-+	.update_time	= aufs_update_time,
-+	.atomic_open	= aufs_atomic_open,
-+	.tmpfile	= aufs_tmpfile
-+};
-+
-+struct inode_operations aufs_iop = {
-+	.permission	= aufs_permission,
++		.update_time	= aufs_update_time,
++		.atomic_open	= aufs_atomic_open,
++		.tmpfile	= aufs_tmpfile
++	},
++	[AuIop_OTHER] = {
++		.permission	= aufs_permission,
 +#ifdef CONFIG_FS_POSIX_ACL
-+	.get_acl	= aufs_get_acl,
-+	.set_acl	= aufs_set_acl,
++		.get_acl	= aufs_get_acl,
++		.set_acl	= aufs_set_acl,
 +#endif
 +
-+	.setattr	= aufs_setattr,
-+	.getattr	= aufs_getattr,
++		.setattr	= aufs_setattr,
++		.getattr	= aufs_getattr,
 +
 +#ifdef CONFIG_AUFS_XATTR
-+	.setxattr	= aufs_setxattr,
-+	.getxattr	= aufs_getxattr,
-+	.listxattr	= aufs_listxattr,
-+	.removexattr	= aufs_removexattr,
++		.setxattr	= aufs_setxattr,
++		.getxattr	= aufs_getxattr,
++		.listxattr	= aufs_listxattr,
++		.removexattr	= aufs_removexattr,
 +#endif
 +
-+	.update_time	= aufs_update_time
++		.update_time	= aufs_update_time
++	}
 +};
 diff -urN /usr/share/empty/fs/aufs/i_op_del.c linux/fs/aufs/i_op_del.c
 --- /usr/share/empty/fs/aufs/i_op_del.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/i_op_del.c	2015-06-28 17:36:09.025073697 +0200
++++ linux/fs/aufs/i_op_del.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,510 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -20077,8 +20114,8 @@ 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-06-28 17:36:09.025073697 +0200
-@@ -0,0 +1,1017 @@
++++ linux/fs/aufs/i_op_ren.c	2015-12-10 17:59:16.836166410 +0100
+@@ -0,0 +1,1015 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -20171,7 +20208,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.
 + */
@@ -20923,11 +20960,9 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +		if (unlikely(d_really_is_positive(a->dst_dentry)
 +			     && !d_is_dir(a->dst_dentry)))
 +			goto out_free;
-+		err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry,
-+						AuLock_DIR | flags);
-+	} else
-+		err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry,
-+						flags);
++		flags |= AuLock_DIRS;
++	}
++	err = aufs_read_and_write_lock2(a->dst_dentry, a->src_dentry, flags);
 +	if (unlikely(err))
 +		goto out_free;
 +
@@ -20953,7 +20988,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;
@@ -21098,7 +21133,7 @@ diff -urN /usr/share/empty/fs/aufs/i_op_ren.c linux/fs/aufs/i_op_ren.c
 +}
 diff -urN /usr/share/empty/fs/aufs/Kconfig linux/fs/aufs/Kconfig
 --- /usr/share/empty/fs/aufs/Kconfig	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Kconfig	2015-06-28 17:35:44.344717109 +0200
++++ linux/fs/aufs/Kconfig	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,185 @@
 +config AUFS_FS
 +	tristate "Aufs (Advanced multi layered unification filesystem) support"
@@ -21287,8 +21322,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-06-28 17:35:44.348050491 +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
 + *
@@ -21418,7 +21453,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,
@@ -21431,12 +21466,13 @@ 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
 --- /usr/share/empty/fs/aufs/loop.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/loop.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/loop.h	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,52 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -21492,7 +21528,7 @@ diff -urN /usr/share/empty/fs/aufs/loop.h linux/fs/aufs/loop.h
 +#endif /* __AUFS_LOOP_H__ */
 diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk
 --- /usr/share/empty/fs/aufs/magic.mk	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/magic.mk	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/magic.mk	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,30 @@
 +
 +# defined in ${srctree}/fs/fuse/inode.c
@@ -21526,7 +21562,7 @@ diff -urN /usr/share/empty/fs/aufs/magic.mk linux/fs/aufs/magic.mk
 +endif
 diff -urN /usr/share/empty/fs/aufs/Makefile linux/fs/aufs/Makefile
 --- /usr/share/empty/fs/aufs/Makefile	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/Makefile	2015-06-28 17:35:44.344717109 +0200
++++ linux/fs/aufs/Makefile	2015-09-24 10:47:58.248052907 +0200
 @@ -0,0 +1,44 @@
 +
 +include ${src}/magic.mk
@@ -21574,8 +21610,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-06-28 17:35:44.348050491 +0200
-@@ -0,0 +1,210 @@
++++ linux/fs/aufs/module.c	2015-12-10 18:46:31.223310574 +0100
+@@ -0,0 +1,222 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -21698,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;
 +}
 +
 +/* ---------------------------------------------------------------------- */
@@ -21717,6 +21761,10 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 +
 +	au_dir_roflags = au_file_roflags(O_DIRECTORY | O_LARGEFILE);
 +
++	memcpy(aufs_iop_nogetattr, aufs_iop, sizeof(aufs_iop));
++	for (i = 0; i < AuIop_Last; i++)
++		aufs_iop_nogetattr[i].getattr = NULL;
++
 +	au_sbilist_init();
 +	sysaufs_brs_init();
 +	au_debug_init();
@@ -21788,7 +21836,7 @@ diff -urN /usr/share/empty/fs/aufs/module.c linux/fs/aufs/module.c
 +module_exit(aufs_exit);
 diff -urN /usr/share/empty/fs/aufs/module.h linux/fs/aufs/module.h
 --- /usr/share/empty/fs/aufs/module.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/module.h	2015-06-28 17:35:44.348050491 +0200
++++ linux/fs/aufs/module.h	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,104 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -21896,8 +21944,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-06-28 17:36:09.025073697 +0200
-@@ -0,0 +1,694 @@
++++ linux/fs/aufs/mvdown.c	2015-12-10 17:59:16.839499823 +0100
+@@ -0,0 +1,703 @@
 +/*
 + * Copyright (C) 2011-2015 Junjiro R. Okajima
 + *
@@ -22266,6 +22314,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);
@@ -22521,7 +22575,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;
@@ -22543,7 +22599,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;
@@ -22557,8 +22613,8 @@ 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);
-+	err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH);
++	mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
++	err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW);
 +	if (unlikely(err))
 +		goto out_inode;
 +
@@ -22572,15 +22628,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:
@@ -22594,8 +22651,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-06-28 17:36:09.028407078 +0200
-@@ -0,0 +1,1835 @@
++++ linux/fs/aufs/opts.c	2015-12-10 17:59:16.839499823 +0100
+@@ -0,0 +1,1859 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -24166,10 +24223,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;
@@ -24199,6 +24256,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;
@@ -24247,6 +24306,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);
@@ -24270,6 +24338,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--) {
@@ -24381,6 +24454,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;
@@ -24388,9 +24462,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) {
@@ -24406,10 +24480,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_IDOP);
++
 +	if (au_ftest_opts(opts->flags, TRUNC_XIB)) {
 +		rerr = au_xib_trunc(sb);
 +		if (unlikely(rerr && !err))
@@ -24418,7 +24496,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_IDOP)
++		    ))
 +		au_fset_opts(opts->flags, REFRESH);
 +
 +	AuDbg("status 0x%x\n", opts->flags);
@@ -24433,8 +24514,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-06-28 17:35:44.351383872 +0200
-@@ -0,0 +1,210 @@
++++ linux/fs/aufs/opts.h	2015-12-10 17:59:16.839499823 +0100
+@@ -0,0 +1,211 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -24611,6 +24692,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_IDOP	(1 << 4)
 +#define au_ftest_opts(flags, name)	((flags) & AuOpts_##name)
 +#define au_fset_opts(flags, name) \
 +	do { (flags) |= AuOpts_##name; } while (0)
@@ -24647,7 +24729,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h
 +#endif /* __AUFS_OPTS_H__ */
 diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 --- /usr/share/empty/fs/aufs/plink.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/plink.c	2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/plink.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,528 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -25179,7 +25261,7 @@ diff -urN /usr/share/empty/fs/aufs/plink.c linux/fs/aufs/plink.c
 +}
 diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c
 --- /usr/share/empty/fs/aufs/poll.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/poll.c	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/poll.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,52 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -25235,7 +25317,7 @@ diff -urN /usr/share/empty/fs/aufs/poll.c linux/fs/aufs/poll.c
 +}
 diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 --- /usr/share/empty/fs/aufs/posix_acl.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/posix_acl.c	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/posix_acl.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,99 @@
 +/*
 + * Copyright (C) 2014-2015 Junjiro R. Okajima
@@ -25338,7 +25420,7 @@ diff -urN /usr/share/empty/fs/aufs/posix_acl.c linux/fs/aufs/posix_acl.c
 +}
 diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c
 --- /usr/share/empty/fs/aufs/procfs.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/procfs.c	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/procfs.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,169 @@
 +/*
 + * Copyright (C) 2010-2015 Junjiro R. Okajima
@@ -25511,7 +25593,7 @@ diff -urN /usr/share/empty/fs/aufs/procfs.c linux/fs/aufs/procfs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
 --- /usr/share/empty/fs/aufs/rdu.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rdu.c	2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/rdu.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,388 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -25903,7 +25985,7 @@ diff -urN /usr/share/empty/fs/aufs/rdu.c linux/fs/aufs/rdu.c
 +#endif
 diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/aufs/rwsem.h
 --- /usr/share/empty/fs/aufs/rwsem.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/rwsem.h	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/rwsem.h	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,191 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -26098,8 +26180,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-06-28 17:36:09.028407078 +0200
-@@ -0,0 +1,356 @@
++++ linux/fs/aufs/sbinfo.c	2015-12-10 18:46:31.223310574 +0100
+@@ -0,0 +1,362 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -26224,6 +26306,9 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 +
 +	au_sphl_init(&sbinfo->si_files);
 +
++	/* with getattr by default */
++	sbinfo->si_iop_array = aufs_iop;
++
 +	/* leave other members for sysaufs and si_mnt. */
 +	sbinfo->si_sb = sb;
 +	sb->s_fs_info = sbinfo;
@@ -26348,7 +26433,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);
 +	}
@@ -26389,7 +26477,7 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 +	if (unlikely(err))
 +		goto out;
 +
-+	di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIR));
++	di_write_lock2_child(d1, d2, au_ftest_lock(flags, DIRS));
 +
 +	if (au_ftest_lock(flags, GEN)) {
 +		sigen = au_sigen(sb);
@@ -26458,7 +26546,7 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/spl.h linux/fs/aufs/spl.h
 --- /usr/share/empty/fs/aufs/spl.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/spl.h	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/spl.h	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,111 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -26573,8 +26661,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-06-28 17:36:09.028407078 +0200
-@@ -0,0 +1,1004 @@
++++ linux/fs/aufs/super.c	2015-12-10 18:46:31.223310574 +0100
+@@ -0,0 +1,1046 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -26681,7 +26769,7 @@ 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)
@@ -27158,7 +27246,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_idop)
 +{
 +	int err;
 +	struct dentry *parent;
@@ -27181,11 +27269,17 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	}
 +	dput(parent);
 +
++	if (!err) {
++		if (do_idop)
++			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_idop)
 +{
 +	int err, i, j, ndentry, e;
 +	unsigned int sigen;
@@ -27196,6 +27290,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_idop)
++		au_refresh_dop(root, /*force_reval*/0);
++
 +	err = au_dpages_init(&dpages, GFP_NOFS);
 +	if (unlikely(err))
 +		goto out;
@@ -27211,7 +27308,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_idop);
 +			if (unlikely(e && !err))
 +				err = e;
 +			/* go on even err */
@@ -27224,7 +27322,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	return err;
 +}
 +
-+static int au_refresh_i(struct super_block *sb)
++static int au_refresh_i(struct super_block *sb, unsigned int do_idop)
 +{
 +	int err, e;
 +	unsigned int sigen;
@@ -27242,17 +27340,22 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +		inode = array[ull];
 +		if (unlikely(!inode))
 +			break;
++
++		e = 0;
++		ii_write_lock_child(inode);
 +		if (au_iigen(inode, NULL) != sigen) {
-+			ii_write_lock_child(inode);
 +			e = au_refresh_hinode_self(inode);
-+			ii_write_unlock(inode);
 +			if (unlikely(e)) {
++				au_refresh_iop(inode, /*force_getattr*/1);
 +				pr_err("error %d, i%lu\n", e, inode->i_ino);
 +				if (!err)
 +					err = e;
 +				/* go on even if err */
 +			}
 +		}
++		if (!e && do_idop)
++			au_refresh_iop(inode, /*force_getattr*/0);
++		ii_write_unlock(inode);
 +	}
 +
 +	au_iarray_free(array, max);
@@ -27261,7 +27364,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_idop)
 +{
 +	int err, e;
 +	unsigned int udba;
@@ -27269,9 +27372,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);
@@ -27290,9 +27395,25 @@ 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_idop) {
++		if (au_ftest_si(sbi, NO_DREVAL)) {
++			AuDebugOn(sb->s_d_op == &aufs_dop_noreval);
++			sb->s_d_op = &aufs_dop_noreval;
++			AuDebugOn(sbi->si_iop_array == aufs_iop_nogetattr);
++			sbi->si_iop_array = aufs_iop_nogetattr;
++		} else {
++			AuDebugOn(sb->s_d_op == &aufs_dop);
++			sb->s_d_op = &aufs_dop;
++			AuDebugOn(sbi->si_iop_array == aufs_iop);
++			sbi->si_iop_array = aufs_iop;
++		}
++		pr_info("reset to %pf and %pf\n",
++			sb->s_d_op, sbi->si_iop_array);
++	}
++
 +	di_write_unlock(root);
-+	err = au_refresh_d(sb);
-+	e = au_refresh_i(sb);
++	err = au_refresh_d(sb, do_idop);
++	e = au_refresh_i(sb, do_idop);
 +	if (unlikely(e && !err))
 +		err = e;
 +	/* aufs_write_lock() calls ..._child() */
@@ -27367,7 +27488,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_IDOP));
 +
 +	if (au_ftest_opts(opts.flags, REFRESH_DYAOP)) {
 +		mntflags = au_mntflags(sb);
@@ -27414,7 +27535,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +	if (IS_ERR(inode))
 +		goto out;
 +
-+	inode->i_op = &aufs_dir_iop;
++	inode->i_op = aufs_iop + AuIop_DIR; /* with getattr by default */
 +	inode->i_fop = &aufs_dir_fop;
 +	inode->i_mode = S_IFDIR;
 +	set_nlink(inode, 2);
@@ -27443,6 +27564,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;
@@ -27464,6 +27586,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;
@@ -27499,6 +27622,13 @@ 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);
++		sbinfo->si_iop_array = aufs_iop_nogetattr;
++		au_refresh_iop(inode, /*force_getattr*/0);
++	}
 +	aufs_write_unlock(root);
 +	mutex_unlock(&inode->i_mutex);
 +	if (!err)
@@ -27508,8 +27638,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);
@@ -27558,7 +27688,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_idop*/0);
 +		}
 +		if (au_opt_test(sbinfo->si_mntflags, PLINK))
 +			au_plink_put(sb, /*verbose*/1);
@@ -27581,8 +27711,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-06-28 17:36:09.028407078 +0200
-@@ -0,0 +1,635 @@
++++ linux/fs/aufs/super.h	2015-12-10 18:46:31.223310574 +0100
+@@ -0,0 +1,638 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -27773,6 +27903,9 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +	/* file list */
 +	struct au_sphlhead	si_files;
 +
++	/* with/without getattr, brother of sb->s_d_op */
++	struct inode_operations *si_iop_array;
++
 +	/*
 +	 * sysfs and lifetime management.
 +	 * this is not a small structure and it may be a waste of memory in case
@@ -27804,8 +27937,8 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 + * if it is false, refreshing dirs at access time is unnecesary
 + */
 +#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
@@ -27841,7 +27974,7 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +#define AuLock_IR		(1 << 1)	/* read-lock inode */
 +#define AuLock_IW		(1 << 2)	/* write-lock inode */
 +#define AuLock_FLUSH		(1 << 3)	/* wait for 'nowait' tasks */
-+#define AuLock_DIR		(1 << 4)	/* target is a dir */
++#define AuLock_DIRS		(1 << 4)	/* target is a pair of dirs */
 +#define AuLock_NOPLM		(1 << 5)	/* return err in plm mode */
 +#define AuLock_NOPLMW		(1 << 6)	/* wait for plm mode ends */
 +#define AuLock_GEN		(1 << 7)	/* test digen/iigen */
@@ -28220,7 +28353,7 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +#endif /* __AUFS_SUPER_H__ */
 diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
 --- /usr/share/empty/fs/aufs/sysaufs.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysaufs.c	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/sysaufs.c	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,104 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28328,7 +28461,7 @@ diff -urN /usr/share/empty/fs/aufs/sysaufs.c linux/fs/aufs/sysaufs.c
 +}
 diff -urN /usr/share/empty/fs/aufs/sysaufs.h linux/fs/aufs/sysaufs.h
 --- /usr/share/empty/fs/aufs/sysaufs.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/sysaufs.h	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/sysaufs.h	2015-09-24 10:47:58.254719746 +0200
 @@ -0,0 +1,101 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28433,8 +28566,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-06-28 17:35:44.351383872 +0200
-@@ -0,0 +1,372 @@
++++ linux/fs/aufs/sysfs.c	2015-12-10 18:46:31.223310574 +0100
+@@ -0,0 +1,376 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
 + *
@@ -28534,9 +28667,11 @@ 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);
++			err = seq_printf(seq, "=%s\n", perm.a);
++		}
 +		break;
 +	case AuBrSysfs_BRID:
 +		err = seq_printf(seq, "%d\n", br->br_id);
@@ -28697,7 +28832,9 @@ 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 = au_seq_path(seq, &br->br_path);
++		if (unlikely(err))
++			break;
 +		err = seq_putc(seq, '\0');
 +		if (!err && seq->count <= sz) {
 +			err = copy_to_user(arg->path, seq->buf, seq->count);
@@ -28809,7 +28946,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-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/sysrq.c	2015-12-10 18:46:31.223310574 +0100
 @@ -0,0 +1,157 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -28970,7 +29107,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-06-28 17:35:44.351383872 +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
@@ -29027,7 +29164,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;
@@ -29353,7 +29490,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); */
 +	}
@@ -29862,7 +29999,7 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 --- /usr/share/empty/fs/aufs/vfsub.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.c	2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/vfsub.c	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,848 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -30714,7 +30851,7 @@ 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-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/vfsub.h	2015-12-10 18:46:31.223310574 +0100
 @@ -0,0 +1,286 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -31004,7 +31141,7 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +#endif /* __AUFS_VFSUB_H__ */
 diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
 --- /usr/share/empty/fs/aufs/wbr_policy.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wbr_policy.c	2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/wbr_policy.c	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,765 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -31773,7 +31910,7 @@ diff -urN /usr/share/empty/fs/aufs/wbr_policy.c linux/fs/aufs/wbr_policy.c
 +};
 diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 --- /usr/share/empty/fs/aufs/whout.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.c	2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/whout.c	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,1063 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -32840,7 +32977,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.c linux/fs/aufs/whout.c
 +}
 diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
 --- /usr/share/empty/fs/aufs/whout.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/whout.h	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/whout.h	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,85 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -32929,7 +33066,7 @@ diff -urN /usr/share/empty/fs/aufs/whout.h linux/fs/aufs/whout.h
 +#endif /* __AUFS_WHOUT_H__ */
 diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c
 --- /usr/share/empty/fs/aufs/wkq.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wkq.c	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/wkq.c	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,213 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -33146,7 +33283,7 @@ diff -urN /usr/share/empty/fs/aufs/wkq.c linux/fs/aufs/wkq.c
 +}
 diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
 --- /usr/share/empty/fs/aufs/wkq.h	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/wkq.h	2015-06-28 17:35:44.351383872 +0200
++++ linux/fs/aufs/wkq.h	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,91 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -33241,7 +33378,7 @@ diff -urN /usr/share/empty/fs/aufs/wkq.h linux/fs/aufs/wkq.h
 +#endif /* __AUFS_WKQ_H__ */
 diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 --- /usr/share/empty/fs/aufs/xattr.c	1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xattr.c	2015-06-28 17:36:09.028407078 +0200
++++ linux/fs/aufs/xattr.c	2015-09-24 10:47:58.258053165 +0200
 @@ -0,0 +1,344 @@
 +/*
 + * Copyright (C) 2014-2015 Junjiro R. Okajima
@@ -33589,8 +33726,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-06-28 17:36:09.028407078 +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
 + *
@@ -34875,10 +35012,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,
@@ -34890,7 +35026,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-06-28 17:36:09.028407078 +0200
++++ linux/include/uapi/linux/aufs_type.h	2015-12-10 18:46:31.223310574 +0100
 @@ -0,0 +1,419 @@
 +/*
 + * Copyright (C) 2005-2015 Junjiro R. Okajima
@@ -34933,7 +35069,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-20150622"
++#define AUFS_VERSION	"4.1-20151116"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC	('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -35311,7 +35447,7 @@ 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.1 loopback patch
 
 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
 index 0160952..866f8e2 100644
@@ -35506,11 +35642,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);
  }
 +
@@ -35555,10 +35691,10 @@ index 6d9864d..3322557 100644
  
  #endif /* __KERNEL__ */
 diff --git a/fs/aufs/super.c b/fs/aufs/super.c
-index ee5780d..da35759 100644
+index 7efab49..ed357c7 100644
 --- a/fs/aufs/super.c
 +++ b/fs/aufs/super.c
-@@ -807,7 +807,10 @@ static const struct super_operations aufs_sop = {
+@@ -840,7 +840,10 @@ static const struct super_operations aufs_sop = {
  	.statfs		= aufs_statfs,
  	.put_super	= aufs_put_super,
  	.sync_fs	= aufs_sync_fs,
diff --git a/kernel-imq.patch b/kernel-imq.patch
index d28350b..fdb37d7 100644
--- a/kernel-imq.patch
+++ b/kernel-imq.patch
@@ -142,10 +142,10 @@ index e25fdd7..b411742 100644
  obj-$(CONFIG_MII) += mii.o
 diff --git a/drivers/net/imq.c b/drivers/net/imq.c
 new file mode 100644
-index 0000000..b010f39
+index 0000000..7702afd
 --- /dev/null
 +++ b/drivers/net/imq.c
-@@ -0,0 +1,903 @@
+@@ -0,0 +1,910 @@
 +/*
 + *             Pseudo-driver for the intermediate queue device.
 + *
@@ -798,12 +798,19 @@ index 0000000..b010f39
 +				*/
 +				if (imq_dev_accurate_stats && txq->xmit_lock_owner != cpu) {
 +					HARD_TX_LOCK(dev, txq, cpu);
-+					dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++					if (!netif_xmit_frozen_or_stopped(txq)) {
++						dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++					}
 +					HARD_TX_UNLOCK(dev, txq);
 +				} else {
-+					dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++					if (!netif_xmit_frozen_or_stopped(txq)) {
++						dev_hard_start_xmit(skb_popd, dev, txq, &dummy_ret);
++					}
 +				}
 +			}
++		} else {
++			/* No ready skb, then schedule it */
++			__netif_schedule(q);
 +		}
 +#endif
 +		rcu_read_unlock_bh();
@@ -1140,7 +1147,7 @@ index 0000000..198ac01
 +#endif /* _IP6T_IMQ_H */
 +
 diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
-index f15154a..d76d31a 100644
+index 4307e20..ebfe3f9 100644
 --- a/include/linux/skbuff.h
 +++ b/include/linux/skbuff.h
 @@ -35,6 +35,9 @@
@@ -1196,7 +1203,7 @@ index f15154a..d76d31a 100644
  extern struct kmem_cache *skbuff_head_cache;
  
  void kfree_skb_partial(struct sk_buff *skb, bool head_stolen);
-@@ -3216,6 +3234,10 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
+@@ -3215,6 +3233,10 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src,
  	if (copy)
  		dst->nfctinfo = src->nfctinfo;
  #endif
@@ -1208,10 +1215,10 @@ index f15154a..d76d31a 100644
  	dst->nf_bridge  = src->nf_bridge;
  	nf_bridge_get(src->nf_bridge);
 diff --git a/include/net/netfilter/nf_queue.h b/include/net/netfilter/nf_queue.h
-index d81d584..1adc20d 100644
+index e863585..40904cb 100644
 --- a/include/net/netfilter/nf_queue.h
 +++ b/include/net/netfilter/nf_queue.h
-@@ -29,6 +29,12 @@ struct nf_queue_handler {
+@@ -31,6 +31,12 @@ struct nf_queue_handler {
  void nf_register_queue_handler(const struct nf_queue_handler *qh);
  void nf_unregister_queue_handler(void);
  void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict);
@@ -1252,7 +1259,7 @@ index ef1b1f8..079e5ff 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 aa82f9a..c931d04 100644
+index a42b232..259883b 100644
 --- a/net/core/dev.c
 +++ b/net/core/dev.c
 @@ -135,6 +135,9 @@
@@ -1265,7 +1272,7 @@ index aa82f9a..c931d04 100644
  
  #include "net-sysfs.h"
  
-@@ -2646,7 +2649,12 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev,
+@@ -2642,7 +2645,12 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev,
  	unsigned int len;
  	int rc;
  
@@ -1278,7 +1285,7 @@ index aa82f9a..c931d04 100644
  		dev_queue_xmit_nit(skb, dev);
  
  	len = skb->len;
-@@ -2684,6 +2692,7 @@ out:
+@@ -2680,6 +2688,7 @@ out:
  	*ret = rc;
  	return skb;
  }
@@ -1286,7 +1293,7 @@ index aa82f9a..c931d04 100644
  
  static struct sk_buff *validate_xmit_vlan(struct sk_buff *skb,
  					  netdev_features_t features)
-@@ -2772,6 +2781,7 @@ struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *d
+@@ -2768,6 +2777,7 @@ struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *d
  	}
  	return head;
  }
@@ -1295,10 +1302,10 @@ index aa82f9a..c931d04 100644
  static void qdisc_pkt_len_init(struct sk_buff *skb)
  {
 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
-index 41ec022..307f02d 100644
+index 075d2e7..f19a692 100644
 --- a/net/core/skbuff.c
 +++ b/net/core/skbuff.c
-@@ -79,6 +79,86 @@
+@@ -79,6 +79,87 @@
  
  struct kmem_cache *skbuff_head_cache __read_mostly;
  static struct kmem_cache *skbuff_fclone_cache __read_mostly;
@@ -1361,6 +1368,7 @@ index 41ec022..307f02d 100644
 +}
 +EXPORT_SYMBOL(skb_restore_cb);
 +
++static void skb_copy_stored_cb(struct sk_buff *   , const struct sk_buff *     ) __attribute__ ((unused));
 +static void skb_copy_stored_cb(struct sk_buff *new, const struct sk_buff *__old)
 +{
 +	struct skb_cb_table *next;
@@ -1385,7 +1393,7 @@ index 41ec022..307f02d 100644
  
  /**
   *	skb_panic - private function for out-of-line support
-@@ -691,6 +771,28 @@ static void skb_release_head_state(struct sk_buff *skb)
+@@ -691,6 +772,28 @@ static void skb_release_head_state(struct sk_buff *skb)
  		WARN_ON(in_irq());
  		skb->destructor(skb);
  	}
@@ -1397,7 +1405,7 @@ index 41ec022..307f02d 100644
 +	while (skb->cb_next != NULL) {
 +		if (net_ratelimit())
 +			pr_warn("IMQ: kfree_skb: skb->cb_next: %08x\n",
-+				(unsigned int)skb->cb_next);
++				(unsigned int)(uintptr_t)skb->cb_next);
 +
 +		skb_restore_cb(skb);
 +	}
@@ -1414,7 +1422,7 @@ index 41ec022..307f02d 100644
  #if IS_ENABLED(CONFIG_NF_CONNTRACK)
  	nf_conntrack_put(skb->nfct);
  #endif
-@@ -813,6 +915,10 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
+@@ -813,6 +916,10 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
  	new->sp			= secpath_get(old->sp);
  #endif
  	__nf_copy(new, old, false);
@@ -1425,7 +1433,7 @@ index 41ec022..307f02d 100644
  
  	/* Note : this field could be in headers_start/headers_end section
  	 * It is not yet because we do not want to have a 16 bit hole
-@@ -3342,6 +3448,13 @@ void __init skb_init(void)
+@@ -3343,6 +3450,13 @@ void __init skb_init(void)
  						0,
  						SLAB_HWCACHE_ALIGN|SLAB_PANIC,
  						NULL);
@@ -1503,10 +1511,10 @@ index a87d8b8..d1080ff 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 e616301..302798c 100644
+index 5d0c6fd..42d1c21 100644
 --- a/net/netfilter/core.c
 +++ b/net/netfilter/core.c
-@@ -178,9 +178,11 @@ next_hook:
+@@ -179,9 +179,11 @@ next_hook:
  		ret = NF_DROP_GETERR(verdict);
  		if (ret == 0)
  			ret = -EPERM;
@@ -1521,7 +1529,7 @@ index e616301..302798c 100644
  			if (err == -ECANCELED)
  				goto next_hook;
 diff --git a/net/netfilter/nf_internals.h b/net/netfilter/nf_internals.h
-index ea7f367..06fe0d6 100644
+index 3992106..35cbc7b 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,
@@ -1534,7 +1542,7 @@ index ea7f367..06fe0d6 100644
  int __init netfilter_queue_init(void);
  
 diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c
-index 2e88032..8524715 100644
+index cd60d39..2b0987d 100644
 --- a/net/netfilter/nf_queue.c
 +++ b/net/netfilter/nf_queue.c
 @@ -28,6 +28,23 @@
@@ -1561,7 +1569,7 @@ index 2e88032..8524715 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)
-@@ -112,7 +129,8 @@ EXPORT_SYMBOL_GPL(nf_queue_entry_get_refs);
+@@ -129,7 +146,8 @@ void nf_queue_nf_hook_drop(struct nf_hook_ops *ops)
  int nf_queue(struct sk_buff *skb,
  	     struct nf_hook_ops *elem,
  	     struct nf_hook_state *state,
@@ -1571,7 +1579,7 @@ index 2e88032..8524715 100644
  {
  	int status = -ENOENT;
  	struct nf_queue_entry *entry = NULL;
-@@ -122,7 +140,17 @@ int nf_queue(struct sk_buff *skb,
+@@ -139,7 +157,17 @@ int nf_queue(struct sk_buff *skb,
  	/* QUEUE == DROP if no one is waiting, to be safe. */
  	rcu_read_lock();
  
@@ -1590,7 +1598,7 @@ index 2e88032..8524715 100644
  	if (!qh) {
  		status = -ESRCH;
  		goto err_unlock;
-@@ -208,8 +236,10 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
+@@ -225,8 +253,10 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict)
  		local_bh_enable();
  		break;
  	case NF_QUEUE:
================================================================

---- gitweb:

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



More information about the pld-cvs-commit mailing list