[PATCH] assorted path_lookup() -> kern_path() conversions
Al Viro [Sat, 2 Aug 2008 05:04:36 +0000 (01:04 -0400)]
more nameidata eviction

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

fs/block_dev.c
fs/configfs/symlink.c
fs/ecryptfs/main.c
net/unix/af_unix.c

index 218408e..d06fe3c 100644 (file)
@@ -1268,33 +1268,33 @@ EXPORT_SYMBOL(ioctl_by_bdev);
  * namespace if possible and return it.  Return ERR_PTR(error)
  * otherwise.
  */
-struct block_device *lookup_bdev(const char *path)
+struct block_device *lookup_bdev(const char *pathname)
 {
        struct block_device *bdev;
        struct inode *inode;
-       struct nameidata nd;
+       struct path path;
        int error;
 
-       if (!path || !*path)
+       if (!pathname || !*pathname)
                return ERR_PTR(-EINVAL);
 
-       error = path_lookup(path, LOOKUP_FOLLOW, &nd);
+       error = kern_path(pathname, LOOKUP_FOLLOW, &path);
        if (error)
                return ERR_PTR(error);
 
-       inode = nd.path.dentry->d_inode;
+       inode = path.dentry->d_inode;
        error = -ENOTBLK;
        if (!S_ISBLK(inode->i_mode))
                goto fail;
        error = -EACCES;
-       if (nd.path.mnt->mnt_flags & MNT_NODEV)
+       if (path.mnt->mnt_flags & MNT_NODEV)
                goto fail;
        error = -ENOMEM;
        bdev = bd_acquire(inode);
        if (!bdev)
                goto fail;
 out:
-       path_put(&nd.path);
+       path_put(&path);
        return bdev;
 fail:
        bdev = ERR_PTR(error);
index bf74973..932a92b 100644 (file)
@@ -108,18 +108,18 @@ out:
 }
 
 
-static int get_target(const char *symname, struct nameidata *nd,
+static int get_target(const char *symname, struct path *path,
                      struct config_item **target)
 {
        int ret;
 
-       ret = path_lookup(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, nd);
+       ret = kern_path(symname, LOOKUP_FOLLOW|LOOKUP_DIRECTORY, path);
        if (!ret) {
-               if (nd->path.dentry->d_sb == configfs_sb) {
-                       *target = configfs_get_config_item(nd->path.dentry);
+               if (path->dentry->d_sb == configfs_sb) {
+                       *target = configfs_get_config_item(path->dentry);
                        if (!*target) {
                                ret = -ENOENT;
-                               path_put(&nd->path);
+                               path_put(path);
                        }
                } else
                        ret = -EPERM;
@@ -132,7 +132,7 @@ static int get_target(const char *symname, struct nameidata *nd,
 int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
 {
        int ret;
-       struct nameidata nd;
+       struct path path;
        struct configfs_dirent *sd;
        struct config_item *parent_item;
        struct config_item *target_item;
@@ -159,7 +159,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna
            !type->ct_item_ops->allow_link)
                goto out_put;
 
-       ret = get_target(symname, &nd, &target_item);
+       ret = get_target(symname, &path, &target_item);
        if (ret)
                goto out_put;
 
@@ -174,7 +174,7 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna
        }
 
        config_item_put(target_item);
-       path_put(&nd.path);
+       path_put(&path);
 
 out_put:
        config_item_put(parent_item);
index 046e027..64d2ba9 100644 (file)
@@ -471,31 +471,26 @@ out:
  */
 static int ecryptfs_read_super(struct super_block *sb, const char *dev_name)
 {
+       struct path path;
        int rc;
-       struct nameidata nd;
-       struct dentry *lower_root;
-       struct vfsmount *lower_mnt;
 
-       memset(&nd, 0, sizeof(struct nameidata));
-       rc = path_lookup(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &nd);
+       rc = kern_path(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path);
        if (rc) {
                ecryptfs_printk(KERN_WARNING, "path_lookup() failed\n");
                goto out;
        }
-       lower_root = nd.path.dentry;
-       lower_mnt = nd.path.mnt;
-       ecryptfs_set_superblock_lower(sb, lower_root->d_sb);
-       sb->s_maxbytes = lower_root->d_sb->s_maxbytes;
-       sb->s_blocksize = lower_root->d_sb->s_blocksize;
-       ecryptfs_set_dentry_lower(sb->s_root, lower_root);
-       ecryptfs_set_dentry_lower_mnt(sb->s_root, lower_mnt);
-       rc = ecryptfs_interpose(lower_root, sb->s_root, sb, 0);
+       ecryptfs_set_superblock_lower(sb, path.dentry->d_sb);
+       sb->s_maxbytes = path.dentry->d_sb->s_maxbytes;
+       sb->s_blocksize = path.dentry->d_sb->s_blocksize;
+       ecryptfs_set_dentry_lower(sb->s_root, path.dentry);
+       ecryptfs_set_dentry_lower_mnt(sb->s_root, path.mnt);
+       rc = ecryptfs_interpose(path.dentry, sb->s_root, sb, 0);
        if (rc)
                goto out_free;
        rc = 0;
        goto out;
 out_free:
-       path_put(&nd.path);
+       path_put(&path);
 out:
        return rc;
 }
index c647aab..dc504d3 100644 (file)
@@ -711,28 +711,30 @@ static struct sock *unix_find_other(struct net *net,
                                    int type, unsigned hash, int *error)
 {
        struct sock *u;
-       struct nameidata nd;
+       struct path path;
        int err = 0;
 
        if (sunname->sun_path[0]) {
-               err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd);
+               struct inode *inode;
+               err = kern_path(sunname->sun_path, LOOKUP_FOLLOW, &path);
                if (err)
                        goto fail;
-               err = vfs_permission(&nd, MAY_WRITE);
+               inode = path.dentry->d_inode;
+               err = inode_permission(inode, MAY_WRITE);
                if (err)
                        goto put_fail;
 
                err = -ECONNREFUSED;
-               if (!S_ISSOCK(nd.path.dentry->d_inode->i_mode))
+               if (!S_ISSOCK(inode->i_mode))
                        goto put_fail;
-               u = unix_find_socket_byinode(net, nd.path.dentry->d_inode);
+               u = unix_find_socket_byinode(net, inode);
                if (!u)
                        goto put_fail;
 
                if (u->sk_type == type)
-                       touch_atime(nd.path.mnt, nd.path.dentry);
+                       touch_atime(path.mnt, path.dentry);
 
-               path_put(&nd.path);
+               path_put(&path);
 
                err=-EPROTOTYPE;
                if (u->sk_type != type) {
@@ -753,7 +755,7 @@ static struct sock *unix_find_other(struct net *net,
        return u;
 
 put_fail:
-       path_put(&nd.path);
+       path_put(&path);
 fail:
        *error=err;
        return NULL;