[packages/kernel/LINUX_3_10] - updated aufs3 patch

baggins baggins at pld-linux.org
Wed Jul 8 00:47:05 CEST 2015


commit ffb7aa1554478a1263f4c4da6ec6807cc84be73e
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Wed Jul 8 00:46:30 2015 +0200

    - updated aufs3 patch

 kernel-aufs3.patch | 133 +++++++++++++++++------------------------------------
 1 file changed, 43 insertions(+), 90 deletions(-)
---
diff --git a/kernel-aufs3.patch b/kernel-aufs3.patch
index 556bf98..d979407 100644
--- a/kernel-aufs3.patch
+++ b/kernel-aufs3.patch
@@ -35,19 +35,6 @@ index bdc6e87..349600c 100644
  header-y += auxvec.h
 aufs3.10 base patch
 
-diff --git a/fs/file_table.c b/fs/file_table.c
-index 485dc0e..8db8096 100644
---- a/fs/file_table.c
-+++ b/fs/file_table.c
-@@ -36,7 +36,7 @@ struct files_stat_struct files_stat = {
- 	.max_files = NR_FILE
- };
- 
--DEFINE_STATIC_LGLOCK(files_lglock);
-+DEFINE_LGLOCK(files_lglock);
- 
- /* SLAB cache for file structures */
- static struct kmem_cache *filp_cachep __read_mostly;
 diff --git a/fs/inode.c b/fs/inode.c
 index 00d5fc3..f324521 100644
 --- a/fs/inode.c
@@ -118,27 +105,6 @@ index 74575cb..bfc6fb6 100644
  #endif
 aufs3.10 standalone patch
 
-diff --git a/fs/file_table.c b/fs/file_table.c
-index 8db8096..e271e28 100644
---- a/fs/file_table.c
-+++ b/fs/file_table.c
-@@ -37,6 +37,7 @@ struct files_stat_struct files_stat = {
- };
- 
- DEFINE_LGLOCK(files_lglock);
-+EXPORT_SYMBOL(files_lglock);
- 
- /* SLAB cache for file structures */
- static struct kmem_cache *filp_cachep __read_mostly;
-@@ -405,6 +406,8 @@ void file_sb_list_del(struct file *file)
- 	}
- }
- 
-+EXPORT_SYMBOL(file_sb_list_del);
-+
- #ifdef CONFIG_SMP
- 
- /*
 diff --git a/fs/inode.c b/fs/inode.c
 index f324521..bff7670 100644
 --- a/fs/inode.c
@@ -1904,7 +1870,7 @@ diff -urN /usr/share/empty/fs/aufs/aufs.h linux/fs/aufs/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	2013-07-30 22:42:55.839613269 +0200
-@@ -0,0 +1,1213 @@
+@@ -0,0 +1,1222 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -2912,22 +2878,25 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +{
 +	unsigned long long n;
 +	struct file **p, *f;
++	struct au_sphlhead *files;
++	struct au_finfo *finfo;
 +	struct super_block *sb = arg;
 +
 +	n = 0;
 +	p = a;
-+	lg_global_lock(&files_lglock);
-+	do_file_list_for_each_entry(sb, f) {
-+		if (au_fi(f)
-+		    && file_count(f)
++	files = &au_sbi(sb)->si_files;
++	spin_lock(&files->spin);
++	hlist_for_each_entry(finfo, &files->head, fi_hlist) {
++		f = finfo->fi_file;
++		if (file_count(f)
 +		    && !special_file(file_inode(f)->i_mode)) {
 +			get_file(f);
 +			*p++ = f;
 +			n++;
 +			AuDebugOn(n > max);
 +		}
-+	} while_file_list_for_each_entry;
-+	lg_global_unlock(&files_lglock);
++	}
++	spin_unlock(&files->spin);
 +
 +	return n;
 +}
@@ -3013,7 +2982,13 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +			continue;
 +
 +		/* todo: already flushed? */
-+		/* cf. fs/super.c:mark_files_ro() */
++		/*
++		 * fs/super.c:mark_files_ro() is gone, but aufs keeps its
++		 * approach which resets f_mode and calls mnt_drop_write() and
++		 * file_release_write() for each file, because the branch
++		 * attribute in aufs world is totally different from the native
++		 * fs rw/ro mode.
++		*/
 +		/* fi_read_lock(file); */
 +		hfile = &au_fi(file)->fi_htop;
 +		hf = hfile->hf_file;
@@ -5465,7 +5440,7 @@ diff -urN /usr/share/empty/fs/aufs/dcsub.c linux/fs/aufs/dcsub.c
 +		goto out;
 +
 +	/*
-+	 * vfsmount_lock is unnecessary since this is a traverse in a single
++	 * RCU for vfsmount is unnecessary since this is a traverse in a single
 +	 * mount
 +	 */
 +	while (!IS_ROOT(dentry)) {
@@ -9749,9 +9724,9 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +	};
 +
 +	get_fs_root(current->fs, &root);
-+	br_read_lock(&vfsmount_lock);
++	rcu_read_lock();
 +	err = iterate_mounts(au_compare_mnt, &args, root.mnt);
-+	br_read_unlock(&vfsmount_lock);
++	rcu_read_unlock();
 +	path_put(&root);
 +	AuDebugOn(!err);
 +	AuDebugOn(!args.mnt);
