diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2024-02-19 23:24:41 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2025-07-02 22:44:55 -0400 |
commit | 3829b30e771bbfff62fbe7eff555e7a6e0d4b5cd (patch) | |
tree | f53ac9041e5e5ab8cd1fbdfa877e7dbb87a86d6b | |
parent | 8e7490c40eff4fa36eac40f015c407caf5a1cc77 (diff) |
rpc_unlink(): use simple_recursive_removal()
note that the callback of simple_recursive_removal() is called with
the parent locked; the victim isn't locked by the caller.
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 24 |
1 files changed, 4 insertions, 20 deletions
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 9571cbd91305..67621a94f67b 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c @@ -168,8 +168,9 @@ rpc_inode_setowner(struct inode *inode, void *private) } static void -rpc_close_pipes(struct inode *inode) +rpc_close_pipes(struct dentry *dentry) { + struct inode *inode = dentry->d_inode; struct rpc_pipe *pipe = RPC_I(inode)->pipe; int need_release; LIST_HEAD(free_list); @@ -619,14 +620,6 @@ static int __rpc_unlink(struct inode *dir, struct dentry *dentry) return ret; } -static int __rpc_rmpipe(struct inode *dir, struct dentry *dentry) -{ - struct inode *inode = d_inode(dentry); - - rpc_close_pipes(inode); - return __rpc_unlink(dir, dentry); -} - static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent, const char *name) { @@ -814,17 +807,8 @@ EXPORT_SYMBOL_GPL(rpc_mkpipe_dentry); int rpc_unlink(struct dentry *dentry) { - struct dentry *parent; - struct inode *dir; - int error = 0; - - parent = dget_parent(dentry); - dir = d_inode(parent); - inode_lock_nested(dir, I_MUTEX_PARENT); - error = __rpc_rmpipe(dir, dentry); - inode_unlock(dir); - dput(parent); - return error; + simple_recursive_removal(dentry, rpc_close_pipes); + return 0; } EXPORT_SYMBOL_GPL(rpc_unlink); |