From: Arkadiusz Miƛkiewicz Date: Thu, 10 Dec 2015 17:45:32 +0000 (+0100) Subject: - up to 4.3.1 X-Git-Tag: auto/th/kernel-4.3.1-1 X-Git-Url: http://git.pld-linux.org/gitweb.cgi?a=commitdiff_plain;h=b95c51470294fc508076f9bb98e28c31db8eabaa;p=packages%2Fkernel.git - up to 4.3.1 --- diff --git a/kernel-aufs4.patch b/kernel-aufs4.patch index b69df801..1c0af207 100644 --- a/kernel-aufs4.patch +++ b/kernel-aufs4.patch @@ -9367,7 +9367,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-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 @@ -9486,9 +9486,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); @@ -14022,7 +14022,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-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 @@ -14052,8 +14052,8 @@ diff -urN /usr/share/empty/fs/aufs/fstype.h linux/fs/aufs/fstype.h + +#include +#include -+#include +#include ++#include + +static inline int au_test_aufs(struct super_block *sb) +{ @@ -15773,8 +15773,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-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 + * @@ -15877,6 +15877,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; @@ -15958,11 +15984,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); @@ -15970,7 +15998,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)) @@ -15979,19 +16007,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: @@ -16277,8 +16305,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-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 + * @@ -16411,6 +16439,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, @@ -16432,7 +16461,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 @@ -18113,8 +18149,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-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 + * @@ -19522,80 +19558,82 @@ 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 = 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 @@ -20113,8 +20151,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-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 + * @@ -20959,11 +20997,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; + @@ -21611,8 +21647,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-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 + * @@ -21761,6 +21797,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(); @@ -21940,7 +21980,7 @@ 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-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 @@ -22610,7 +22650,7 @@ diff -urN /usr/share/empty/fs/aufs/mvdown.c linux/fs/aufs/mvdown.c + } + + 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; + @@ -22647,7 +22687,7 @@ 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-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 @@ -24482,7 +24522,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c + 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); @@ -24494,7 +24534,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.c linux/fs/aufs/opts.c + 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); + @@ -24510,7 +24550,7 @@ 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-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 @@ -24688,7 +24728,7 @@ diff -urN /usr/share/empty/fs/aufs/opts.h linux/fs/aufs/opts.h +#define AuOpts_REFRESH (1 << 1) +#define AuOpts_TRUNC_XIB (1 << 2) +#define AuOpts_REFRESH_DYAOP (1 << 3) -+#define AuOpts_REFRESH_DOP (1 << 4) ++#define 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) @@ -26176,8 +26216,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-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 + * @@ -26306,6 +26346,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; @@ -26474,7 +26517,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); @@ -26658,8 +26701,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-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 + * @@ -27244,7 +27287,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, unsigned int do_dop) ++ const unsigned int dir_flags, unsigned int do_idop) +{ + int err; + struct dentry *parent; @@ -27268,7 +27311,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c + 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); @@ -27277,7 +27320,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c + 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; @@ -27288,7 +27331,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c + struct dentry *root = sb->s_root; + const unsigned int dir_flags = au_hi_flags(d_inode(root), /*isdir*/1); + -+ if (do_dop) ++ if (do_idop) + au_refresh_dop(root, /*force_reval*/0); + + err = au_dpages_init(&dpages, GFP_NOFS); @@ -27307,7 +27350,7 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c + 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 */ @@ -27320,7 +27363,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; @@ -27338,17 +27381,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); @@ -27357,7 +27405,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, unsigned int do_dop) ++static void au_remount_refresh(struct super_block *sb, unsigned int do_idop) +{ + int err, e; + unsigned int udba; @@ -27388,20 +27436,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_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() */ @@ -27476,7 +27529,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_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); @@ -27523,7 +27576,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); @@ -27614,6 +27667,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c + 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); @@ -27674,7 +27729,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, /*do_dop*/0); ++ au_remount_refresh(sb, /*do_idop*/0); + } + if (au_opt_test(sbinfo->si_mntflags, PLINK)) + au_plink_put(sb, /*verbose*/1); @@ -27697,8 +27752,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-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 + * @@ -27892,6 +27947,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 @@ -27923,7 +27981,6 @@ 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 */ + @@ -27961,7 +28018,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 */ @@ -35015,7 +35072,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-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 @@ -35058,7 +35115,7 @@ diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/lin + +#include + -+#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') @@ -35680,10 +35737,10 @@ index 6d9864d..3322557 100644 #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, diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch index 20d43776..a0928ee6 100644 --- a/kernel-small_fixes.patch +++ b/kernel-small_fixes.patch @@ -670,4 +670,3 @@ index 45dcbcb5c594..0975da8e3432 100644 -- 2.6.2 - diff --git a/kernel.spec b/kernel.spec index cc2b3f04..e06a7761 100644 --- a/kernel.spec +++ b/kernel.spec @@ -71,7 +71,7 @@ %define rel 1 %define basever 4.3 -%define postver .0 +%define postver .1 # define this to '-%{basever}' for longterm branch %define versuffix %{nil} @@ -120,7 +120,7 @@ Source0: http://www.kernel.org/pub/linux/kernel/v4.x/linux-%{basever}.tar.xz # Source0-md5: 58b35794eee3b6d52ce7be39357801e7 %if "%{postver}" != ".0" Patch0: http://www.kernel.org/pub/linux/kernel/v4.x/patch-%{version}.xz -# Patch0-md5: 408f9975969da326b5804a04dbf0d4de +# Patch0-md5: 6c2dcd8d314f687f317b44820151dd92 %endif Source1: kernel.sysconfig