[kernel] r18298 - in dists/trunk/linux-2.6/debian: . patches/features/all/aufs3

Ben Hutchings benh at alioth.debian.org
Sat Nov 19 23:53:38 UTC 2011


Author: benh
Date: Sat Nov 19 23:53:33 2011
New Revision: 18298

Log:
aufs: Update to aufs3.x-rcN-20111114

Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-add.patch
   dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-base.patch
   dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-kbuild.patch
   dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-standalone.patch

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	Sat Nov 19 18:55:14 2011	(r18297)
+++ dists/trunk/linux-2.6/debian/changelog	Sat Nov 19 23:53:33 2011	(r18298)
@@ -2,6 +2,7 @@
 
   [ Ben Hutchings ]
   * New upstream release candidate
+  * aufs: Update to aufs3.x-rcN-20111114
 
   [ Uwe Kleine-König ]
   * [amd64] reenable rt featureset with 3.2-rc1-52e4c2a05-rt2

Modified: dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-add.patch
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-add.patch	Sat Nov 19 18:55:14 2011	(r18297)
+++ dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-add.patch	Sat Nov 19 23:53:33 2011	(r18298)
@@ -1758,8 +1758,8 @@
 +
 +-include ${srctree}/${src}/conf_priv.mk
 --- a/fs/aufs/cpup.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/cpup.c	2011-10-29 11:40:05.615788191 +0100
-@@ -0,0 +1,1080 @@
++++ b/fs/aufs/cpup.c	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,1081 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -1822,7 +1822,7 @@
 +	    && au_plink_test(inode))
 +		return;
 +
-+	inode->i_nlink = h_inode->i_nlink;
++	set_nlink(inode, h_inode->i_nlink);
 +
 +	/*
 +	 * fewer nlink makes find(1) noisy, but larger nlink doesn't.
@@ -2185,6 +2185,7 @@
 +	if (unlikely(!sym.k))
 +		goto out;
 +
++	/* unnecessary to support mmap_sem since symlink is not mmap-able */
 +	old_fs = get_fs();
 +	set_fs(KERNEL_DS);
 +	symlen = h_src->d_inode->i_op->readlink(h_src, sym.u, PATH_MAX);
@@ -2927,7 +2928,7 @@
 +#endif /* __KERNEL__ */
 +#endif /* __AUFS_CPUP_H__ */
 --- a/fs/aufs/dbgaufs.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/dbgaufs.c	2011-10-29 11:40:05.615788191 +0100
++++ b/fs/aufs/dbgaufs.c	2011-11-19 23:25:01.975822834 +0000
 @@ -0,0 +1,334 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -3068,7 +3069,7 @@
 +		     || memcmp(name->name, DbgaufsXi_PREFIX,
 +			       sizeof(DbgaufsXi_PREFIX) - 1)))
 +		goto out;
-+	err = strict_strtol(name->name + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l);
++	err = kstrtol(name->name + sizeof(DbgaufsXi_PREFIX) - 1, 10, &l);
 +	if (unlikely(err))
 +		goto out;
 +
@@ -6341,8 +6342,8 @@
 +	return -1;
 +}
 --- a/fs/aufs/dir.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/dir.c	2011-10-29 11:40:05.619788223 +0100
-@@ -0,0 +1,627 @@
++++ b/fs/aufs/dir.c	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,635 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -6371,20 +6372,28 @@
 +
 +void au_add_nlink(struct inode *dir, struct inode *h_dir)
 +{
++	unsigned int nlink;
++
 +	AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode));
 +
-+	dir->i_nlink += h_dir->i_nlink - 2;
++	nlink = dir->i_nlink;
++	nlink += h_dir->i_nlink - 2;
 +	if (h_dir->i_nlink < 2)
-+		dir->i_nlink += 2;
++		nlink += 2;
++	set_nlink(dir, nlink);
 +}
 +
 +void au_sub_nlink(struct inode *dir, struct inode *h_dir)
 +{
++	unsigned int nlink;
++
 +	AuDebugOn(!S_ISDIR(dir->i_mode) || !S_ISDIR(h_dir->i_mode));
 +
-+	dir->i_nlink -= h_dir->i_nlink - 2;
++	nlink = dir->i_nlink;
++	nlink -= h_dir->i_nlink - 2;
 +	if (h_dir->i_nlink < 2)
-+		dir->i_nlink -= 2;
++		nlink -= 2;
++	set_nlink(dir, nlink);
 +}
 +
 +loff_t au_dir_size(struct file *file, struct dentry *dentry)
@@ -6702,7 +6711,7 @@
 +{
 +	int err;
 +	struct dentry *dentry;
-+	struct inode *inode;
++	struct inode *inode, *h_inode;
 +	struct super_block *sb;
 +
 +	dentry = file->f_dentry;
@@ -6721,22 +6730,22 @@
 +	if (unlikely(err))
 +		goto out_unlock;
 +
++	h_inode = au_h_iptr(inode, au_ibstart(inode));
 +	if (!au_test_nfsd()) {
 +		err = au_vdir_fill_de(file, dirent, filldir);
-+		fsstack_copy_attr_atime(inode,
-+					au_h_iptr(inode, au_ibstart(inode)));
++		fsstack_copy_attr_atime(inode, h_inode);
 +	} else {
 +		/*
 +		 * nfsd filldir may call lookup_one_len(), vfs_getattr(),
 +		 * encode_fh() and others.
 +		 */
-+		struct inode *h_inode = au_h_iptr(inode, au_ibstart(inode));
-+
++		atomic_inc(&h_inode->i_count);
 +		di_read_unlock(dentry, AuLock_IR);
 +		si_read_unlock(sb);
 +		err = au_vdir_fill_de(file, dirent, filldir);
 +		fsstack_copy_attr_atime(inode, h_inode);
 +		fi_write_unlock(file);
++		iput(h_inode);
 +
 +		AuTraceErr(err);
 +		return err;
@@ -8383,8 +8392,8 @@
 +	atomic_set(&sbinfo->si_xigen_next, u);
 +}
 --- a/fs/aufs/f_op.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/f_op.c	2011-10-29 11:40:05.619788223 +0100
-@@ -0,0 +1,711 @@
++++ b/fs/aufs/f_op.c	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,731 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -8502,6 +8511,13 @@
 +}
 +
 +/* ---------------------------------------------------------------------- */
++/*
++ * read and write functions acquire [fdi]_rwsem once, but release before
++ * mmap_sem. This is because to stop a race condition between mmap(2).
++ * Releasing these aufs-rwsem should be safe, no branch-mamagement (by keeping
++ * si_rwsem), no harmful copy-up should happen. Actually copy-up may happen in
++ * read functions after [fdi]_rwsem are released, but it should be harmless.
++ */
 +
 +static ssize_t aufs_read(struct file *file, char __user *buf, size_t count,
 +			 loff_t *ppos)
