]> git.pld-linux.org Git - packages/kernel.git/commitdiff
- up to 4.1.14 (aufs and imq updated) auto/th/kernel-4.1-4.1.14-1 auto/th/kernel-4.1-nopae-4.1.14-1
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Thu, 10 Dec 2015 18:21:19 +0000 (19:21 +0100)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Thu, 10 Dec 2015 18:21:19 +0000 (19:21 +0100)
kernel-aufs4.patch
kernel-imq.patch
kernel.spec

index 505b512adf81c141f1c6dab3737e6e850dcd7f66..9ebd5fcb32d343e69d4adcf6c40f09218caf5303 100644 (file)
@@ -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,
index d28350b25b4b2e297c6e6bf67c05c748894e6a49..fdb37d7d3b62c4a5cfc96a0cf6de53450876dff8 100644 (file)
@@ -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:
index ac465f7155414f57bf6afe5cb3615d1ca598c279..bc7c04b456b55e188485646c39ee794bd7acf637 100644 (file)
@@ -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
 
This page took 0.364538 seconds and 4 git commands to generate.