Make the core vfs helpers more orthogonal by passing nameidata structs into all of them (not just vfs_create) Signed-off-by: Matt Helsley <matthltc@xxxxxxxxxx> --- TODO: Add the nameidata pointers to vfs_rename Applies and compiles to 2.6.25-rc3-mm1 Tested successfully on 2.6.25-rc2-mm1 (rc3-mm1 in progress) Right now I have the patches in a volatile form -- they aren't broken up to make gradual API migration easier. One way to make them more digestible for inclusion might be: PATCH 1 - Add vfs_*_namei() helpers PATCH 2 - Use new helpers in fs/namei.c PATCH 3 - Use new helpers in nfsd PATCH 4 - Use new helpers in reiserfs PATCH 5 - Use new helpers in unionfs PATCH 6 - Use new helpers in IPC PATCH 7 - Use new helpers in control groups PATCH 8 - Use new helpers in unix sockets PATCH 9 - Remove old helpers PATCH 10 - Rename new helpers: namei.c PATCH 11 - Rename new helpers: nfsd PATCH 12 - Rename new helpers: reiserfs PATCH 13 - Rename new helpers: unionfs PATCH 14 - Rename new helpers: IPC PATCH 15 - Rename new helpers: control groups PATCH 16 - Rename new helpers: unix sockets Is there a better/preferred way to break this up? fs/ecryptfs/inode.c | 12 +++++----- fs/namei.c | 54 +++++++++++++++++++++++++++--------------------- fs/nfsd/nfs4recover.c | 6 ++--- fs/nfsd/vfs.c | 14 ++++++------ fs/reiserfs/xattr.c | 2 - fs/unionfs/commonfops.c | 2 - fs/unionfs/copyup.c | 2 - fs/unionfs/dirhelper.c | 2 - fs/unionfs/inode.c | 15 +++++++------ fs/unionfs/rename.c | 4 +-- fs/unionfs/sioq.c | 8 +++---- fs/unionfs/unlink.c | 4 +-- include/linux/fs.h | 15 ++++++++----- ipc/mqueue.c | 2 - kernel/cgroup.c | 2 - net/unix/af_unix.c | 2 - 16 files changed, 79 insertions(+), 67 deletions(-) Index: linux-2.6.25-rc2-mm1/fs/namei.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/namei.c +++ linux-2.6.25-rc2-mm1/fs/namei.c @@ -1462,21 +1462,22 @@ static inline int check_sticky(struct in * 8. If we were asked to remove a non-directory and victim isn't one - EISDIR. * 9. We can't remove a root or mountpoint. * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir,struct dentry *victim,int isdir) +static int may_delete(struct inode *dir, struct dentry *victim, int isdir, + struct nameidata *nd) { int error; if (!victim->d_inode) return -ENOENT; BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(victim->d_name.name, victim, dir); - error = permission(dir,MAY_WRITE | MAY_EXEC, NULL); + error = permission(dir,MAY_WRITE | MAY_EXEC, nd); if (error) return error; if (IS_APPEND(dir)) return -EPERM; if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| @@ -2013,13 +2014,14 @@ enoent: fail: return dentry; } EXPORT_SYMBOL_GPL(lookup_create); -int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) +int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev, + struct nameidata *nd) { - int error = may_create(dir, dentry, NULL); + int error = may_create(dir, dentry, nd); if (error) return error; if ((S_ISCHR(mode) || S_ISBLK(mode)) && !capable(CAP_MKNOD)) @@ -2090,14 +2092,15 @@ asmlinkage long sys_mknodat(int dfd, con case 0: case S_IFREG: error = vfs_create(nd.path.dentry->d_inode,dentry,mode,&nd); break; case S_IFCHR: case S_IFBLK: error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode, - new_decode_dev(dev)); + new_decode_dev(dev), &nd); break; case S_IFIFO: case S_IFSOCK: - error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,0); + error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,0, + &nd); break; } mnt_drop_write(nd.path.mnt); out_dput: dput(dentry); @@ -2113,13 +2116,14 @@ out: asmlinkage long sys_mknod(const char __user *filename, int mode, unsigned dev) { return sys_mknodat(AT_FDCWD, filename, mode, dev); } -int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) +int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode, + struct nameidata *nd) { - int error = may_create(dir, dentry, NULL); + int error = may_create(dir, dentry, nd); if (error) return error; if (!dir->i_op || !dir->i_op->mkdir) @@ -2160,11 +2164,11 @@ asmlinkage long sys_mkdirat(int dfd, con if (!IS_POSIXACL(nd.path.dentry->d_inode)) mode &= ~current->fs->umask; error = mnt_want_write(nd.path.mnt); if (error) goto out_dput; - error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); + error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode, &nd); mnt_drop_write(nd.path.mnt); out_dput: dput(dentry); out_unlock: mutex_unlock(&nd.path.dentry->d_inode->i_mutex); @@ -2205,13 +2209,13 @@ void dentry_unhash(struct dentry *dentry __d_drop(dentry); spin_unlock(&dentry->d_lock); spin_unlock(&dcache_lock); } -int vfs_rmdir(struct inode *dir, struct dentry *dentry) +int vfs_rmdir(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(dir, dentry, 1, nd); if (error) return error; if (!dir->i_op || !dir->i_op->rmdir) @@ -2272,11 +2276,11 @@ static long do_rmdir(int dfd, const char if (IS_ERR(dentry)) goto exit2; error = mnt_want_write(nd.path.mnt); if (error) goto exit3; - error = vfs_rmdir(nd.path.dentry->d_inode, dentry); + error = vfs_rmdir(nd.path.dentry->d_inode, dentry, &nd); mnt_drop_write(nd.path.mnt); exit3: dput(dentry); exit2: mutex_unlock(&nd.path.dentry->d_inode->i_mutex); @@ -2290,13 +2294,13 @@ exit: asmlinkage long sys_rmdir(const char __user *pathname) { return do_rmdir(AT_FDCWD, pathname); } -int vfs_unlink(struct inode *dir, struct dentry *dentry) +int vfs_unlink(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { - int error = may_delete(dir, dentry, 0); + int error = may_delete(dir, dentry, 0, nd); if (error) return error; if (!dir->i_op || !dir->i_op->unlink) @@ -2358,11 +2362,11 @@ static long do_unlinkat(int dfd, const c if (inode) atomic_inc(&inode->i_count); error = mnt_want_write(nd.path.mnt); if (error) goto exit2; - error = vfs_unlink(nd.path.dentry->d_inode, dentry); + error = vfs_unlink(nd.path.dentry->d_inode, dentry, &nd); mnt_drop_write(nd.path.mnt); exit2: dput(dentry); } mutex_unlock(&nd.path.dentry->d_inode->i_mutex); @@ -2394,13 +2398,14 @@ asmlinkage long sys_unlinkat(int dfd, co asmlinkage long sys_unlink(const char __user *pathname) { return do_unlinkat(AT_FDCWD, pathname); } -int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname, int mode) +int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname, + int mode, struct nameidata *nd) { - int error = may_create(dir, dentry, NULL); + int error = may_create(dir, dentry, nd); if (error) return error; if (!dir->i_op || !dir->i_op->symlink) @@ -2443,11 +2448,12 @@ asmlinkage long sys_symlinkat(const char goto out_unlock; error = mnt_want_write(nd.path.mnt); if (error) goto out_dput; - error = vfs_symlink(nd.path.dentry->d_inode, dentry, from, S_IALLUGO); + error = vfs_symlink(nd.path.dentry->d_inode, dentry, from, S_IALLUGO, + &nd); mnt_drop_write(nd.path.mnt); out_dput: dput(dentry); out_unlock: mutex_unlock(&nd.path.dentry->d_inode->i_mutex); @@ -2462,19 +2468,20 @@ out_putname: asmlinkage long sys_symlink(const char __user *oldname, const char __user *newname) { return sys_symlinkat(oldname, AT_FDCWD, newname); } -int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry) +int vfs_link(struct dentry *old_dentry, struct inode *dir, + struct dentry *new_dentry, struct nameidata *new_nd) { struct inode *inode = old_dentry->d_inode; int error; if (!inode) return -ENOENT; - error = may_create(dir, new_dentry, NULL); + error = may_create(dir, new_dentry, new_nd); if (error) return error; if (dir->i_sb != inode->i_sb) return -EXDEV; @@ -2543,11 +2550,12 @@ asmlinkage long sys_linkat(int olddfd, c if (IS_ERR(new_dentry)) goto out_unlock; error = mnt_want_write(nd.path.mnt); if (error) goto out_dput; - error = vfs_link(old_nd.path.dentry, nd.path.dentry->d_inode, new_dentry); + error = vfs_link(old_nd.path.dentry, nd.path.dentry->d_inode, + new_dentry, &nd); mnt_drop_write(nd.path.mnt); out_dput: dput(new_dentry); out_unlock: mutex_unlock(&nd.path.dentry->d_inode->i_mutex); @@ -2677,18 +2685,18 @@ int vfs_rename(struct inode *old_dir, st const char *old_name; if (old_dentry->d_inode == new_dentry->d_inode) return 0; - error = may_delete(old_dir, old_dentry, is_dir); + error = may_delete(old_dir, old_dentry, is_dir, NULL); if (error) return error; if (!new_dentry->d_inode) error = may_create(new_dir, new_dentry, NULL); else - error = may_delete(new_dir, new_dentry, is_dir); + error = may_delete(new_dir, new_dentry, is_dir, NULL); if (error) return error; if (!old_dir->i_op || !old_dir->i_op->rename) return -EPERM; Index: linux-2.6.25-rc2-mm1/fs/nfsd/nfs4recover.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/nfsd/nfs4recover.c +++ linux-2.6.25-rc2-mm1/fs/nfsd/nfs4recover.c @@ -156,11 +156,11 @@ nfsd4_create_clid_dir(struct nfs4_client goto out_put; } status = mnt_want_write(rec_dir.path.mnt); if (status) goto out_put; - status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry, S_IRWXU); + status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry, S_IRWXU, NULL); mnt_drop_write(rec_dir.path.mnt); out_put: dput(dentry); out_unlock: mutex_unlock(&rec_dir.path.dentry->d_inode->i_mutex); @@ -261,11 +261,11 @@ nfsd4_remove_clid_file(struct dentry *di if (!S_ISREG(dir->d_inode->i_mode)) { printk("nfsd4: non-file found in client recovery directory\n"); return -EINVAL; } mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); - status = vfs_unlink(dir->d_inode, dentry); + status = vfs_unlink(dir->d_inode, dentry, NULL); mutex_unlock(&dir->d_inode->i_mutex); return status; } static int @@ -276,11 +276,11 @@ nfsd4_clear_clid_dir(struct dentry *dir, /* For now this directory should already be empty, but we empty it of * any regular files anyway, just in case the directory was created by * a kernel from the future.... */ nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file); mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); - status = vfs_rmdir(dir->d_inode, dentry); + status = vfs_rmdir(dir->d_inode, dentry, NULL); mutex_unlock(&dir->d_inode->i_mutex); return status; } static int Index: linux-2.6.25-rc2-mm1/fs/nfsd/vfs.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/nfsd/vfs.c +++ linux-2.6.25-rc2-mm1/fs/nfsd/vfs.c @@ -1256,20 +1256,20 @@ nfsd_create(struct svc_rqst *rqstp, stru switch (type) { case S_IFREG: host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); break; case S_IFDIR: - host_err = vfs_mkdir(dirp, dchild, iap->ia_mode); + host_err = vfs_mkdir(dirp, dchild, iap->ia_mode, NULL); break; case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK: host_err = mnt_want_write(fhp->fh_export->ex_path.mnt); if (host_err) break; - host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); + host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev, NULL); mnt_drop_write(fhp->fh_export->ex_path.mnt); break; default: printk("nfsd: bad file type %o in nfsd_create\n", type); host_err = -EINVAL; @@ -1531,15 +1531,15 @@ nfsd_symlink(struct svc_rqst *rqstp, str if (path_alloced == NULL) host_err = -ENOMEM; else { strncpy(path_alloced, path, plen); path_alloced[plen] = 0; - host_err = vfs_symlink(dentry->d_inode, dnew, path_alloced, mode); + host_err = vfs_symlink(dentry->d_inode, dnew, path_alloced, mode, NULL); kfree(path_alloced); } } else - host_err = vfs_symlink(dentry->d_inode, dnew, path, mode); + host_err = vfs_symlink(dentry->d_inode, dnew, path, mode, NULL); if (!host_err) { if (EX_ISSYNC(fhp->fh_export)) host_err = nfsd_sync_dir(dentry); } @@ -1594,11 +1594,11 @@ nfsd_link(struct svc_rqst *rqstp, struct goto out_nfserr; dold = tfhp->fh_dentry; dest = dold->d_inode; - host_err = vfs_link(dold, dirp, dnew); + host_err = vfs_link(dold, dirp, dnew, NULL); if (!host_err) { if (EX_ISSYNC(ffhp->fh_export)) { err = nfserrno(nfsd_sync_dir(ddir)); write_inode_now(dest, 1); } @@ -1768,13 +1768,13 @@ nfsd_unlink(struct svc_rqst *rqstp, stru if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) && (atomic_read(&rdentry->d_count) > 1)) { host_err = -EPERM; } else #endif - host_err = vfs_unlink(dirp, rdentry); + host_err = vfs_unlink(dirp, rdentry, NULL); } else { /* It's RMDIR */ - host_err = vfs_rmdir(dirp, rdentry); + host_err = vfs_rmdir(dirp, rdentry, NULL); } dput(rdentry); if (host_err) Index: linux-2.6.25-rc2-mm1/ipc/mqueue.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/ipc/mqueue.c +++ linux-2.6.25-rc2-mm1/ipc/mqueue.c @@ -755,11 +755,11 @@ asmlinkage long sys_mq_unlink(const char if (inode) atomic_inc(&inode->i_count); err = mnt_want_write(mqueue_mnt); if (err) goto out_err; - err = vfs_unlink(dentry->d_parent->d_inode, dentry); + err = vfs_unlink(dentry->d_parent->d_inode, dentry, NULL); mnt_drop_write(mqueue_mnt); out_err: dput(dentry); out_unlock: Index: linux-2.6.25-rc2-mm1/net/unix/af_unix.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/net/unix/af_unix.c +++ linux-2.6.25-rc2-mm1/net/unix/af_unix.c @@ -820,11 +820,11 @@ static int unix_bind(struct socket *sock mode = S_IFSOCK | (SOCK_INODE(sock)->i_mode & ~current->fs->umask); err = mnt_want_write(nd.path.mnt); if (err) goto out_mknod_dput; - err = vfs_mknod(nd.path.dentry->d_inode, dentry, mode, 0); + err = vfs_mknod(nd.path.dentry->d_inode, dentry, mode, 0, NULL); mnt_drop_write(nd.path.mnt); if (err) goto out_mknod_dput; mutex_unlock(&nd.path.dentry->d_inode->i_mutex); dput(nd.path.dentry); Index: linux-2.6.25-rc2-mm1/include/linux/fs.h =================================================================== --- linux-2.6.25-rc2-mm1.orig/include/linux/fs.h +++ linux-2.6.25-rc2-mm1/include/linux/fs.h @@ -1123,16 +1123,19 @@ extern void unlock_super(struct super_bl /* * VFS helper functions.. */ extern int vfs_permission(struct nameidata *, int); extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *); -extern int vfs_mkdir(struct inode *, struct dentry *, int); -extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t); -extern int vfs_symlink(struct inode *, struct dentry *, const char *, int); -extern int vfs_link(struct dentry *, struct inode *, struct dentry *); -extern int vfs_rmdir(struct inode *, struct dentry *); -extern int vfs_unlink(struct inode *, struct dentry *); +extern int vfs_mkdir(struct inode *, struct dentry *, int, struct nameidata *); +extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t, + struct nameidata *); +extern int vfs_symlink(struct inode *, struct dentry *, const char *, int, + struct nameidata *); +extern int vfs_link(struct dentry *, struct inode *, struct dentry *, + struct nameidata *); +extern int vfs_rmdir(struct inode *, struct dentry *, struct nameidata *); +extern int vfs_unlink(struct inode *, struct dentry *, struct nameidata *); extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); /* * VFS dentry helper functions. */ Index: linux-2.6.25-rc2-mm1/kernel/cgroup.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/kernel/cgroup.c +++ linux-2.6.25-rc2-mm1/kernel/cgroup.c @@ -2842,11 +2842,11 @@ int cgroup_clone(struct task_struct *tsk ret = PTR_ERR(dentry); goto out_release; } /* Create the cgroup directory, which also creates the cgroup */ - ret = vfs_mkdir(inode, dentry, S_IFDIR | 0755); + ret = vfs_mkdir(inode, dentry, S_IFDIR | 0755, NULL); child = __d_cgrp(dentry); dput(dentry); if (ret) { printk(KERN_INFO "Failed to create cgroup %s: %d\n", nodename, Index: linux-2.6.25-rc2-mm1/fs/reiserfs/xattr.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/reiserfs/xattr.c +++ linux-2.6.25-rc2-mm1/fs/reiserfs/xattr.c @@ -745,11 +745,11 @@ int reiserfs_delete_xattrs(struct inode /* Leftovers besides . and .. -- that's not good. */ if (dir->d_inode->i_nlink <= 2) { root = get_xa_root(inode->i_sb, XATTR_REPLACE); reiserfs_write_lock_xattrs(inode->i_sb); - err = vfs_rmdir(root->d_inode, dir); + err = vfs_rmdir(root->d_inode, dir, NULL); reiserfs_write_unlock_xattrs(inode->i_sb); dput(root); } else { reiserfs_warning(inode->i_sb, "Couldn't remove all entries in directory"); Index: linux-2.6.25-rc2-mm1/fs/ecryptfs/inode.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/ecryptfs/inode.c +++ linux-2.6.25-rc2-mm1/fs/ecryptfs/inode.c @@ -398,11 +398,11 @@ static int ecryptfs_link(struct dentry * lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); dget(lower_old_dentry); dget(lower_new_dentry); lower_dir_dentry = lock_parent(lower_new_dentry); rc = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode, - lower_new_dentry); + lower_new_dentry, NULL); if (rc || !lower_new_dentry->d_inode) goto out_lock; rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0); if (rc) goto out_lock; @@ -426,11 +426,11 @@ static int ecryptfs_unlink(struct inode int rc = 0; struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir); lock_parent(lower_dentry); - rc = vfs_unlink(lower_dir_inode, lower_dentry); + rc = vfs_unlink(lower_dir_inode, lower_dentry, NULL); if (rc) { printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc); goto out_unlock; } fsstack_copy_attr_times(dir, lower_dir_inode); @@ -464,11 +464,11 @@ static int ecryptfs_symlink(struct inode if (encoded_symlen < 0) { rc = encoded_symlen; goto out_lock; } rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry, - encoded_symname, mode); + encoded_symname, mode, NULL); kfree(encoded_symname); if (rc || !lower_dentry->d_inode) goto out_lock; rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0); if (rc) @@ -489,11 +489,11 @@ static int ecryptfs_mkdir(struct inode * struct dentry *lower_dentry; struct dentry *lower_dir_dentry; lower_dentry = ecryptfs_dentry_to_lower(dentry); lower_dir_dentry = lock_parent(lower_dentry); - rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode); + rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode, NULL); if (rc || !lower_dentry->d_inode) goto out; rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0); if (rc) goto out; @@ -515,11 +515,11 @@ static int ecryptfs_rmdir(struct inode * lower_dentry = ecryptfs_dentry_to_lower(dentry); dget(dentry); lower_dir_dentry = lock_parent(lower_dentry); dget(lower_dentry); - rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); + rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, NULL); dput(lower_dentry); if (!rc) d_delete(lower_dentry); fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode); dir->i_nlink = lower_dir_dentry->d_inode->i_nlink; @@ -537,11 +537,11 @@ ecryptfs_mknod(struct inode *dir, struct struct dentry *lower_dentry; struct dentry *lower_dir_dentry; lower_dentry = ecryptfs_dentry_to_lower(dentry); lower_dir_dentry = lock_parent(lower_dentry); - rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev); + rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev, NULL); if (rc || !lower_dentry->d_inode) goto out; rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0); if (rc) goto out; Index: linux-2.6.25-rc2-mm1/fs/unionfs/inode.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/inode.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/inode.c @@ -60,11 +60,11 @@ static int check_for_whiteout(struct den /* .wh.foo has been found, so let's unlink it */ lower_dir_dentry = lock_parent_wh(wh_dentry); /* see Documentation/filesystems/unionfs/issues.txt */ lockdep_off(); - err = vfs_unlink(lower_dir_dentry->d_inode, wh_dentry); + err = vfs_unlink(lower_dir_dentry->d_inode, wh_dentry, NULL); lockdep_on(); unlock_dir(lower_dir_dentry); /* * Whiteouts are special files and should be deleted no matter what @@ -345,11 +345,11 @@ static int unionfs_link(struct dentry *o err = is_robranch_super(new_dentry->d_sb, dbstart(new_dentry)); if (!err) { /* see Documentation/filesystems/unionfs/issues.txt */ lockdep_off(); err = vfs_unlink(lower_dir_dentry->d_inode, - whiteout_dentry); + whiteout_dentry, NULL); lockdep_on(); } fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode); dir->i_nlink = unionfs_get_nlinks(dir); @@ -378,11 +378,11 @@ static int unionfs_link(struct dentry *o err = is_robranch(old_dentry); if (!err) { /* see Documentation/filesystems/unionfs/issues.txt */ lockdep_off(); err = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode, - lower_new_dentry); + lower_new_dentry, NULL); lockdep_on(); } unlock_dir(lower_dir_dentry); docopyup: @@ -411,11 +411,11 @@ docopyup: */ lockdep_off(); /* do vfs_link */ err = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode, - lower_new_dentry); + lower_new_dentry, NULL); lockdep_on(); unlock_dir(lower_dir_dentry); goto check_link; } } @@ -500,11 +500,11 @@ static int unionfs_symlink(struct inode goto out; } mode = S_IALLUGO; err = vfs_symlink(lower_parent_dentry->d_inode, lower_dentry, - symname, mode); + symname, mode, NULL); if (!err) { err = PTR_ERR(unionfs_interpose(dentry, parent->i_sb, 0)); if (!err) { unionfs_copy_attr_times(parent); fsstack_copy_inode_size(parent, @@ -631,11 +631,11 @@ static int unionfs_mkdir(struct inode *p err = PTR_ERR(lower_parent_dentry); goto out; } err = vfs_mkdir(lower_parent_dentry->d_inode, lower_dentry, - mode); + mode, NULL); unlock_dir(lower_parent_dentry); /* did the mkdir succeed? */ if (err) @@ -734,11 +734,12 @@ static int unionfs_mknod(struct inode *p if (IS_ERR(lower_parent_dentry)) { err = PTR_ERR(lower_parent_dentry); goto out; } - err = vfs_mknod(lower_parent_dentry->d_inode, lower_dentry, mode, dev); + err = vfs_mknod(lower_parent_dentry->d_inode, lower_dentry, mode, dev, + NULL); if (!err) { err = PTR_ERR(unionfs_interpose(dentry, parent->i_sb, 0)); if (!err) { unionfs_copy_attr_times(parent); fsstack_copy_inode_size(parent, Index: linux-2.6.25-rc2-mm1/fs/unionfs/sioq.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/sioq.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/sioq.c @@ -67,38 +67,38 @@ void __unionfs_create(struct work_struct void __unionfs_mkdir(struct work_struct *work) { struct sioq_args *args = container_of(work, struct sioq_args, work); struct mkdir_args *m = &args->mkdir; - args->err = vfs_mkdir(m->parent, m->dentry, m->mode); + args->err = vfs_mkdir(m->parent, m->dentry, m->mode, NULL); complete(&args->comp); } void __unionfs_mknod(struct work_struct *work) { struct sioq_args *args = container_of(work, struct sioq_args, work); struct mknod_args *m = &args->mknod; - args->err = vfs_mknod(m->parent, m->dentry, m->mode, m->dev); + args->err = vfs_mknod(m->parent, m->dentry, m->mode, m->dev, NULL); complete(&args->comp); } void __unionfs_symlink(struct work_struct *work) { struct sioq_args *args = container_of(work, struct sioq_args, work); struct symlink_args *s = &args->symlink; - args->err = vfs_symlink(s->parent, s->dentry, s->symbuf, s->mode); + args->err = vfs_symlink(s->parent, s->dentry, s->symbuf, s->mode, NULL); complete(&args->comp); } void __unionfs_unlink(struct work_struct *work) { struct sioq_args *args = container_of(work, struct sioq_args, work); struct unlink_args *u = &args->unlink; - args->err = vfs_unlink(u->parent, u->dentry); + args->err = vfs_unlink(u->parent, u->dentry, NULL); complete(&args->comp); } void __delete_whiteouts(struct work_struct *work) { Index: linux-2.6.25-rc2-mm1/fs/unionfs/unlink.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/unlink.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/unlink.c @@ -42,11 +42,11 @@ static int unionfs_unlink_whiteout(struc dget(lower_dentry); err = is_robranch_super(dentry->d_sb, bindex); if (!err) { /* see Documentation/filesystems/unionfs/issues.txt */ lockdep_off(); - err = vfs_unlink(lower_dir_dentry->d_inode, lower_dentry); + err = vfs_unlink(lower_dir_dentry->d_inode, lower_dentry, NULL); lockdep_on(); } /* if vfs_unlink succeeded, update our inode's times */ if (!err) unionfs_copy_attr_times(dentry->d_inode); @@ -160,11 +160,11 @@ static int unionfs_rmdir_first(struct in dget(lower_dentry); err = is_robranch(dentry); if (!err) { /* see Documentation/filesystems/unionfs/issues.txt */ lockdep_off(); - err = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); + err = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, NULL); lockdep_on(); } dput(lower_dentry); fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode); Index: linux-2.6.25-rc2-mm1/fs/unionfs/dirhelper.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/dirhelper.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/dirhelper.c @@ -68,11 +68,11 @@ int do_delete_whiteouts(struct dentry *d if (IS_ERR(lower_dentry)) { err = PTR_ERR(lower_dentry); break; } if (lower_dentry->d_inode) - err = vfs_unlink(lower_dir, lower_dentry); + err = vfs_unlink(lower_dir, lower_dentry, NULL); dput(lower_dentry); if (err) break; } } Index: linux-2.6.25-rc2-mm1/fs/unionfs/rename.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/rename.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/rename.c @@ -79,11 +79,11 @@ static int __unionfs_rename(struct inode lower_wh_dir_dentry = lock_parent_wh(lower_wh_dentry); err = is_robranch_super(old_dentry->d_sb, bindex); if (!err) err = vfs_unlink(lower_wh_dir_dentry->d_inode, - lower_wh_dentry); + lower_wh_dentry, NULL); dput(lower_wh_dentry); unlock_dir(lower_wh_dir_dentry); if (err) goto out; @@ -220,11 +220,11 @@ static int do_unionfs_rename(struct inod unlink_dir_dentry = lock_parent(unlink_dentry); err = is_robranch_super(old_dir->i_sb, bindex); if (!err) err = vfs_unlink(unlink_dir_dentry->d_inode, - unlink_dentry); + unlink_dentry, NULL); fsstack_copy_attr_times(new_dentry->d_parent->d_inode, unlink_dir_dentry->d_inode); /* propagate number of hard-links */ new_dentry->d_parent->d_inode->i_nlink = Index: linux-2.6.25-rc2-mm1/fs/unionfs/commonfops.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/commonfops.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/commonfops.c @@ -86,11 +86,11 @@ retry: atomic_inc(&lower_dentry->d_inode->i_count); unionfs_set_lower_inode_idx(dentry->d_inode, bindex, lower_dentry->d_inode); } lower_dir_dentry = lock_parent(lower_dentry); - err = vfs_unlink(lower_dir_dentry->d_inode, lower_dentry); + err = vfs_unlink(lower_dir_dentry->d_inode, lower_dentry, NULL); unlock_dir(lower_dir_dentry); out: if (!err) unionfs_check_dentry(dentry); Index: linux-2.6.25-rc2-mm1/fs/unionfs/copyup.c =================================================================== --- linux-2.6.25-rc2-mm1.orig/fs/unionfs/copyup.c +++ linux-2.6.25-rc2-mm1/fs/unionfs/copyup.c @@ -484,11 +484,11 @@ out_unlink: /* * copyup failed, because we possibly ran out of space or * quota, or something else happened so let's unlink; we don't * really care about the return value of vfs_unlink */ - vfs_unlink(new_lower_parent_dentry->d_inode, new_lower_dentry); + vfs_unlink(new_lower_parent_dentry->d_inode, new_lower_dentry, NULL); if (copyup_file) { /* need to close the file */ fput(*copyup_file); -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html