@@ -8519,13 +8535,18 @@
 +		goto out;
 +
 +	h_file = au_hf_top(file);
++	get_file(h_file);
++	di_read_unlock(dentry, AuLock_IR);
++	fi_read_unlock(file);
++
++	/* filedata may be obsoleted by concurrent copyup, but no problem */
 +	err = vfsub_read_u(h_file, buf, count, ppos);
 +	/* todo: necessary? */
 +	/* file->f_ra = h_file->f_ra; */
++	/* update without lock, I don't think it a problem */
 +	fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode);
++	fput(h_file);
 +
-+	di_read_unlock(dentry, AuLock_IR);
-+	fi_read_unlock(file);
 +out:
 +	si_read_unlock(sb);
 +	return err;
@@ -8559,11 +8580,13 @@
 +	ssize_t err;
 +	struct au_pin pin;
 +	struct dentry *dentry;
++	struct super_block *sb;
 +	struct inode *inode;
 +	struct file *h_file;
 +	char __user *buf = (char __user *)ubuf;
 +
 +	dentry = file->f_dentry;
++	sb = dentry->d_sb;
 +	inode = dentry->d_inode;
 +	au_mtx_and_read_lock(inode);
 +
@@ -8573,20 +8596,27 @@
 +
 +	err = au_ready_to_write(file, -1, &pin);
 +	di_downgrade_lock(dentry, AuLock_IR);
-+	if (unlikely(err))
-+		goto out_unlock;
++	if (unlikely(err)) {
++		di_read_unlock(dentry, AuLock_IR);
++		fi_write_unlock(file);
++		goto out;
++	}
 +
 +	h_file = au_hf_top(file);
++	get_file(h_file);
 +	au_unpin(&pin);
++	di_read_unlock(dentry, AuLock_IR);
++	fi_write_unlock(file);
++
 +	err = vfsub_write_u(h_file, buf, count, ppos);
++	ii_write_lock_child(inode);
 +	au_cpup_attr_timesizes(inode);
 +	inode->i_mode = h_file->f_dentry->d_inode->i_mode;
++	ii_write_unlock(inode);
++	fput(h_file);
 +
-+out_unlock:
-+	di_read_unlock(dentry, AuLock_IR);
-+	fi_write_unlock(file);
 +out:
-+	si_read_unlock(inode->i_sb);
++	si_read_unlock(sb);
 +	mutex_unlock(&inode->i_mutex);
 +	return err;
 +}
@@ -8641,12 +8671,16 @@
 +		goto out;
 +
 +	h_file = au_hf_top(file);
++	get_file(h_file);
++	di_read_unlock(dentry, AuLock_IR);
++	fi_read_unlock(file);
++
 +	err = au_do_aio(h_file, MAY_READ, kio, iov, nv, pos);
 +	/* todo: necessary? */
 +	/* file->f_ra = h_file->f_ra; */
++	/* update without lock, I don't think it a problem */
 +	fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode);
-+	di_read_unlock(dentry, AuLock_IR);
-+	fi_read_unlock(file);
++	fput(h_file);
 +
 +out:
 +	si_read_unlock(sb);
@@ -8661,9 +8695,11 @@
 +	struct dentry *dentry;
 +	struct inode *inode;
 +	struct file *file, *h_file;
++	struct super_block *sb;
 +
 +	file = kio->ki_filp;
 +	dentry = file->f_dentry;
++	sb = dentry->d_sb;
 +	inode = dentry->d_inode;
 +	au_mtx_and_read_lock(inode);
 +
@@ -8673,20 +8709,27 @@
 +
 +	err = au_ready_to_write(file, -1, &pin);
 +	di_downgrade_lock(dentry, AuLock_IR);
-+	if (unlikely(err))
-+		goto out_unlock;
++	if (unlikely(err)) {
++		di_read_unlock(dentry, AuLock_IR);
++		fi_write_unlock(file);
++		goto out;
++	}
 +
-+	au_unpin(&pin);
 +	h_file = au_hf_top(file);
++	get_file(h_file);
++	au_unpin(&pin);
++	di_read_unlock(dentry, AuLock_IR);
++	fi_write_unlock(file);
++
 +	err = au_do_aio(h_file, MAY_WRITE, kio, iov, nv, pos);
++	ii_write_lock_child(inode);
 +	au_cpup_attr_timesizes(inode);
 +	inode->i_mode = h_file->f_dentry->d_inode->i_mode;
++	ii_write_unlock(inode);
++	fput(h_file);
 +
-+out_unlock:
-+	di_read_unlock(dentry, AuLock_IR);
-+	fi_write_unlock(file);
 +out:
-+	si_read_unlock(inode->i_sb);
++	si_read_unlock(sb);
 +	mutex_unlock(&inode->i_mutex);
 +	return err;
 +}
@@ -8709,6 +8752,7 @@
 +
 +	err = -EINVAL;
 +	h_file = au_hf_top(file);
++	get_file(h_file);
 +	if (au_test_loopback_kthread()) {
 +		au_warn_loopback(h_file->f_dentry->d_sb);
 +		if (file->f_mapping != h_file->f_mapping) {
@@ -8716,13 +8760,15 @@
 +			smp_mb(); /* unnecessary? */
 +		}
 +	}
++	di_read_unlock(dentry, AuLock_IR);
++	fi_read_unlock(file);
++
 +	err = vfsub_splice_to(h_file, ppos, pipe, len, flags);
 +	/* todo: necessasry? */
 +	/* file->f_ra = h_file->f_ra; */
++	/* update without lock, I don't think it a problem */
 +	fsstack_copy_attr_atime(dentry->d_inode, h_file->f_dentry->d_inode);
-+
-+	di_read_unlock(dentry, AuLock_IR);
-+	fi_read_unlock(file);
++	fput(h_file);
 +
 +out:
 +	si_read_unlock(sb);
@@ -8738,36 +8784,65 @@
 +	struct dentry *dentry;
 +	struct inode *inode;
 +	struct file *h_file;
++	struct super_block *sb;
 +
 +	dentry = file->f_dentry;
++	sb = dentry->d_sb;
 +	inode = dentry->d_inode;
 +	au_mtx_and_read_lock(inode);
++
 +	err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
 +	if (unlikely(err))
 +		goto out;
 +
 +	err = au_ready_to_write(file, -1, &pin);
 +	di_downgrade_lock(dentry, AuLock_IR);
-+	if (unlikely(err))
-+		goto out_unlock;
++	if (unlikely(err)) {
++		di_read_unlock(dentry, AuLock_IR);
++		fi_write_unlock(file);
++		goto out;
++	}
 +
 +	h_file = au_hf_top(file);
