From: Al Viro Date: Tue, 20 Feb 2024 04:24:41 +0000 (-0500) Subject: rpc_unlink(): use simple_recursive_removal() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3829b30e771bbfff62fbe7eff555e7a6e0d4b5cd;p=thirdparty%2Flinux.git 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 Signed-off-by: Al Viro --- diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 9571cbd913052..67621a94f67b2 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);