[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