++	get_file(h_file);
 +	au_unpin(&pin);
++	di_read_unlock(dentry, AuLock_IR);
++	fi_write_unlock(file);
++
 +	err = vfsub_splice_from(pipe, h_file, ppos, len, flags);
++	ii_write_lock_child(inode);
 +	au_cpup_attr_timesizes(inode);
 +	inode->i_mode = h_file->f_dentry->d_inode->i_mode;
++	ii_write_unlock(inode);
++	fput(h_file);
 +
-+out_unlock:
-+	di_read_unlock(dentry, AuLock_IR);
-+	fi_write_unlock(file);
 +out:
-+	si_read_unlock(inode->i_sb);
++	si_read_unlock(sb);
 +	mutex_unlock(&inode->i_mutex);
 +	return err;
 +}
 +
 +/* ---------------------------------------------------------------------- */
 +
++/*
++ * The locking order around current->mmap_sem.
++ * - in most and regular cases
++ *   file I/O syscall -- aufs_read() or something
++ *	-- si_rwsem for read -- mmap_sem
++ *	(Note that [fdi]i_rwsem are released before mmap_sem).
++ * - in mmap case
++ *   mmap(2) -- mmap_sem -- aufs_mmap() -- si_rwsem for read -- [fdi]i_rwsem
++ * This AB-BA order is definitly bad, but is not a problem since "si_rwsem for
++ * read" allows muliple processes to acquire it and [fdi]i_rwsem are not held in
++ * file I/O. Aufs needs to stop lockdep in aufs_mmap() though.
++ * It means that when aufs acquires si_rwsem for write, the process should never
++ * acquire mmap_sem.
++ *
++ * Actually aufs_readdir() holds [fdi]i_rwsem before mmap_sem, but this is not a
++ * problem either since any directory is not able to be mmap-ed.
++ * The similar scenario is applied to aufs_readlink() too.
++ */
++
 +/* cf. linux/include/linux/mman.h: calc_vm_prot_bits() */
 +#define AuConv_VM_PROT(f, b)	_calc_vm_trans(f, VM_##b, PROT_##b)
 +
@@ -8802,120 +8877,74 @@
 +		| AuConv_VM_MAP(flags, EXECUTABLE)
 +		| AuConv_VM_MAP(flags, LOCKED);
 +}
-+/*
-+ * This is another ugly approach to keep the lock order, particularly
-+ * mm->mmap_sem and aufs rwsem. The previous approach was reverted and you can
-+ * find it in git-log, if you want.
-+ *
-+ * native readdir: i_mutex, copy_to_user, mmap_sem
-+ * aufs readdir: i_mutex, rwsem, nested-i_mutex, copy_to_user, mmap_sem
-+ *
-+ * Before aufs_mmap() mmap_sem is acquired already, but aufs_mmap() has to
-+ * acquire aufs rwsem. It introduces a circular locking dependency.
-+ * To address this problem, aufs_mmap() delegates the part which requires aufs
-+ * rwsem to its internal workqueue.
-+ * But it is just a fake. A deadlock MAY happen between write() and mmap() for
-+ * the same file in a multi-threaded application.
-+ */
-+
-+struct au_mmap_pre_args {
-+	/* input */
-+	struct file *file;
-+	struct vm_area_struct *vma;
 +
-+	/* output */
-+	int *errp;
-+	struct file *h_file;
-+	struct au_branch *br;
-+};
-+
-+static int au_mmap_pre(struct file *file, struct vm_area_struct *vma,
-+		       struct file **h_file, struct au_branch **br)
++static int aufs_mmap(struct file *file, struct vm_area_struct *vma)
 +{
 +	int err;
++	unsigned long prot;
 +	aufs_bindex_t bstart;
 +	const unsigned char wlock
-+		= !!(file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED);
++		= (file->f_mode & FMODE_WRITE) && (vma->vm_flags & VM_SHARED);
 +	struct dentry *dentry;
 +	struct super_block *sb;
++	struct file *h_file;
++	struct au_branch *br;
++	struct au_pin pin;
++
++	AuDbgVmRegion(file, vma);
 +
 +	dentry = file->f_dentry;
 +	sb = dentry->d_sb;
++	lockdep_off();
 +	si_read_lock(sb, AuLock_NOPLMW);
 +	err = au_reval_and_lock_fdi(file, au_reopen_nondir, /*wlock*/1);
 +	if (unlikely(err))
 +		goto out;
 +
 +	if (wlock) {
-+		struct au_pin pin;
-+
 +		err = au_ready_to_write(file, -1, &pin);
 +		di_write_unlock(dentry);
-+		if (unlikely(err))
-+			goto out_unlock;
++		if (unlikely(err)) {
++			fi_write_unlock(file);
++			goto out;
++		}
 +		au_unpin(&pin);
 +	} else
 +		di_write_unlock(dentry);
++
 +	bstart = au_fbstart(file);
-+	*br = au_sbr(sb, bstart);
-+	*h_file = au_hf_top(file);
-+	get_file(*h_file);
++	br = au_sbr(sb, bstart);
++	h_file = au_hf_top(file);
++	get_file(h_file);
 +	au_set_mmapped(file);
-+
-+out_unlock:
 +	fi_write_unlock(file);
-+out:
-+	si_read_unlock(sb);
-+	return err;
-+}
-+
-+static void au_call_mmap_pre(void *args)
-+{
-+	struct au_mmap_pre_args *a = args;
-+	*a->errp = au_mmap_pre(a->file, a->vma, &a->h_file, &a->br);
-+}
-+
-+static int aufs_mmap(struct file *file, struct vm_area_struct *vma)
-+{
-+	int err, wkq_err;
-+	unsigned long prot;
-+	struct au_mmap_pre_args args = {
-+		.file		= file,
-+		.vma		= vma,
-+		.errp		= &err
-+	};
-+
-+	AuDbgVmRegion(file, vma);
-+	wkq_err = au_wkq_wait_pre(au_call_mmap_pre, &args);
-+	if (unlikely(wkq_err))
-+		err = wkq_err;
-+	if (unlikely(err))
-+		goto out;
++	lockdep_on();
 +
-+	au_vm_file_reset(vma, args.h_file);
++	au_vm_file_reset(vma, h_file);
 +	prot = au_prot_conv(vma->vm_flags);
-+	err = security_file_mmap(args.h_file, /*reqprot*/prot, prot,
++	err = security_file_mmap(h_file, /*reqprot*/prot, prot,
 +				 au_flag_conv(vma->vm_flags), vma->vm_start, 0);
-+	if (unlikely(err))
-+		goto out_reset;
-+
-+	err = args.h_file->f_op->mmap(args.h_file, vma);
++	if (!err)
++		err = h_file->f_op->mmap(h_file, vma);
 +	if (unlikely(err))
 +		goto out_reset;
 +
 +	au_vm_prfile_set(vma, file);
-+	vfsub_file_accessed(args.h_file);
 +	/* update without lock, I don't think it a problem */
 +	fsstack_copy_attr_atime(file->f_dentry->d_inode,
-+				args.h_file->f_dentry->d_inode);
++				h_file->f_dentry->d_inode);
 +	goto out_fput; /* success */
 +
 +out_reset:
 +	au_unset_mmapped(file);
 +	au_vm_file_reset(vma, file);
 +out_fput:
-+	fput(args.h_file);
++	fput(h_file);
++	lockdep_off();
 +out:
++	si_read_unlock(sb);
++	lockdep_on();
++	AuTraceErr(err);
 +	return err;
 +}
 +
