SUNRPC: Make rpc_mkpipe() take the parent dentry as an argument
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
@@ -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)
|
|||||||
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 *);
|
|||||||
|
|
||||||
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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,7 +638,20 @@ 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);
|
||||||
rpc_release_path(nd);
|
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);
|
||||||
return dentry;
|
return 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)
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user