Commit e0a01249 authored by Al Viro's avatar Al Viro
Browse files

switch vfs_path_lookup() to struct path



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ed75e95d
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -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,
+4 −5
Original line number Diff line number Diff line
@@ -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:
+5 −11
Original line number Diff line number Diff line
@@ -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);
}

+1 −1
Original line number Diff line number Diff line
@@ -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 *));
+5 −6
Original line number Diff line number Diff line
@@ -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;