Received: by 2002:a05:7412:419a:b0:f3:1519:9f41 with SMTP id i26csp842428rdh; Thu, 23 Nov 2023 22:04:57 -0800 (PST) X-Google-Smtp-Source: AGHT+IF06KI/QADaxziK0XG7ZXcOC7oAj9oXpdWCz9IfSbVPuv0vkW2uWUlGAw0UDSzfsiKYY37/ X-Received: by 2002:a9d:7a56:0:b0:6d7:fa6b:e777 with SMTP id z22-20020a9d7a56000000b006d7fa6be777mr2086585otm.2.1700805896972; Thu, 23 Nov 2023 22:04:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700805896; cv=none; d=google.com; s=arc-20160816; b=IYOCvr8awMlMFx8XrfrpXyxum5vjWQqqsaAvcJzbuLTobXXVWPK/Z0bSq37tQ5v9c5 O7Pky8gYGcu0RP+mKz1AepVUFj3YNDqDO+oFoBygEc9Zr+BcFGTSXlpYIILZKOqqAR9l Tdtd/RSPG4YeirJ96bj+QVBBRuLUDScZW2KKkcBirAq25uqfGFG1EZScIQQOh7EhBffw PUelfXKs4E+ftwATNxBqokQg/ykBnxZyQ2fxnpTZR5VVCVG4iuiLfsqY23yZbWN/c4br fODh9fqDA40qoiHL7haHXmkZvx4PYmpKiyLbTVN3vMLRx4tTI61+kUQ4sRy5DDW8sJZn GtPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=QVkAuzyOVfZEPbtFLrMy972YXvNnlxohvZRBOnyl33o=; fh=vDsv/0Rb6aybIi/Xas2DR+uQpFXMLtn4no3J1t38V0s=; b=SazL9oXOI2KmioBNjkKiZfthfDXT1BN8yW6kPjUjEFxd8mmhFZoN/ELv9jfe7ybIaS r0bhSUpS2HZd/+LxHDyIq2MwDWKdwlxlKwHbwwu1asjB9mBJN/+Y1ypcZzb79yGYtRgG nrAqe3QWv5bsY+KJWmX+Fu1E66M6f7MS0gdicVgVcOwNhymINU7mio2U4HnaUyexCnw1 sHTyWSEPDLL6D4GZiC3oKLyIBas0TNozWQmcMCZpVdBJ1m5t8DCvmQ7nFGzqlko5rXoc X7Hqa9REHy+qzjlJFsxhqVVAUMAAbtgJRXs7L0C4HaqemzM2Tp1GKN8jz/FHC6UcIfOu 3FFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.org.uk header.s=zeniv-20220401 header.b=XeXLFlO4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=zeniv.linux.org.uk Return-Path: Received: from pete.vger.email (pete.vger.email. [2620:137:e000::3:6]) by mx.google.com with ESMTPS id 23-20020a630c57000000b005c217868866si2885550pgm.507.2023.11.23.22.04.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Nov 2023 22:04:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) client-ip=2620:137:e000::3:6; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.org.uk header.s=zeniv-20220401 header.b=XeXLFlO4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:6 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=zeniv.linux.org.uk Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id A4A5C805DC7E; Thu, 23 Nov 2023 22:04:41 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231315AbjKXGES (ORCPT + 99 others); Fri, 24 Nov 2023 01:04:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229453AbjKXGER (ORCPT ); Fri, 24 Nov 2023 01:04:17 -0500 Received: from zeniv.linux.org.uk (zeniv.linux.org.uk [IPv6:2a03:a000:7:0:5054:ff:fe1c:15ff]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC539D5C; Thu, 23 Nov 2023 22:04:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=linux.org.uk; s=zeniv-20220401; h=Sender:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description; bh=QVkAuzyOVfZEPbtFLrMy972YXvNnlxohvZRBOnyl33o=; b=XeXLFlO4ueo6GsI8wTl/Y9OgMq 3oCXaGBKljqckVIDfLDyZRM3YjKDP6R5ao4CCf2JvibohIcGERPM+QFnPwYLczpQlSlT5laXtz8/2 IvZ440Q20n30HbwSgaQXYqkTuQcEoBPphy36wvNI37Hmd5x8Nl3vba0DKDkaaDwrR6/PGgoDEfHVP CvOwIhKpi3E7xSVBnHnKF2DW5XeTP+QDmlkSmw2Nwio9H7/2SYlbGyQepfj/X91MduDO0VTMvIkEK d7pVbzTRAWRXK4ZT/98qagc9MfpFAnC8zAer7cfpxiMOJqLQVEr1xhiT5mwRxcTsFHofVQ0kF2gHx /d2HklDg==; Received: from viro by zeniv.linux.org.uk with local (Exim 4.96 #2 (Red Hat Linux)) id 1r6PIc-002Ptd-1Q; Fri, 24 Nov 2023 06:04:22 +0000 From: Al Viro To: linux-fsdevel@vger.kernel.org Cc: Linus Torvalds , Christian Brauner , linux-kernel@vger.kernel.org Subject: [PATCH v3 01/21] switch nfsd_client_rmdir() to use of simple_recursive_removal() Date: Fri, 24 Nov 2023 06:04:02 +0000 Message-Id: <20231124060422.576198-1-viro@zeniv.linux.org.uk> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231124060200.GR38156@ZenIV> References: <20231124060200.GR38156@ZenIV> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: Al Viro X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Thu, 23 Nov 2023 22:04:42 -0800 (PST) nfsd_client_rmdir() open-codes a subset of simple_recursive_removal(). Conversion to calling simple_recursive_removal() allows to clean things up quite a bit. While we are at it, nfsdfs_create_files() doesn't need to mess with "pick the reference to struct nfsdfs_client from the already created parent" - the caller already knows it (that's where the parent got it from, after all), so we might as well just pass it as an explicit argument. So __get_nfsdfs_client() is only needed in get_nfsdfs_client() and can be folded in there. Incidentally, the locking in get_nfsdfs_client() is too heavy - we don't need ->i_rwsem for that, ->i_lock serves just fine. Reviewed-by: Jeff Layton Tested-by: Jeff Layton Acked-by: Chuck Lever Acked-by: Christian Brauner Signed-off-by: Al Viro --- fs/nfsd/nfsctl.c | 70 ++++++++++-------------------------------------- 1 file changed, 14 insertions(+), 56 deletions(-) diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 3e15b72f421d..50df5e9d0069 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -1236,63 +1236,34 @@ static inline void _nfsd_symlink(struct dentry *parent, const char *name, #endif -static void clear_ncl(struct inode *inode) +static void clear_ncl(struct dentry *dentry) { + struct inode *inode = d_inode(dentry); struct nfsdfs_client *ncl = inode->i_private; + spin_lock(&inode->i_lock); inode->i_private = NULL; + spin_unlock(&inode->i_lock); kref_put(&ncl->cl_ref, ncl->cl_release); } -static struct nfsdfs_client *__get_nfsdfs_client(struct inode *inode) -{ - struct nfsdfs_client *nc = inode->i_private; - - if (nc) - kref_get(&nc->cl_ref); - return nc; -} - struct nfsdfs_client *get_nfsdfs_client(struct inode *inode) { struct nfsdfs_client *nc; - inode_lock_shared(inode); - nc = __get_nfsdfs_client(inode); - inode_unlock_shared(inode); + spin_lock(&inode->i_lock); + nc = inode->i_private; + if (nc) + kref_get(&nc->cl_ref); + spin_unlock(&inode->i_lock); return nc; } -/* from __rpc_unlink */ -static void nfsdfs_remove_file(struct inode *dir, struct dentry *dentry) -{ - int ret; - - clear_ncl(d_inode(dentry)); - dget(dentry); - ret = simple_unlink(dir, dentry); - d_drop(dentry); - fsnotify_unlink(dir, dentry); - dput(dentry); - WARN_ON_ONCE(ret); -} - -static void nfsdfs_remove_files(struct dentry *root) -{ - struct dentry *dentry, *tmp; - - list_for_each_entry_safe(dentry, tmp, &root->d_subdirs, d_child) { - if (!simple_positive(dentry)) { - WARN_ON_ONCE(1); /* I think this can't happen? */ - continue; - } - nfsdfs_remove_file(d_inode(root), dentry); - } -} /* XXX: cut'n'paste from simple_fill_super; figure out if we could share * code instead. */ static int nfsdfs_create_files(struct dentry *root, const struct tree_descr *files, + struct nfsdfs_client *ncl, struct dentry **fdentries) { struct inode *dir = d_inode(root); @@ -1311,8 +1282,9 @@ static int nfsdfs_create_files(struct dentry *root, dput(dentry); goto out; } + kref_get(&ncl->cl_ref); inode->i_fop = files->ops; - inode->i_private = __get_nfsdfs_client(dir); + inode->i_private = ncl; d_add(dentry, inode); fsnotify_create(dir, dentry); if (fdentries) @@ -1321,7 +1293,6 @@ static int nfsdfs_create_files(struct dentry *root, inode_unlock(dir); return 0; out: - nfsdfs_remove_files(root); inode_unlock(dir); return -ENOMEM; } @@ -1341,7 +1312,7 @@ struct dentry *nfsd_client_mkdir(struct nfsd_net *nn, dentry = nfsd_mkdir(nn->nfsd_client_dir, ncl, name); if (IS_ERR(dentry)) /* XXX: tossing errors? */ return NULL; - ret = nfsdfs_create_files(dentry, files, fdentries); + ret = nfsdfs_create_files(dentry, files, ncl, fdentries); if (ret) { nfsd_client_rmdir(dentry); return NULL; @@ -1352,20 +1323,7 @@ struct dentry *nfsd_client_mkdir(struct nfsd_net *nn, /* Taken from __rpc_rmdir: */ void nfsd_client_rmdir(struct dentry *dentry) { - struct inode *dir = d_inode(dentry->d_parent); - struct inode *inode = d_inode(dentry); - int ret; - - inode_lock(dir); - nfsdfs_remove_files(dentry); - clear_ncl(inode); - dget(dentry); - ret = simple_rmdir(dir, dentry); - WARN_ON_ONCE(ret); - d_drop(dentry); - fsnotify_rmdir(dir, dentry); - dput(dentry); - inode_unlock(dir); + simple_recursive_removal(dentry, clear_ncl); } static int nfsd_fill_super(struct super_block *sb, struct fs_context *fc) -- 2.39.2