@@ -10380,8 +10409,8 @@
 +#endif /* __KERNEL__ */
 +#endif /* __AUFS_FILE_H__ */
 --- a/fs/aufs/finfo.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/finfo.c	2011-10-29 11:40:05.619788223 +0100
-@@ -0,0 +1,153 @@
++++ b/fs/aufs/finfo.c	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,157 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -10512,7 +10541,7 @@
 +
 +int au_finfo_init(struct file *file, struct au_fidir *fidir)
 +{
-+	int err;
++	int err, lc_idx;
 +	struct au_finfo *finfo;
 +	struct dentry *dentry;
 +
@@ -10524,6 +10553,10 @@
 +
 +	err = 0;
 +	au_nfiles_inc(dentry->d_sb);
++	lc_idx = AuLcNonDir_FIINFO;
++	if (fidir)
++		lc_idx = AuLcDir_FIINFO;
++	au_rw_class(&finfo->fi_rwsem, au_lc_key + lc_idx);
 +	au_rw_write_lock(&finfo->fi_rwsem);
 +	finfo->fi_btop = -1;
 +	finfo->fi_hdir = fidir;
@@ -12062,8 +12095,8 @@
 +		au_hn_destroy_cache();
 +}
 --- a/fs/aufs/i_op.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/i_op.c	2011-10-29 11:40:05.619788223 +0100
-@@ -0,0 +1,974 @@
++++ b/fs/aufs/i_op.c	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,994 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -12226,7 +12259,7 @@
 +	struct dentry *ret, *parent;
 +	struct inode *inode;
 +	struct super_block *sb;
-+	int err, npositive;
++	int err, npositive, lc_idx;
 +
 +	IMustLock(dir);
 +
@@ -12244,6 +12277,7 @@
 +	if (unlikely(err))
 +		goto out_si;
 +
++	inode = NULL;
 +	npositive = 0; /* suppress a warning */
 +	parent = dentry->d_parent; /* dir inode is locked */
 +	di_read_lock_parent(parent, AuLock_IR);
@@ -12260,22 +12294,37 @@
 +	if (unlikely(err < 0))
 +		goto out_unlock;
 +
-+	inode = NULL;
 +	if (npositive) {
 +		inode = au_new_inode(dentry, /*must_new*/0);
 +		ret = (void *)inode;
 +	}
-+	if (IS_ERR(inode))
++	if (IS_ERR(inode)) {
++		inode = NULL;
 +		goto out_unlock;
++	}
 +
 +	ret = d_splice_alias(inode, dentry);
 +	if (unlikely(IS_ERR(ret) && inode)) {
 +		ii_write_unlock(inode);
++		lc_idx = AuLcNonDir_IIINFO;
++		if (S_ISLNK(inode->i_mode))
++			lc_idx = AuLcSymlink_IIINFO;
++		else if (S_ISDIR(inode->i_mode))
++			lc_idx = AuLcDir_IIINFO;
++		au_rw_class(&au_ii(inode)->ii_rwsem, au_lc_key + lc_idx);
 +		iput(inode);
 +	}
 +
 +out_unlock:
 +	di_write_unlock(dentry);
++	if (unlikely(IS_ERR(ret) && inode)) {
++		lc_idx = AuLcNonDir_DIINFO;
++		if (S_ISLNK(inode->i_mode))
++			lc_idx = AuLcSymlink_DIINFO;
++		else if (S_ISDIR(inode->i_mode))
++			lc_idx = AuLcDir_DIINFO;
++		au_rw_class(&au_di(dentry)->di_rwsem, au_lc_key + lc_idx);
++	}
 +out_si:
 +	si_read_unlock(sb);
 +out:
@@ -12802,6 +12851,8 @@
 +static void au_refresh_iattr(struct inode *inode, struct kstat *st,
 +			     unsigned int nlink)
 +{
++	unsigned int n;
++
 +	inode->i_mode = st->mode;
 +	inode->i_uid = st->uid;
 +	inode->i_gid = st->gid;
@@ -12811,8 +12862,10 @@
 +
 +	au_cpup_attr_nlink(inode, /*force*/0);
 +	if (S_ISDIR(inode->i_mode)) {
-+		inode->i_nlink -= nlink;
-+		inode->i_nlink += st->nlink;
++		n = inode->i_nlink;
++		n -= nlink;
++		n += st->nlink;
++		set_nlink(inode, n);
 +	}
 +
 +	spin_lock(&inode->i_lock);
@@ -17000,8 +17053,8 @@
 +ccflags-y += -DHFSPLUS_SUPER_MAGIC=0x482b
 +endif
 --- a/fs/aufs/module.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/module.c	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,193 @@
++++ b/fs/aufs/module.c	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,195 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -17089,6 +17142,8 @@
 +struct au_splhead au_sbilist;
 +#endif
 +
++struct lock_class_key au_lc_key[AuLcKey_Last];
++
 +/*
 + * functions for module interface.
 + */
@@ -17196,8 +17251,8 @@
 +module_init(aufs_init);
 +module_exit(aufs_exit);
 --- a/fs/aufs/module.h	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/module.h	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,91 @@
++++ b/fs/aufs/module.h	2011-11-19 23:25:01.975822834 +0000
+@@ -0,0 +1,107 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -17237,6 +17292,22 @@
 +
 +extern int au_dir_roflags;
 +
++enum {
++	AuLcNonDir_FIINFO,
++	AuLcNonDir_DIINFO,
++	AuLcNonDir_IIINFO,
++
++	AuLcDir_FIINFO,
++	AuLcDir_DIINFO,
++	AuLcDir_IIINFO,
++
++	AuLcSymlink_DIINFO,
++	AuLcSymlink_IIINFO,
++
++	AuLcKey_Last
++};
++extern struct lock_class_key au_lc_key[AuLcKey_Last];
++
 +void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp);
 +int au_seq_path(struct seq_file *seq, struct path *path);
 +
