Commit 158998b6 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Make rpc_mkpipe() take the parent dentry as an argument

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 5dd3177a
...@@ -84,7 +84,6 @@ struct idmap_hashtable { ...@@ -84,7 +84,6 @@ struct idmap_hashtable {
}; };
struct idmap { struct idmap {
char idmap_path[48];
struct dentry *idmap_dentry; struct dentry *idmap_dentry;
wait_queue_head_t idmap_wq; wait_queue_head_t idmap_wq;
struct idmap_msg idmap_im; struct idmap_msg idmap_im;
...@@ -119,10 +118,7 @@ nfs_idmap_new(struct nfs_client *clp) ...@@ -119,10 +118,7 @@ nfs_idmap_new(struct nfs_client *clp)
if ((idmap = kzalloc(sizeof(*idmap), GFP_KERNEL)) == NULL) if ((idmap = kzalloc(sizeof(*idmap), GFP_KERNEL)) == NULL)
return -ENOMEM; return -ENOMEM;
snprintf(idmap->idmap_path, sizeof(idmap->idmap_path), idmap->idmap_dentry = rpc_mkpipe(clp->cl_rpcclient->cl_dentry, "idmap",
"%s/idmap", clp->cl_rpcclient->cl_pathname);
idmap->idmap_dentry = rpc_mkpipe(idmap->idmap_path,
idmap, &idmap_upcall_ops, 0); idmap, &idmap_upcall_ops, 0);
if (IS_ERR(idmap->idmap_dentry)) { if (IS_ERR(idmap->idmap_dentry)) {
error = PTR_ERR(idmap->idmap_dentry); error = PTR_ERR(idmap->idmap_dentry);
......
...@@ -43,7 +43,7 @@ extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); ...@@ -43,7 +43,7 @@ extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *);
extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *); extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *);
extern int rpc_rmdir(struct dentry *); extern int rpc_rmdir(struct dentry *);
extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); extern struct dentry *rpc_mkpipe(struct dentry *, const char *, void *, struct rpc_pipe_ops *, int flags);
extern int rpc_unlink(struct dentry *); extern int rpc_unlink(struct dentry *);
extern struct vfsmount *rpc_get_mount(void); extern struct vfsmount *rpc_get_mount(void);
extern void rpc_put_mount(void); extern void rpc_put_mount(void);
......
...@@ -88,7 +88,6 @@ struct gss_auth { ...@@ -88,7 +88,6 @@ struct gss_auth {
struct list_head upcalls; struct list_head upcalls;
struct rpc_clnt *client; struct rpc_clnt *client;
struct dentry *dentry; struct dentry *dentry;
char path[48];
spinlock_t lock; spinlock_t lock;
}; };
...@@ -690,10 +689,8 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor) ...@@ -690,10 +689,8 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
if (err) if (err)
goto err_put_mech; goto err_put_mech;
snprintf(gss_auth->path, sizeof(gss_auth->path), "%s/%s", gss_auth->dentry = rpc_mkpipe(clnt->cl_dentry, gss_auth->mech->gm_name,
clnt->cl_pathname, clnt, &gss_upcall_ops, RPC_PIPE_WAIT_FOR_OPEN);
gss_auth->mech->gm_name);
gss_auth->dentry = rpc_mkpipe(gss_auth->path, clnt, &gss_upcall_ops, RPC_PIPE_WAIT_FOR_OPEN);
if (IS_ERR(gss_auth->dentry)) { if (IS_ERR(gss_auth->dentry)) {
err = PTR_ERR(gss_auth->dentry); err = PTR_ERR(gss_auth->dentry);
goto err_put_mech; goto err_put_mech;
......
...@@ -621,17 +621,13 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry) ...@@ -621,17 +621,13 @@ __rpc_rmdir(struct inode *dir, struct dentry *dentry)
} }
static struct dentry * static struct dentry *
rpc_lookup_negative(char *path, struct nameidata *nd) rpc_lookup_create(struct dentry *parent, const char *name, int len)
{ {
struct inode *dir = parent->d_inode;
struct dentry *dentry; struct dentry *dentry;
struct inode *dir;
int error;
if ((error = rpc_lookup_parent(path, nd)) != 0)
return ERR_PTR(error);
dir = nd->dentry->d_inode;
mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT); mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
dentry = lookup_one_len(nd->last.name, nd->dentry, nd->last.len); dentry = lookup_one_len(name, parent, len);
if (IS_ERR(dentry)) if (IS_ERR(dentry))
goto out_err; goto out_err;
if (dentry->d_inode) { if (dentry->d_inode) {
...@@ -642,6 +638,19 @@ rpc_lookup_negative(char *path, struct nameidata *nd) ...@@ -642,6 +638,19 @@ rpc_lookup_negative(char *path, struct nameidata *nd)
return dentry; return dentry;
out_err: out_err:
mutex_unlock(&dir->i_mutex); mutex_unlock(&dir->i_mutex);
return dentry;
}
static struct dentry *
rpc_lookup_negative(char *path, struct nameidata *nd)
{
struct dentry *dentry;
int error;
if ((error = rpc_lookup_parent(path, nd)) != 0)
return ERR_PTR(error);
dentry = rpc_lookup_create(nd->dentry, nd->last.name, nd->last.len);
if (IS_ERR(dentry))
rpc_release_path(nd); rpc_release_path(nd);
return dentry; return dentry;
} }
...@@ -701,17 +710,16 @@ rpc_rmdir(struct dentry *dentry) ...@@ -701,17 +710,16 @@ rpc_rmdir(struct dentry *dentry)
} }
struct dentry * struct dentry *
rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) rpc_mkpipe(struct dentry *parent, const char *name, void *private, struct rpc_pipe_ops *ops, int flags)
{ {
struct nameidata nd;
struct dentry *dentry; struct dentry *dentry;
struct inode *dir, *inode; struct inode *dir, *inode;
struct rpc_inode *rpci; struct rpc_inode *rpci;
dentry = rpc_lookup_negative(path, &nd); dentry = rpc_lookup_create(parent, name, strlen(name));
if (IS_ERR(dentry)) if (IS_ERR(dentry))
return dentry; return dentry;
dir = nd.dentry->d_inode; dir = parent->d_inode;
inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR); inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR);
if (!inode) if (!inode)
goto err_dput; goto err_dput;
...@@ -726,13 +734,13 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags) ...@@ -726,13 +734,13 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags)
dget(dentry); dget(dentry);
out: out:
mutex_unlock(&dir->i_mutex); mutex_unlock(&dir->i_mutex);
rpc_release_path(&nd);
return dentry; return dentry;
err_dput: err_dput:
dput(dentry); dput(dentry);
dentry = ERR_PTR(-ENOMEM); dentry = ERR_PTR(-ENOMEM);
printk(KERN_WARNING "%s: %s() failed to create pipe %s (errno = %d)\n", printk(KERN_WARNING "%s: %s() failed to create pipe %s/%s (errno = %d)\n",
__FILE__, __FUNCTION__, path, -ENOMEM); __FILE__, __FUNCTION__, parent->d_name.name, name,
-ENOMEM);
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment