+}
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-09-24 10:47:58.251386326 +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
+ 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);
+};
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-09-24 10:47:58.254719746 +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
+
+#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)
+{
+}
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-09-24 10:47:58.254719746 +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
+ *
+ 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;
+ 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);
+ 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))
+ 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:
+}
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-09-24 10:47:58.254719746 +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
+ *
+
+/* 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,
+}
+
+/* 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
+}
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-11-11 17:21:46.918863802 +0100
-@@ -0,0 +1,1482 @@
++++ linux/fs/aufs/i_op.c 2015-12-10 17:59:16.836166410 +0100
+@@ -0,0 +1,1484 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+
+/* ---------------------------------------------------------------------- */
+
-+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 = generic_readlink,
-+ .follow_link = aufs_follow_link,
-+ .put_link = aufs_put_link,
++ .readlink = generic_readlink,
++ .follow_link = aufs_follow_link,
++ .put_link = aufs_put_link,
+
-+ /* .update_time = aufs_update_time */
-+};
-+
-+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
+}
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-11-11 17:21:46.918863802 +0100
-@@ -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
+ *
+ 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;
+
+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-11-11 17:21:46.918863802 +0100
-@@ -0,0 +1,217 @@
++++ linux/fs/aufs/module.c 2015-12-10 17:59:16.839499823 +0100
+@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+
+ 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();
+#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-11-11 17:21:46.918863802 +0100
++++ linux/fs/aufs/mvdown.c 2015-12-10 17:59:16.839499823 +0100
@@ -0,0 +1,703 @@
+/*
+ * Copyright (C) 2011-2015 Junjiro R. Okajima
+ }
+
+ mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
-+ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH);
++ err = aufs_read_lock(dentry, AuLock_DW | AuLock_FLUSH | AuLock_NOPLMW);
+ if (unlikely(err))
+ goto out_inode;
+
+}
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-11-11 17:21:46.918863802 +0100
++++ linux/fs/aufs/opts.c 2015-12-10 17:59:16.839499823 +0100
@@ -0,0 +1,1859 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ err = rerr;
+
+ if (no_dreval != !!au_ftest_si(sbinfo, NO_DREVAL))
-+ au_fset_opts(opts->flags, REFRESH_DOP);
++ au_fset_opts(opts->flags, REFRESH_IDOP);
+
+ if (au_ftest_opts(opts->flags, TRUNC_XIB)) {
+ rerr = au_xib_trunc(sb);
+ if (!au_ftest_opts(opts->flags, REFRESH)
+ && (opts->given_udba
+ || au_opt_test(sbinfo->si_mntflags, XINO)
-+ || au_ftest_opts(opts->flags, REFRESH_DOP)
++ || au_ftest_opts(opts->flags, REFRESH_IDOP)
+ ))
+ au_fset_opts(opts->flags, REFRESH);
+
+}
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-11-11 17:21:46.918863802 +0100
++++ linux/fs/aufs/opts.h 2015-12-10 17:59:16.839499823 +0100
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+#define AuOpts_REFRESH (1 << 1)
+#define AuOpts_TRUNC_XIB (1 << 2)
+#define AuOpts_REFRESH_DYAOP (1 << 3)
-+#define AuOpts_REFRESH_DOP (1 << 4)
++#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)
+#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-11-11 17:21:46.922197217 +0100
-@@ -0,0 +1,363 @@
++++ linux/fs/aufs/sbinfo.c 2015-12-10 17:59:16.839499823 +0100
+@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+
+ 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;
+ 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);
+#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-11-11 17:21:46.922197217 +0100
-@@ -0,0 +1,1035 @@
++++ linux/fs/aufs/super.c 2015-12-10 17:59:16.842833237 +0100
+@@ -0,0 +1,1047 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+
+static int au_do_refresh_d(struct dentry *dentry, unsigned int sigen,
+ struct au_sbinfo *sbinfo,
-+ const unsigned int dir_flags, unsigned int do_dop)
++ const unsigned int dir_flags, unsigned int do_idop)
+{
+ int err;
+ struct dentry *parent;
+ dput(parent);
+
+ if (!err) {
-+ if (do_dop)
++ if (do_idop)
+ au_refresh_dop(dentry, /*force_reval*/0);
+ } else
+ au_refresh_dop(dentry, /*force_reval*/1);
+ return err;
+}
+
-+static int au_refresh_d(struct super_block *sb, unsigned int do_dop)
++static int au_refresh_d(struct super_block *sb, unsigned int do_idop)
+{
+ int err, i, j, ndentry, e;
+ unsigned int sigen;
+ struct dentry *root = sb->s_root;
+ const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1);
+
-+ if (do_dop)
++ if (do_idop)
+ au_refresh_dop(root, /*force_reval*/0);
+
+ err = au_dpages_init(&dpages, GFP_NOFS);
+ for (j = 0; j < ndentry; j++) {
+ d = dentries[j];
+ e = au_do_refresh_d(d, sigen, sbinfo, dir_flags,
-+ do_dop);
++ do_idop);
+ if (unlikely(e && !err))
+ err = e;
+ /* go on even err */
+ 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;
+ 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);
+ return err;
+}
+
-+static void au_remount_refresh(struct super_block *sb, unsigned int do_dop)
++static void au_remount_refresh(struct super_block *sb, unsigned int do_idop)
+{
+ int err, e;
+ unsigned int udba;
+ }
+ au_hn_reset(inode, au_hi_flags(inode, /*isdir*/1));
+
-+ if (do_dop) {
++ 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\n", sb->s_d_op);
++ 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, do_dop);
-+ 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() */
+ au_opts_free(&opts);
+
+ if (au_ftest_opts(opts.flags, REFRESH))
-+ au_remount_refresh(sb, au_ftest_opts(opts.flags, REFRESH_DOP));
++ au_remount_refresh(sb, au_ftest_opts(opts.flags, REFRESH_IDOP));
+
+ if (au_ftest_opts(opts.flags, REFRESH_DYAOP)) {
+ mntflags = au_mntflags(sb);
+ 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);
+ 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);
+ 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, /*do_dop*/0);
++ au_remount_refresh(sb, /*do_idop*/0);
+ }
+ if (au_opt_test(sbinfo->si_mntflags, PLINK))
+ au_plink_put(sb, /*verbose*/1);
+};
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-11-11 17:21:46.922197217 +0100
-@@ -0,0 +1,640 @@
++++ linux/fs/aufs/super.h 2015-12-10 17:59:16.842833237 +0100
+@@ -0,0 +1,642 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+ *
+ /* 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
+ * 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 */
+
+#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 */
+}
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-11-11 17:22:06.926020273 +0100
++++ linux/include/uapi/linux/aufs_type.h 2015-12-10 17:59:16.856166891 +0100
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
+
+#include <linux/limits.h>
+
-+#define AUFS_VERSION "4.3-20151109"
++#define AUFS_VERSION "4.3-20151116"
+
+/* todo? move this to linux-2.6.19/include/magic.h */
+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
#endif /* __KERNEL__ */
diff --git a/fs/aufs/super.c b/fs/aufs/super.c
-index 1b25343..3b0c6c5 100644
+index 3fe10d3..2f32d58 100644
--- a/fs/aufs/super.c
+++ b/fs/aufs/super.c
-@@ -831,7 +831,10 @@ static const struct super_operations aufs_sop = {
+@@ -841,7 +841,10 @@ static const struct super_operations aufs_sop = {
.statfs = aufs_statfs,
.put_super = aufs_put_super,
.sync_fs = aufs_sync_fs,