@@ -17290,7 +17361,7 @@
 +#endif /* __KERNEL__ */
 +#endif /* __AUFS_MODULE_H__ */
 --- a/fs/aufs/opts.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/opts.c	2011-10-29 11:40:05.623788233 +0100
++++ b/fs/aufs/opts.c	2011-11-19 23:25:01.979822863 +0000
 @@ -0,0 +1,1679 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -17647,7 +17718,7 @@
 +/*
 + * cf. linux/lib/parser.c and cmdline.c
 + * gave up calling memparse() since it uses simple_strtoull() instead of
-+ * strict_...().
++ * kstrto...().
 + */
 +static int noinline_for_stack
 +au_match_ull(substring_t *s, unsigned long long *result)
@@ -17661,7 +17732,7 @@
 +	if (len + 1 <= sizeof(a)) {
 +		memcpy(a, s->from, len);
 +		a[len] = '\0';
-+		err = strict_strtoull(a, 0, result);
++		err = kstrtoull(a, 0, result);
 +	}
 +	return err;
 +}
@@ -19762,7 +19833,7 @@
 +	return mask;
 +}
 --- a/fs/aufs/procfs.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/procfs.c	2011-10-29 11:40:05.623788233 +0100
++++ b/fs/aufs/procfs.c	2011-11-19 23:25:01.979822863 +0000
 @@ -0,0 +1,170 @@
 +/*
 + * Copyright (C) 2010-2011 Junjiro R. Okajima
@@ -19880,7 +19951,7 @@
 +	} else if (unlikely(strncmp("si=", buf, 3)))
 +		goto out;
 +
-+	err = strict_strtoul(buf + 3, 16, &id);
++	err = kstrtoul(buf + 3, 16, &id);
 +	if (unlikely(err))
 +		goto out;
 +
@@ -19935,8 +20006,8 @@
 +	return err;
 +}
 --- a/fs/aufs/rdu.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/rdu.c	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,383 @@
++++ b/fs/aufs/rdu.c	2011-11-19 23:25:01.979822863 +0000
+@@ -0,0 +1,385 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -20005,6 +20076,7 @@
 +		if (unlikely(nlen > AUFS_MAX_NAMELEN))
 +			ent.type = DT_UNKNOWN;
 +
++		/* unnecessary to support mmap_sem since this is a dir */
 +		err = -EFAULT;
 +		if (copy_to_user(arg->ent.e, &ent, sizeof(ent)))
 +			goto out;
