diff --git a/debian/changelog b/debian/changelog index 8df9c6c43..b13089635 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,7 @@ linux-2.6 (3.2~rc2-1~experimental.1) UNRELEASED; urgency=low [ 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 diff --git a/debian/patches/features/all/aufs3/aufs3-add.patch b/debian/patches/features/all/aufs3/aufs3-add.patch index 6883e2403..5c118d5ae 100644 --- a/debian/patches/features/all/aufs3/aufs3-add.patch +++ b/debian/patches/features/all/aufs3/aufs3-add.patch @@ -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); -+ err = vfsub_write_u(h_file, buf, count, ppos); -+ au_cpup_attr_timesizes(inode); -+ inode->i_mode = h_file->f_dentry->d_inode->i_mode; -+ -+out_unlock: + 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: -+ 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); -+ err = au_do_aio(h_file, MAY_WRITE, kio, iov, nv, pos); -+ au_cpup_attr_timesizes(inode); -+ inode->i_mode = h_file->f_dentry->d_inode->i_mode; -+ -+out_unlock: ++ 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: -+ 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); -+ err = vfsub_splice_from(pipe, h_file, ppos, len, flags); -+ au_cpup_attr_timesizes(inode); -+ inode->i_mode = h_file->f_dentry->d_inode->i_mode; -+ -+out_unlock: + 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: -+ 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; -+} ++ lockdep_on(); + -+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; -+ -+ 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 +#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 +#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 +#include +#include ++#ifdef __KERNEL__ +#include ++#else ++#include ++#include ++#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); + +/* ---------------------------------------------------------------------- */ diff --git a/debian/patches/features/all/aufs3/aufs3-base.patch b/debian/patches/features/all/aufs3/aufs3-base.patch index 928c3cec7..8d94f4fed 100644 --- a/debian/patches/features/all/aufs3/aufs3-base.patch +++ b/debian/patches/features/all/aufs3/aufs3-base.patch @@ -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 @@ index fa2defa..e3569b0 100644 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 *)); diff --git a/debian/patches/features/all/aufs3/aufs3-kbuild.patch b/debian/patches/features/all/aufs3/aufs3-kbuild.patch index d96b7f9a5..240d5bdbb 100644 --- a/debian/patches/features/all/aufs3/aufs3-kbuild.patch +++ b/debian/patches/features/all/aufs3/aufs3-kbuild.patch @@ -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 @@ index 9fe0b34..c4311f8 100644 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/ diff --git a/debian/patches/features/all/aufs3/aufs3-standalone.patch b/debian/patches/features/all/aufs3/aufs3-standalone.patch index 8a290df0b..f519d502a 100644 --- a/debian/patches/features/all/aufs3/aufs3-standalone.patch +++ b/debian/patches/features/all/aufs3/aufs3-standalone.patch @@ -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 @@ index c322794..2aad244 100644 /* 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 @@ index ec79246..46ac6f9 100644 /* * 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 @@ index 8edad02..50e8718 100644 /** * 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 @@ index e14587d..be6533b 100644 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 @@ index e3569b0..9dc07b7 100644 /** * 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 @@ index 4450fbe..2c437e5 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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 @@ index d9e1533..466ee5c 100644 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); }