mirror of https://gitee.com/openkylin/linux.git
SUNRPC: Clean up rpc_unlink()
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
7589806e96
commit
810d90bc2a
|
@ -601,6 +601,29 @@ static int __rpc_mkpipe(struct inode *dir, struct dentry *dentry,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __rpc_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
dget(dentry);
|
||||||
|
ret = simple_unlink(dir, dentry);
|
||||||
|
d_delete(dentry);
|
||||||
|
dput(dentry);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __rpc_rmpipe(struct inode *dir, struct dentry *dentry)
|
||||||
|
{
|
||||||
|
struct inode *inode = dentry->d_inode;
|
||||||
|
struct rpc_inode *rpci = RPC_I(inode);
|
||||||
|
|
||||||
|
rpci->nkern_readwriters--;
|
||||||
|
if (rpci->nkern_readwriters != 0)
|
||||||
|
return 0;
|
||||||
|
rpc_close_pipes(inode);
|
||||||
|
return __rpc_unlink(dir, dentry);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: This probably has races.
|
* FIXME: This probably has races.
|
||||||
*/
|
*/
|
||||||
|
@ -848,14 +871,15 @@ struct dentry *rpc_mkpipe(struct dentry *parent, const char *name,
|
||||||
rpci->ops != ops ||
|
rpci->ops != ops ||
|
||||||
rpci->flags != flags) {
|
rpci->flags != flags) {
|
||||||
dput (dentry);
|
dput (dentry);
|
||||||
dentry = ERR_PTR(-EBUSY);
|
err = -EBUSY;
|
||||||
|
goto out_err;
|
||||||
}
|
}
|
||||||
rpci->nkern_readwriters++;
|
rpci->nkern_readwriters++;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = __rpc_mkpipe(dir, dentry, umode, &rpc_pipe_fops,
|
err = __rpc_mkpipe(dir, dentry, umode, &rpc_pipe_fops,
|
||||||
private, ops, flags);
|
private, ops, flags);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
dget(dentry);
|
dget(dentry);
|
||||||
|
@ -889,12 +913,7 @@ rpc_unlink(struct dentry *dentry)
|
||||||
parent = dget_parent(dentry);
|
parent = dget_parent(dentry);
|
||||||
dir = parent->d_inode;
|
dir = parent->d_inode;
|
||||||
mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
|
mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
|
||||||
if (--RPC_I(dentry->d_inode)->nkern_readwriters == 0) {
|
error = __rpc_rmpipe(dir, dentry);
|
||||||
rpc_close_pipes(dentry->d_inode);
|
|
||||||
error = simple_unlink(dir, dentry);
|
|
||||||
if (!error)
|
|
||||||
d_delete(dentry);
|
|
||||||
}
|
|
||||||
dput(dentry);
|
dput(dentry);
|
||||||
mutex_unlock(&dir->i_mutex);
|
mutex_unlock(&dir->i_mutex);
|
||||||
dput(parent);
|
dput(parent);
|
||||||
|
|
Loading…
Reference in New Issue