switch vfs_path_lookup() to struct path
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 27 Jun 2011 21:00:37 +0000 (17:00 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 20 Jul 2011 05:44:14 +0000 (01:44 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c
fs/nfs/cache_lib.c
fs/nfs/super.c
include/linux/namei.h
net/sunrpc/clnt.c

index b45a039216c7f3bcafccee58858f6dbbe77e8034..7e6ba8c80e77b7a9bfef3e20f79fcea0fc22a1e7 100644 (file)
@@ -1575,16 +1575,22 @@ int kern_path(const char *name, unsigned int flags, struct path *path)
  * @mnt: pointer to vfs mount of the base directory
  * @name: pointer to file name
  * @flags: lookup flags
- * @nd: pointer to nameidata
+ * @path: pointer to struct path to fill
  */
 int vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt,
                    const char *name, unsigned int flags,
-                   struct nameidata *nd)
+                   struct path *path)
 {
-       nd->root.dentry = dentry;
-       nd->root.mnt = mnt;
+       struct nameidata nd;
+       int err;
+       nd.root.dentry = dentry;
+       nd.root.mnt = mnt;
+       BUG_ON(flags & LOOKUP_PARENT);
        /* the first argument of do_path_lookup() is ignored with LOOKUP_ROOT */
-       return do_path_lookup(AT_FDCWD, name, flags | LOOKUP_ROOT, nd);
+       err = do_path_lookup(AT_FDCWD, name, flags | LOOKUP_ROOT, &nd);
+       if (!err)
+               *path = nd.path;
+       return err;
 }
 
 static struct dentry *__lookup_hash(struct qstr *name,
index 84690319e625d5ef35aadeee5d9535291f9ffd5e..c98b439332fcf913bcc4dfb4e34242dfed5c70a0 100644 (file)
@@ -113,19 +113,18 @@ int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq)
 
 int nfs_cache_register(struct cache_detail *cd)
 {
-       struct nameidata nd;
        struct vfsmount *mnt;
+       struct path path;
        int ret;
 
        mnt = rpc_get_mount();
        if (IS_ERR(mnt))
                return PTR_ERR(mnt);
-       ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &nd);
+       ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &path);
        if (ret)
                goto err;
-       ret = sunrpc_cache_register_pipefs(nd.path.dentry,
-                       cd->name, 0600, cd);
-       path_put(&nd.path);
+       ret = sunrpc_cache_register_pipefs(path.dentry, cd->name, 0600, cd);
+       path_put(&path);
        if (!ret)
                return ret;
 err:
index ce40e5c568ba393ec297fbdbc4d288b750491e5a..b961ceac66b43ade04dc3cc960e1e382530f8e66 100644 (file)
@@ -2773,16 +2773,12 @@ static void nfs_referral_loop_unprotect(void)
 static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt,
                const char *export_path)
 {
-       struct nameidata *nd = NULL;
        struct mnt_namespace *ns_private;
        struct super_block *s;
        struct dentry *dentry;
+       struct path path;
        int ret;
 
-       nd = kmalloc(sizeof(*nd), GFP_KERNEL);
-       if (nd == NULL)
-               return ERR_PTR(-ENOMEM);
-
        ns_private = create_mnt_ns(root_mnt);
        ret = PTR_ERR(ns_private);
        if (IS_ERR(ns_private))
@@ -2793,7 +2789,7 @@ static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt,
                goto out_put_mnt_ns;
 
        ret = vfs_path_lookup(root_mnt->mnt_root, root_mnt,
-                       export_path, LOOKUP_FOLLOW, nd);
+                       export_path, LOOKUP_FOLLOW, &path);
 
        nfs_referral_loop_unprotect();
        put_mnt_ns(ns_private);
@@ -2801,12 +2797,11 @@ static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt,
        if (ret != 0)
                goto out_err;
 
-       s = nd->path.mnt->mnt_sb;
+       s = path.mnt->mnt_sb;
        atomic_inc(&s->s_active);
-       dentry = dget(nd->path.dentry);
+       dentry = dget(path.dentry);
 
-       path_put(&nd->path);
-       kfree(nd);
+       path_put(&path);
        down_write(&s->s_umount);
        return dentry;
 out_put_mnt_ns:
@@ -2814,7 +2809,6 @@ out_put_mnt_ns:
 out_mntput:
        mntput(root_mnt);
 out_err:
-       kfree(nd);
        return ERR_PTR(ret);
 }
 
index b8cea804d31ac0479e7d50e467216e3cf2262b50..76fe2c62ae71b9661ea6728934fa6725dcdecd71 100644 (file)
@@ -78,7 +78,7 @@ extern struct dentry *kern_path_create(int, const char *, struct path *, int);
 extern struct dentry *user_path_create(int, const char __user *, struct path *, int);
 extern int kern_path_parent(const char *, struct nameidata *);
 extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
-                          const char *, unsigned int, struct nameidata *);
+                          const char *, unsigned int, struct path *);
 
 extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
                int (*open)(struct inode *, struct file *));
index 8c9141583d6f135714eac27c100e4bc9c3426631..304f403a04111eb3b3da9635bc3c365c5695299b 100644 (file)
@@ -97,8 +97,7 @@ static int
 rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
 {
        static uint32_t clntid;
-       struct nameidata nd;
-       struct path path;
+       struct path path, dir;
        char name[15];
        struct qstr q = {
                .name = name,
@@ -113,7 +112,7 @@ rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
        path.mnt = rpc_get_mount();
        if (IS_ERR(path.mnt))
                return PTR_ERR(path.mnt);
-       error = vfs_path_lookup(path.mnt->mnt_root, path.mnt, dir_name, 0, &nd);
+       error = vfs_path_lookup(path.mnt->mnt_root, path.mnt, dir_name, 0, &dir);
        if (error)
                goto err;
 
@@ -121,7 +120,7 @@ rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
                q.len = snprintf(name, sizeof(name), "clnt%x", (unsigned int)clntid++);
                name[sizeof(name) - 1] = '\0';
                q.hash = full_name_hash(q.name, q.len);
-               path.dentry = rpc_create_client_dir(nd.path.dentry, &q, clnt);
+               path.dentry = rpc_create_client_dir(dir.dentry, &q, clnt);
                if (!IS_ERR(path.dentry))
                        break;
                error = PTR_ERR(path.dentry);
@@ -132,11 +131,11 @@ rpc_setup_pipedir(struct rpc_clnt *clnt, char *dir_name)
                        goto err_path_put;
                }
        }
-       path_put(&nd.path);
+       path_put(&dir);
        clnt->cl_path = path;
        return 0;
 err_path_put:
-       path_put(&nd.path);
+       path_put(&dir);
 err:
        rpc_put_mount();
        return error;