Embed a struct path into struct nameidata instead of nd->{dentry,mnt}
This is the central patch of a cleanup series. In most cases there is no good
reason why someone would want to use a dentry for itself. This series reflects
that fact and embeds a struct path into nameidata.
Together with the other patches of this series
- it enforced the correct order of getting/releasing the reference count on
<dentry,vfsmount> pairs
- it prepares the VFS for stacking support since it is essential to have a
struct path in every place where the stack can be traversed
- it reduces the overall code size:
without patch series:
text data bss dec hex filename
5321639 858418 715768 6895825 6938d1 vmlinux
with patch series:
text data bss dec hex filename
5320026 858418 715768 6894212
693284 vmlinux
This patch:
Switch from nd->{dentry,mnt} to nd->path.{dentry,mnt} everywhere.
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: fix cifs]
[akpm@linux-foundation.org: fix smack]
Signed-off-by: Jan Blunck <jblunck@suse.de>
Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
Acked-by: Christoph Hellwig <hch@lst.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Casey Schaufler <casey@schaufler-ca.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
c5e725f33b
commit
4ac9137858
31
fs/open.c
31
fs/open.c
@@ -127,7 +127,7 @@ asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf)
|
||||
error = user_path_walk(path, &nd);
|
||||
if (!error) {
|
||||
struct statfs tmp;
|
||||
error = vfs_statfs_native(nd.dentry, &tmp);
|
||||
error = vfs_statfs_native(nd.path.dentry, &tmp);
|
||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||
error = -EFAULT;
|
||||
path_release(&nd);
|
||||
@@ -146,7 +146,7 @@ asmlinkage long sys_statfs64(const char __user *path, size_t sz, struct statfs64
|
||||
error = user_path_walk(path, &nd);
|
||||
if (!error) {
|
||||
struct statfs64 tmp;
|
||||
error = vfs_statfs64(nd.dentry, &tmp);
|
||||
error = vfs_statfs64(nd.path.dentry, &tmp);
|
||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||
error = -EFAULT;
|
||||
path_release(&nd);
|
||||
@@ -233,7 +233,7 @@ static long do_sys_truncate(const char __user * path, loff_t length)
|
||||
error = user_path_walk(path, &nd);
|
||||
if (error)
|
||||
goto out;
|
||||
inode = nd.dentry->d_inode;
|
||||
inode = nd.path.dentry->d_inode;
|
||||
|
||||
/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
|
||||
error = -EISDIR;
|
||||
@@ -271,7 +271,7 @@ static long do_sys_truncate(const char __user * path, loff_t length)
|
||||
error = locks_verify_truncate(inode, NULL, length);
|
||||
if (!error) {
|
||||
DQUOT_INIT(inode);
|
||||
error = do_truncate(nd.dentry, length, 0, NULL);
|
||||
error = do_truncate(nd.path.dentry, length, 0, NULL);
|
||||
}
|
||||
|
||||
put_write_and_out:
|
||||
@@ -455,10 +455,10 @@ asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode)
|
||||
res = vfs_permission(&nd, mode);
|
||||
/* SuS v2 requires we report a read only fs too */
|
||||
if(res || !(mode & S_IWOTH) ||
|
||||
special_file(nd.dentry->d_inode->i_mode))
|
||||
special_file(nd.path.dentry->d_inode->i_mode))
|
||||
goto out_path_release;
|
||||
|
||||
if(IS_RDONLY(nd.dentry->d_inode))
|
||||
if(IS_RDONLY(nd.path.dentry->d_inode))
|
||||
res = -EROFS;
|
||||
|
||||
out_path_release:
|
||||
@@ -490,7 +490,7 @@ asmlinkage long sys_chdir(const char __user * filename)
|
||||
if (error)
|
||||
goto dput_and_out;
|
||||
|
||||
set_fs_pwd(current->fs, nd.mnt, nd.dentry);
|
||||
set_fs_pwd(current->fs, nd.path.mnt, nd.path.dentry);
|
||||
|
||||
dput_and_out:
|
||||
path_release(&nd);
|
||||
@@ -545,7 +545,7 @@ asmlinkage long sys_chroot(const char __user * filename)
|
||||
if (!capable(CAP_SYS_CHROOT))
|
||||
goto dput_and_out;
|
||||
|
||||
set_fs_root(current->fs, nd.mnt, nd.dentry);
|
||||
set_fs_root(current->fs, nd.path.mnt, nd.path.dentry);
|
||||
set_fs_altroot();
|
||||
error = 0;
|
||||
dput_and_out:
|
||||
@@ -602,7 +602,7 @@ asmlinkage long sys_fchmodat(int dfd, const char __user *filename,
|
||||
error = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW, &nd);
|
||||
if (error)
|
||||
goto out;
|
||||
inode = nd.dentry->d_inode;
|
||||
inode = nd.path.dentry->d_inode;
|
||||
|
||||
error = -EROFS;
|
||||
if (IS_RDONLY(inode))
|
||||
@@ -617,7 +617,7 @@ asmlinkage long sys_fchmodat(int dfd, const char __user *filename,
|
||||
mode = inode->i_mode;
|
||||
newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
|
||||
newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
|
||||
error = notify_change(nd.dentry, &newattrs);
|
||||
error = notify_change(nd.path.dentry, &newattrs);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
||||
dput_and_out:
|
||||
@@ -675,7 +675,7 @@ asmlinkage long sys_chown(const char __user * filename, uid_t user, gid_t group)
|
||||
error = user_path_walk(filename, &nd);
|
||||
if (error)
|
||||
goto out;
|
||||
error = chown_common(nd.dentry, user, group);
|
||||
error = chown_common(nd.path.dentry, user, group);
|
||||
path_release(&nd);
|
||||
out:
|
||||
return error;
|
||||
@@ -695,7 +695,7 @@ asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user,
|
||||
error = __user_walk_fd(dfd, filename, follow, &nd);
|
||||
if (error)
|
||||
goto out;
|
||||
error = chown_common(nd.dentry, user, group);
|
||||
error = chown_common(nd.path.dentry, user, group);
|
||||
path_release(&nd);
|
||||
out:
|
||||
return error;
|
||||
@@ -709,7 +709,7 @@ asmlinkage long sys_lchown(const char __user * filename, uid_t user, gid_t group
|
||||
error = user_path_walk_link(filename, &nd);
|
||||
if (error)
|
||||
goto out;
|
||||
error = chown_common(nd.dentry, user, group);
|
||||
error = chown_common(nd.path.dentry, user, group);
|
||||
path_release(&nd);
|
||||
out:
|
||||
return error;
|
||||
@@ -863,7 +863,7 @@ struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry
|
||||
goto out;
|
||||
if (IS_ERR(dentry))
|
||||
goto out_err;
|
||||
nd->intent.open.file = __dentry_open(dget(dentry), mntget(nd->mnt),
|
||||
nd->intent.open.file = __dentry_open(dget(dentry), mntget(nd->path.mnt),
|
||||
nd->intent.open.flags - 1,
|
||||
nd->intent.open.file,
|
||||
open);
|
||||
@@ -891,7 +891,8 @@ struct file *nameidata_to_filp(struct nameidata *nd, int flags)
|
||||
filp = nd->intent.open.file;
|
||||
/* Has the filesystem initialised the file for us? */
|
||||
if (filp->f_path.dentry == NULL)
|
||||
filp = __dentry_open(nd->dentry, nd->mnt, flags, filp, NULL);
|
||||
filp = __dentry_open(nd->path.dentry, nd->path.mnt, flags, filp,
|
||||
NULL);
|
||||
else
|
||||
path_release(nd);
|
||||
return filp;
|
||||
|
Reference in New Issue
Block a user