[packages/kernel] - up to 4.3.1

arekm arekm at pld-linux.org
Thu Dec 10 18:45:39 CET 2015


commit b95c51470294fc508076f9bb98e28c31db8eabaa
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Thu Dec 10 18:45:32 2015 +0100

    - up to 4.3.1

 kernel-aufs4.patch       | 283 ++++++++++++++++++++++++++++-------------------
 kernel-small_fixes.patch |   1 -
 kernel.spec              |   4 +-
 3 files changed, 172 insertions(+), 116 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index cc2b3f0..e06a776 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
 
diff --git a/kernel-aufs4.patch b/kernel-aufs4.patch
index b69df80..1c0af20 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 <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)
 +{
@@ -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 <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')
@@ -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 20d4377..a0928ee 100644
--- a/kernel-small_fixes.patch
+++ b/kernel-small_fixes.patch
@@ -670,4 +670,3 @@ index 45dcbcb5c594..0975da8e3432 100644
 -- 
 2.6.2
 
-  
================================================================

---- gitweb:

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



More information about the pld-cvs-commit mailing list