@@ -10987,7 +10962,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	2013-08-23 23:59:39.634916914 +0200
-@@ -0,0 +1,310 @@
+@@ -0,0 +1,313 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -11052,6 +11027,9 @@ diff -urN /usr/share/empty/fs/aufs/file.h linux/fs/aufs/file.h
 +		atomic_t			fi_mmapped;
 +	};
 +	struct au_fidir		*fi_hdir;	/* for dir only */
++
++	struct hlist_node	fi_hlist;
++	struct file		*fi_file;	/* very ugly */
 +} ____cacheline_aligned_in_smp;
 +
 +/* ---------------------------------------------------------------------- */
@@ -23699,7 +23677,7 @@ diff -urN /usr/share/empty/fs/aufs/rwsem.h linux/fs/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	2013-07-06 13:20:47.753531903 +0200
-@@ -0,0 +1,346 @@
+@@ -0,0 +1,348 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -23815,6 +23793,8 @@ diff -urN /usr/share/empty/fs/aufs/sbinfo.c linux/fs/aufs/sbinfo.c
 +	init_waitqueue_head(&sbinfo->si_plink_wq);
 +	spin_lock_init(&sbinfo->si_plink_maint_lock);
 +
++	au_sphl_init(&sbinfo->si_files);
++
 +	/* leave other members for sysaufs and si_mnt. */
 +	sbinfo->si_sb = sb;
 +	sb->s_fs_info = sbinfo;
@@ -25161,7 +25141,7 @@ 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	2013-08-23 23:59:39.638250372 +0200
-@@ -0,0 +1,559 @@
+@@ -0,0 +1,563 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -25252,7 +25232,8 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +	} au_si_pid;
 +
 +	/*
-+	 * dirty approach to protect sb->sb_inodes and ->s_files from remount.
++	 * dirty approach to protect sb->sb_inodes and ->s_files (gone) from
++	 * remount.
 +	 */
 +	atomic_long_t		si_ninodes, si_nfiles;
 +
@@ -25328,6 +25309,9 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +	spinlock_t		si_plink_maint_lock;
 +	pid_t			si_plink_maint_pid;
 +
++	/* file list */
++	struct au_sphlhead	si_files;
++
 +	/*
 +	 * sysfs and lifetime management.
 +	 * this is not a small structure and it may be a waste of memory in case
@@ -26202,7 +26186,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	2013-07-06 13:20:47.753531903 +0200
-@@ -0,0 +1,151 @@
+@@ -0,0 +1,155 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -26236,6 +26220,8 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +	char *plevel;
 +	struct au_sbinfo *sbinfo;
 +	struct file *file;
++	struct au_sphlhead *files;
++	struct au_finfo *finfo;
 +
 +	plevel = au_plevel;
 +	au_plevel = KERN_WARNING;
@@ -26291,14 +26277,16 @@ diff -urN /usr/share/empty/fs/aufs/sysrq.c linux/fs/aufs/sysrq.c
 +	}
 +#endif
 +	pr("files\n");
-+	lg_global_lock(&files_lglock);
-+	do_file_list_for_each_entry(sb, file) {
++	files = &au_sbi(sb)->si_files;
++	spin_lock(&files->spin);
++	hlist_for_each_entry(finfo, &files->head, fi_hlist) {
 +		umode_t mode;
++		file = finfo->fi_file;
 +		mode = file_inode(file)->i_mode;
 +		if (!special_file(mode) || au_special_file(mode))
 +			au_dpri_file(file);
-+	} while_file_list_for_each_entry;
-+	lg_global_unlock(&files_lglock);
++	}
++	spin_unlock(&files->spin);
 +	pr("done\n");
 +
 +#undef pr
@@ -28012,7 +28000,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	2013-07-30 22:42:55.842946719 +0200
-@@ -0,0 +1,294 @@
+@@ -0,0 +1,259 @@
 +/*
 + * Copyright (C) 2005-2013 Junjiro R. Okajima
 + *
@@ -28041,49 +28029,14 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.h linux/fs/aufs/vfsub.h
 +#ifdef __KERNEL__
 +
 +#include <linux/fs.h>
-+#include <linux/lglock.h>
 +#include <linux/mount.h>
 +#include "debug.h"
 +
 +/* copied from linux/fs/internal.h */
 +/* todo: BAD approach!! */
-+extern struct lglock vfsmount_lock;
 +extern void __mnt_drop_write(struct vfsmount *);
 +extern spinlock_t inode_sb_list_lock;
 +
-+/* copied from linux/fs/file_table.c */
-+extern struct lglock files_lglock;
-+#ifdef CONFIG_SMP
-+/*
-+ * These macros iterate all files on all CPUs for a given superblock.
-+ * files_lglock must be held globally.
-+ */
-+#define do_file_list_for_each_entry(__sb, __file)		\
-+{								\
-+	int i;							\
-+	for_each_possible_cpu(i) {				\
-+		struct list_head *list;				\
-+		list = per_cpu_ptr((__sb)->s_files, i);		\
-+		list_for_each_entry((__file), list, f_u.fu_list)
-+
-+#define while_file_list_for_each_entry				\
-+	}							\
-+}
-+
-+#else
-+
-+#define do_file_list_for_each_entry(__sb, __file)		\
-+{								\
-+	struct list_head *list;					\
-+	list = &(sb)->s_files;					\
-+	list_for_each_entry((__file), list, f_u.fu_list)
-+
-+#define while_file_list_for_each_entry				\
-+}
-+#endif
-+
-+/* ---------------------------------------------------------------------- */
-+
 +/* lock subclass for lower inode */
 +/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */
 +/* reduce? gave up. */
================================================================

---- gitweb:

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



More information about the pld-cvs-commit mailing list