@@ -20178,6 +20250,7 @@
 +	sb = file->f_dentry->d_sb;
 +	si_read_lock(sb, AuLock_FLUSH);
 +	while (nent-- > 0) {
++		/* unnecessary to support mmap_sem since this is a dir */
 +		err = copy_from_user(&ent, u->e, sizeof(ent));
 +		if (!err)
 +			err = !access_ok(VERIFY_WRITE, &u->e->ino, sizeof(ino));
@@ -20929,7 +21002,7 @@
 +#endif /* __KERNEL__ */
 +#endif /* __AUFS_SPL_H__ */
 --- a/fs/aufs/super.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/super.c	2011-10-29 11:40:05.623788233 +0100
++++ b/fs/aufs/super.c	2011-11-19 23:25:01.979822863 +0000
 @@ -0,0 +1,939 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -21706,7 +21779,7 @@
 +	inode->i_op = &aufs_dir_iop;
 +	inode->i_fop = &aufs_dir_fop;
 +	inode->i_mode = S_IFDIR;
-+	inode->i_nlink = 2;
++	set_nlink(inode, 2);
 +	unlock_new_inode(inode);
 +
 +	root = d_alloc_root(inode);
@@ -22639,7 +22712,7 @@
 +#endif /* __KERNEL__ */
 +#endif /* __SYSAUFS_H__ */
 --- a/fs/aufs/sysfs.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/sysfs.c	2011-10-29 11:40:05.623788233 +0100
++++ b/fs/aufs/sysfs.c	2011-11-19 23:25:01.979822863 +0000
 @@ -0,0 +1,260 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
@@ -22822,7 +22895,7 @@
 +	bend = au_sbend(sb);
 +	if (!strncmp(name, SysaufsBr_PREFIX, sizeof(SysaufsBr_PREFIX) - 1)) {
 +		name += sizeof(SysaufsBr_PREFIX) - 1;
-+		err = strict_strtol(name, 10, &l);
++		err = kstrtol(name, 10, &l);
 +		if (!err) {
 +			if (l <= bend)
 +				err = sysaufs_si_br(seq, sb, (aufs_bindex_t)l);
@@ -23945,8 +24018,8 @@
 +	return 0;
 +}
 --- a/fs/aufs/vfsub.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/vfsub.c	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,836 @@
++++ b/fs/aufs/vfsub.c	2011-11-19 23:25:01.979822863 +0000
+@@ -0,0 +1,837 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -24402,6 +24475,7 @@
 +
 +/* ---------------------------------------------------------------------- */
 +
++/* todo: support mmap_sem? */
 +ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count,
 +		     loff_t *ppos)
 +{
@@ -26867,8 +26941,8 @@
 +#endif /* __KERNEL__ */
 +#endif /* __AUFS_WHOUT_H__ */
 --- a/fs/aufs/wkq.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/wkq.c	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,244 @@
++++ b/fs/aufs/wkq.c	2011-11-19 23:25:01.979822863 +0000
+@@ -0,0 +1,214 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -26895,23 +26969,9 @@
 +#include <linux/module.h>
 +#include "aufs.h"
 +
-+/* internal workqueue named AUFS_WKQ_NAME and AUFS_WKQ_PRE_NAME */
-+enum {
-+	AuWkq_INORMAL,
-+	AuWkq_IPRE
-+};
++/* internal workqueue named AUFS_WKQ_NAME */
 +
-+static struct {
-+	char *name;
-+	struct workqueue_struct *wkq;
-+} au_wkq[] = {
-+	[AuWkq_INORMAL] = {
-+		.name = AUFS_WKQ_NAME
-+	},
-+	[AuWkq_IPRE] = {
-+		.name = AUFS_WKQ_PRE_NAME
-+	}
-+};
++static struct workqueue_struct *au_wkq;
 +
 +struct au_wkinfo {
 +	struct work_struct wk;
@@ -26939,7 +26999,7 @@
 +		complete(wkinfo->comp);
 +	else {
 +		kobject_put(wkinfo->kobj);
-+		module_put(THIS_MODULE);
++		module_put(THIS_MODULE); /* todo: ?? */
 +		kfree(wkinfo);
 +	}
 +}
@@ -26987,8 +27047,6 @@
 +
 +static void au_wkq_run(struct au_wkinfo *wkinfo)
 +{
-+	struct workqueue_struct *wkq;
-+
 +	if (au_ftest_wkq(wkinfo->flags, NEST)) {
 +		if (au_wkq_test()) {
 +			AuWarn1("wkq from wkq, due to a dead dir by UDBA?\n");
@@ -26999,10 +27057,7 @@
 +
 +	if (au_ftest_wkq(wkinfo->flags, WAIT)) {
 +		INIT_WORK_ONSTACK(&wkinfo->wk, wkq_func);
-+		wkq = au_wkq[AuWkq_INORMAL].wkq;
-+		if (au_ftest_wkq(wkinfo->flags, PRE))
-+			wkq = au_wkq[AuWkq_IPRE].wkq;
-+		queue_work(wkq, &wkinfo->wk);
++		queue_work(au_wkq, &wkinfo->wk);
 +	} else {
 +		INIT_WORK(&wkinfo->wk, wkq_func);
 +		schedule_work(&wkinfo->wk);
@@ -27063,7 +27118,7 @@
 +		wkinfo->args = args;
 +		wkinfo->comp = NULL;
 +		kobject_get(wkinfo->kobj);
-+		__module_get(THIS_MODULE);
++		__module_get(THIS_MODULE); /* todo: ?? */
 +
 +		au_wkq_run(wkinfo);
 +	} else {
@@ -27085,37 +27140,26 @@
 +
 +void au_wkq_fin(void)
 +{
-+	int i;
-+
-+	for (i = 0; i < ARRAY_SIZE(au_wkq); i++)
-+		if (au_wkq[i].wkq)
-+			destroy_workqueue(au_wkq[i].wkq);
++	destroy_workqueue(au_wkq);
 +}
 +
 +int __init au_wkq_init(void)
 +{
-+	int err, i;
++	int err;
 +
 +	err = 0;
-+	for (i = 0; !err && i < ARRAY_SIZE(au_wkq); i++) {
-+		BUILD_BUG_ON(!WQ_RESCUER);
-+		au_wkq[i].wkq = alloc_workqueue(au_wkq[i].name, !WQ_RESCUER,
-+						WQ_DFL_ACTIVE);
-+		if (IS_ERR(au_wkq[i].wkq))
-+			err = PTR_ERR(au_wkq[i].wkq);
-+		else if (!au_wkq[i].wkq)
-+			err = -ENOMEM;
-+		if (unlikely(err))
-+			au_wkq[i].wkq = NULL;
-+	}
-+	if (unlikely(err))
-+		au_wkq_fin();
++	BUILD_BUG_ON(!WQ_RESCUER);
++	au_wkq = alloc_workqueue(AUFS_WKQ_NAME, !WQ_RESCUER, WQ_DFL_ACTIVE);
++	if (IS_ERR(au_wkq))
++		err = PTR_ERR(au_wkq);
++	else if (!au_wkq)
++		err = -ENOMEM;
 +
 +	return err;
 +}
 --- a/fs/aufs/wkq.h	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/wkq.h	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,101 @@
++++ b/fs/aufs/wkq.h	2011-11-19 23:25:01.979822863 +0000
+@@ -0,0 +1,96 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -27166,18 +27210,18 @@
 +
 +/* wkq flags */
 +#define AuWkq_WAIT	1
-+#define AuWkq_PRE	(1 << 1)
-+#ifdef CONFIG_AUFS_HNOTIFY
-+#define AuWkq_NEST	(1 << 2)
-+#else
-+#define AuWkq_NEST	0
-+#endif
++#define AuWkq_NEST	(1 << 1)
 +#define au_ftest_wkq(flags, name)	((flags) & AuWkq_##name)
 +#define au_fset_wkq(flags, name) \
 +	do { (flags) |= AuWkq_##name; } while (0)
 +#define au_fclr_wkq(flags, name) \
 +	do { (flags) &= ~AuWkq_##name; } while (0)
 +
++#ifndef CONFIG_AUFS_HNOTIFY
++#undef AuWkq_NEST
++#define AuWkq_NEST	0
++#endif
++
 +/* wkq.c */
 +int au_wkq_do_wait(unsigned int flags, au_wkq_func_t func, void *args);
 +int au_wkq_nowait(au_wkq_func_t func, void *args, struct super_block *sb,
@@ -27193,11 +27237,6 @@
 +	return current->flags & PF_WQ_WORKER;
 +}
 +
-+static inline int au_wkq_wait_pre(au_wkq_func_t func, void *args)
-+{
-+	return au_wkq_do_wait(AuWkq_WAIT | AuWkq_PRE, func, args);
-+}
-+
 +static inline int au_wkq_wait(au_wkq_func_t func, void *args)
 +{
 +	return au_wkq_do_wait(AuWkq_WAIT, func, args);
@@ -27218,8 +27257,8 @@
 +#endif /* __KERNEL__ */
 +#endif /* __AUFS_WKQ_H__ */
 --- a/fs/aufs/xino.c	1970-01-01 01:00:00.000000000 +0100
-+++ b/fs/aufs/xino.c	2011-10-29 11:40:05.623788233 +0100
-@@ -0,0 +1,1265 @@
++++ b/fs/aufs/xino.c	2011-11-19 23:25:01.979822863 +0000
+@@ -0,0 +1,1266 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -27247,6 +27286,7 @@
 +#include <linux/uaccess.h>
 +#include "aufs.h"
 +
++/* todo: unnecessary to support mmap_sem since kernel-space? */
 +ssize_t xino_fread(au_readf_t func, struct file *file, void *kbuf, size_t size,
 +		   loff_t *pos)
 +{
@@ -28486,8 +28526,8 @@
 +	return err;
 +}
 --- a/include/linux/aufs_type.h	1970-01-01 01:00:00.000000000 +0100
-+++ b/include/linux/aufs_type.h	2011-10-31 04:11:18.522727651 +0000
-@@ -0,0 +1,220 @@
++++ b/include/linux/aufs_type.h	2011-11-19 23:25:01.979822863 +0000
+@@ -0,0 +1,224 @@
 +/*
 + * Copyright (C) 2005-2011 Junjiro R. Okajima
 + *
@@ -28512,9 +28552,14 @@
 +#include <linux/ioctl.h>
 +#include <linux/kernel.h>
 +#include <linux/limits.h>
++#ifdef __KERNEL__
 +#include <linux/types.h>
++#else
++#include <stdint.h>
++#include <sys/types.h>
++#endif
 +
-+#define AUFS_VERSION	"3.1-20111031"
++#define AUFS_VERSION	"3.x-rcN-20111114"
 +
 +/* todo? move this to linux-2.6.19/include/magic.h */
 +#define AUFS_SUPER_MAGIC	('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
@@ -28522,10 +28567,10 @@
 +/* ---------------------------------------------------------------------- */
 +
 +#ifdef CONFIG_AUFS_BRANCH_MAX_127
-+typedef __s8 aufs_bindex_t;
++typedef int8_t aufs_bindex_t;
 +#define AUFS_BRANCH_MAX 127
 +#else
-+typedef __s16 aufs_bindex_t;
++typedef int16_t aufs_bindex_t;
 +#ifdef CONFIG_AUFS_BRANCH_MAX_511
 +#define AUFS_BRANCH_MAX 511
 +#elif defined(CONFIG_AUFS_BRANCH_MAX_1023)
@@ -28567,7 +28612,6 @@
 +#define AUFS_RDBLK_DEF		512 /* bytes */
 +#define AUFS_RDHASH_DEF		32
 +#define AUFS_WKQ_NAME		AUFS_NAME "d"
-+#define AUFS_WKQ_PRE_NAME	AUFS_WKQ_NAME "_pre"
 +#define AUFS_MFS_DEF_SEC	30 /* seconds */
 +#define AUFS_MFS_MAX_SEC	3600 /* seconds */
 +#define AUFS_PLINK_WARN		100 /* number of plinks */
@@ -28629,19 +28673,19 @@
 +#endif
 +
 +struct au_rdu_cookie {
-+	__u64		h_pos;
-+	__s16		bindex;
-+	__u8		flags;
-+	__u8		pad;
-+	__u32		generation;
++	uint64_t	h_pos;
++	int16_t		bindex;
++	uint8_t		flags;
++	uint8_t		pad;
++	uint32_t	generation;
 +} __aligned(8);
 +
 +struct au_rdu_ent {
-+	__u64		ino;
-+	__s16		bindex;
-+	__u8		type;
-+	__u8		nlen;
-+	__u8		wh;
++	uint64_t	ino;
++	int16_t		bindex;
++	uint8_t		type;
++	uint8_t		nlen;
++	uint8_t		wh;
 +	char		name[0];
 +} __aligned(8);
 +
@@ -28649,12 +28693,12 @@
 +{
 +	/* include the terminating NULL */
 +	return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1,
-+		     sizeof(__u64));
++		     sizeof(uint64_t));
 +}
 +
 +union au_rdu_ent_ul {
 +	struct au_rdu_ent __user	*e;
-+	__u64				ul;
++	uint64_t			ul;
 +};
 +
 +enum {
@@ -28665,21 +28709,21 @@
 +struct aufs_rdu {
 +	/* input */
 +	union {
-+		__u64		sz;	/* AuCtl_RDU */
-+		__u64		nent;	/* AuCtl_RDU_INO */
++		uint64_t	sz;	/* AuCtl_RDU */
++		uint64_t	nent;	/* AuCtl_RDU_INO */
 +	};
 +	union au_rdu_ent_ul	ent;
-+	__u16			verify[AufsCtlRduV_End];
++	uint16_t		verify[AufsCtlRduV_End];
 +
 +	/* input/output */
-+	__u32			blk;
++	uint32_t		blk;
 +
 +	/* output */
 +	union au_rdu_ent_ul	tail;
 +	/* number of entries which were added in a single call */
-+	__u64			rent;
-+	__u8			full;
-+	__u8			shwh;
++	uint64_t		rent;
++	uint8_t			full;
++	uint8_t			shwh;
 +
 +	struct au_rdu_cookie	cookie;
 +} __aligned(8);
@@ -28687,15 +28731,15 @@
 +/* ---------------------------------------------------------------------- */
 +
 +struct aufs_wbr_fd {
-+	__u32	oflags;
-+	__s16	brid;
++	uint32_t	oflags;
++	int16_t		brid;
 +} __aligned(8);
 +
 +/* ---------------------------------------------------------------------- */
 +
 +struct aufs_ibusy {
-+	__u64	ino, h_ino;
-+	__s16	bindex;
++	uint64_t	ino, h_ino;
++	int16_t		bindex;
 +} __aligned(8);
 +
 +/* ---------------------------------------------------------------------- */

Modified: dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-base.patch
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-base.patch	Sat Nov 19 18:55:14 2011	(r18297)
+++ dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-base.patch	Sat Nov 19 23:53:33 2011	(r18298)
@@ -1,10 +1,10 @@
-aufs3.1 base patch
+aufs3.x-rcN base patch
 
 diff --git a/fs/namei.c b/fs/namei.c
-index 0b3138d..8edad02 100644
+index ac6d214..f72b667 100644
 --- a/fs/namei.c
 +++ b/fs/namei.c
-@@ -1748,7 +1748,7 @@ static struct dentry *__lookup_hash(struct qstr *name,
+@@ -1750,7 +1750,7 @@ static struct dentry *__lookup_hash(struct qstr *name,
   * needs parent already locked. Doesn't follow mounts.
   * SMP-safe.
   */
@@ -42,10 +42,10 @@
  	ssize_t (*splice_read)(struct file *, loff_t *,
  			       struct pipe_inode_info *, size_t, unsigned int);
 diff --git a/include/linux/namei.h b/include/linux/namei.h
-index 409328d..40afdc0 100644
+index ffc0213..ef35a31 100644
 --- a/include/linux/namei.h
 +++ b/include/linux/namei.h
-@@ -84,6 +84,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
+@@ -85,6 +85,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
  extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
  		int (*open)(struct inode *, struct file *));
  

Modified: dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-kbuild.patch
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-kbuild.patch	Sat Nov 19 18:55:14 2011	(r18297)
+++ dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-kbuild.patch	Sat Nov 19 23:53:33 2011	(r18298)
@@ -1,7 +1,7 @@
-aufs3.1 kbuild patch
+aufs3.x-rcN kbuild patch
 
 diff --git a/fs/Kconfig b/fs/Kconfig
-index 9fe0b34..c4311f8 100644
+index 5f4c45d..357a8a6 100644
 --- a/fs/Kconfig
 +++ b/fs/Kconfig
 @@ -215,6 +215,7 @@ source "fs/pstore/Kconfig"
@@ -13,11 +13,11 @@
  endif # MISC_FILESYSTEMS
  
 diff --git a/fs/Makefile b/fs/Makefile
-index afc1096..5c5ac76 100644
+index d2c3353..680ad8a 100644
 --- a/fs/Makefile
 +++ b/fs/Makefile
 @@ -123,3 +123,4 @@ obj-$(CONFIG_GFS2_FS)           += gfs2/
- obj-$(CONFIG_EXOFS_FS)          += exofs/
+ obj-y				+= exofs/ # Multiple modules
  obj-$(CONFIG_CEPH_FS)		+= ceph/
  obj-$(CONFIG_PSTORE)		+= pstore/
 +obj-$(CONFIG_AUFS_FS)           += aufs/

Modified: dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-standalone.patch
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-standalone.patch	Sat Nov 19 18:55:14 2011	(r18297)
+++ dists/trunk/linux-2.6/debian/patches/features/all/aufs3/aufs3-standalone.patch	Sat Nov 19 23:53:33 2011	(r18298)
@@ -1,4 +1,4 @@
-aufs3.1 standalone patch
+aufs3.x-rcN standalone patch
 
 diff --git a/fs/file_table.c b/fs/file_table.c
 index c322794..2aad244 100644
@@ -14,7 +14,7 @@
  
  /*
 diff --git a/fs/inode.c b/fs/inode.c
-index ec79246..46ac6f9 100644
+index ee4e66b..728042b 100644
 --- a/fs/inode.c
 +++ b/fs/inode.c
 @@ -65,6 +65,7 @@ static struct hlist_head *inode_hashtable __read_mostly;
@@ -26,10 +26,10 @@
  /*
   * Empty aops. Can be used for the cases where the user does not
 diff --git a/fs/namei.c b/fs/namei.c
-index 8edad02..50e8718 100644
+index f72b667..7a58222 100644
 --- a/fs/namei.c
 +++ b/fs/namei.c
-@@ -1752,6 +1752,7 @@ struct dentry *lookup_hash(struct nameidata *nd)
+@@ -1754,6 +1754,7 @@ struct dentry *lookup_hash(struct nameidata *nd)
  {
  	return __lookup_hash(&nd->last, nd->path.dentry, nd);
  }
@@ -38,10 +38,10 @@
  /**
   * lookup_one_len - filesystem helper to lookup single pathname component
 diff --git a/fs/namespace.c b/fs/namespace.c
-index b4febb2..598a308 100644
+index e5e1c7d..344999b 100644
 --- a/fs/namespace.c
 +++ b/fs/namespace.c
-@@ -1508,6 +1508,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
+@@ -1509,6 +1509,7 @@ int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
  	}
  	return 0;
  }
@@ -111,7 +111,7 @@
  static int fsnotify_mark_destroy(void *ignored)
  {
 diff --git a/fs/open.c b/fs/open.c
-index f711921..d742fc0 100644
+index 22c41b5..33b4033 100644
 --- a/fs/open.c
 +++ b/fs/open.c
 @@ -60,6 +60,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
@@ -143,10 +143,10 @@
  /**
   * splice_direct_to_actor - splices data directly between two non-pipes
 diff --git a/security/commoncap.c b/security/commoncap.c
-index a93b3b7..024282c 100644
+index ee4f848..611fd70 100644
 --- a/security/commoncap.c
 +++ b/security/commoncap.c
-@@ -971,3 +971,4 @@ int cap_file_mmap(struct file *file, unsigned long reqprot,
+@@ -975,3 +975,4 @@ int cap_file_mmap(struct file *file, unsigned long reqprot,
  	}
  	return ret;
  }
@@ -164,10 +164,10 @@
  int devcgroup_inode_mknod(int mode, dev_t dev)
  {
 diff --git a/security/security.c b/security/security.c
-index d9e1533..466ee5c 100644
+index 0c6cc69..d58ba1b 100644
 --- a/security/security.c
 +++ b/security/security.c
-@@ -373,6 +373,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
+@@ -411,6 +411,7 @@ int security_path_rmdir(struct path *dir, struct dentry *dentry)
  		return 0;
  	return security_ops->path_rmdir(dir, dentry);
  }
@@ -175,7 +175,7 @@
  
  int security_path_unlink(struct path *dir, struct dentry *dentry)
  {
-@@ -389,6 +390,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
+@@ -427,6 +428,7 @@ int security_path_symlink(struct path *dir, struct dentry *dentry,
  		return 0;
  	return security_ops->path_symlink(dir, dentry, old_name);
  }
@@ -183,7 +183,7 @@
  
  int security_path_link(struct dentry *old_dentry, struct path *new_dir,
  		       struct dentry *new_dentry)
-@@ -397,6 +399,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
+@@ -435,6 +437,7 @@ int security_path_link(struct dentry *old_dentry, struct path *new_dir,
  		return 0;
  	return security_ops->path_link(old_dentry, new_dir, new_dentry);
  }
@@ -191,7 +191,7 @@
  
  int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
  			 struct path *new_dir, struct dentry *new_dentry)
-@@ -415,6 +418,7 @@ int security_path_truncate(struct path *path)
+@@ -453,6 +456,7 @@ int security_path_truncate(struct path *path)
  		return 0;
  	return security_ops->path_truncate(path);
  }
@@ -199,7 +199,7 @@
  
  int security_path_chmod(struct dentry *dentry, struct vfsmount *mnt,
  			mode_t mode)
-@@ -423,6 +427,7 @@ int security_path_chmod(struct dentry *dentry, struct vfsmount *mnt,
+@@ -461,6 +465,7 @@ int security_path_chmod(struct dentry *dentry, struct vfsmount *mnt,
  		return 0;
  	return security_ops->path_chmod(dentry, mnt, mode);
  }
@@ -207,7 +207,7 @@
  
  int security_path_chown(struct path *path, uid_t uid, gid_t gid)
  {
-@@ -430,6 +435,7 @@ int security_path_chown(struct path *path, uid_t uid, gid_t gid)
+@@ -468,6 +473,7 @@ int security_path_chown(struct path *path, uid_t uid, gid_t gid)
  		return 0;
  	return security_ops->path_chown(path, uid, gid);
  }
@@ -215,7 +215,7 @@
  
  int security_path_chroot(struct path *path)
  {
-@@ -506,6 +512,7 @@ int security_inode_readlink(struct dentry *dentry)
+@@ -544,6 +550,7 @@ int security_inode_readlink(struct dentry *dentry)
  		return 0;
  	return security_ops->inode_readlink(dentry);
  }
@@ -223,7 +223,7 @@
  
  int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
  {
-@@ -520,6 +527,7 @@ int security_inode_permission(struct inode *inode, int mask)
+@@ -558,6 +565,7 @@ int security_inode_permission(struct inode *inode, int mask)
  		return 0;
  	return security_ops->inode_permission(inode, mask);
  }
@@ -231,7 +231,7 @@
  
  int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
  {
-@@ -619,6 +627,7 @@ int security_file_permission(struct file *file, int mask)
+@@ -673,6 +681,7 @@ int security_file_permission(struct file *file, int mask)
  
  	return fsnotify_perm(file, mask);
  }
@@ -239,7 +239,7 @@
  
  int security_file_alloc(struct file *file)
  {
-@@ -646,6 +655,7 @@ int security_file_mmap(struct file *file, unsigned long reqprot,
+@@ -700,6 +709,7 @@ int security_file_mmap(struct file *file, unsigned long reqprot,
  		return ret;
  	return ima_file_mmap(file, prot);
  }



More information about the Kernel-svn-changes mailing list