From nobody Sun Feb 8 05:22:51 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9CA3C221566; Wed, 21 May 2025 01:53:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792426; cv=none; b=pbitmzYHBw/hPHE8LAwlxoI7kTkqnzJcdmt30LE8aeWdrvxzu27+cRdV7k7pfxYRS/dGQmoT0vieTtFujzP61Egp5PzFGfSqWfspT8lgFadvshR8X6G8pEdWdrHgMNxHXL+uFSlpaQsyheLBCiozqxk42lG3h7IW+wYN7/nP35c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792426; c=relaxed/simple; bh=sHb/J9Bj3RuS0R9Ns3i1O97fDwtUFjQVqaYU568TKLw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QAO8EaGOdFKi7nZ4JTvlM34EJzxgcxNARsHz4KcKcjl85KmVilv3sUPDrPWSQ3DOrlSxwoM+eh8XYuSPhwMesnsXdi8BRcU8cAHA0YbsAQB7xxD/AYxIyU4NtBgOspLrLcfQPSLzuJ0qd19eepsws702ZqDKx16Uyu99bXDbF6s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HV4qy/rv; arc=none smtp.client-ip=209.85.215.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HV4qy/rv" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-b26f5cd984cso4627284a12.3; Tue, 20 May 2025 18:53:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747792424; x=1748397224; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Korba43DFjEJPqDuJnEN7vEVXDmofbc7scbiwYjjmFI=; b=HV4qy/rvzQbgfFv36hasXCKyznv3tR69WsVVNaBvQ75RJZNeT5KkZceNCAZl3a8naM MGPoAG+Jt4IEGPbEbrytHOmcra81I9ErB/r2f2SgTfhzhSN+hH0bQwMJfDo+o8azN6v6 PYcD+EZqTKSbHVP+z8JTBXP4uzV10bZnunl+/OexOa8mnUdjuZRb4iqE2oiI8QbbtpHd bTTyfHiVY+eDx1LnLYQJ2WYeWdVz4/uMmx3CHh3HuyKCtOTwv6DUiK+cDpe35cySDuvw 3YqLeGPMM4JA5Su10fL0OSut8LEe6ZA6bCyBkSytacrGnkq51fZ6K79dIyC2hjzHhOei EvCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747792424; x=1748397224; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Korba43DFjEJPqDuJnEN7vEVXDmofbc7scbiwYjjmFI=; b=vQ2O488mhmfSIkcQOMTzzDi6DTZEW3QVCJYFzKm/7Ojo7+AL7W1cUTj0tmBV1QRoPc XXBOH71gjWX4u9k5hcnB0PKfVOgHB54qDJYeJuaABf/9A/yxv3TrNEIQ+aTp4LiQMxXY u4Oovg7B/1LrbqHBuqpb9QuzkAzaJTVJMuEkPLaxLTsmQveACYST9i3SwgyaeDtckXgG iG3cX3CfTNjK8vuWmAFGOK78ub83EP22Jwejy4PoM8+rQZh0ObFZClAwB5aZK1cru/o4 bMRV4noUJj3dahaU1doAeWp6nfa0nFBFT6Irc1sGUIK7DW+z/mBEAZ9v/rEeUT3o8nWJ 5gmg== X-Forwarded-Encrypted: i=1; AJvYcCWUC2yeCaTkjfjdftZh/F898ft2cBb2icXtelG1nu5xKGmQeSFncsULT3DZrn5YW3hfTLqjaQdmUz7zPYQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwN0TsrBZOUextr1dPERkjnnVE/hHNuWoh59bhE3ETpVOY6Dsl0 ZdyaylcN7Vosn70/y+KFKgI6T9euca3iJyk/qfmtZzu+AMfPCnGmKRHKE5ZSLxD3lVQ= X-Gm-Gg: ASbGnctJ1Sh0Ohyk1Y1QL1FEQO+6OFGjFAerjnH7AZNCgfA4K7HxGgBWu4FeI6J+8Nc G5+9Fq//Cbzd4TR6xGXrMU7P1fAI+f77C4HR7GHRiyAXeoUl+t1XmEtzH/6OiROAeInvAvqgt4y XPliprkQQrNMbXVYmfJYwkbXBhPa/hFzB16RUCD+d6ca21fsWW+gn0klVN2IS7SXHSU/0WlUirR 1ZG9Poz4ytXLN8d2+pAFMX4DKuEUgiw7M8mEdXRbLHBk0kKiVolFM/sbBh78dkMKVZxE6i4L80o zUMAcWQ0UqODWnk1w3VtHYPxE76nzSKhAMYIEMUzBgad X-Google-Smtp-Source: AGHT+IH0rXmolDEHltNkvlPgF/VomByzNWmKraPYTA/oCfbi2ipk4LtHCQKDIwoi9vpzvLT4wVI2eg== X-Received: by 2002:a17:903:17cb:b0:229:1cef:4c83 with SMTP id d9443c01a7336-231d438b415mr276087975ad.4.1747792423616; Tue, 20 May 2025 18:53:43 -0700 (PDT) Received: from gmail.com ([116.237.135.88]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4eedb59sm82796665ad.257.2025.05.20.18.53.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 May 2025 18:53:43 -0700 (PDT) From: Qingfang Deng To: stable@vger.kernel.org, Greg Kroah-Hartman , Tejun Heo , linux-kernel@vger.kernel.org Cc: Ian Kent , Miklos Szeredi Subject: [PATCH 5.10 1/5] kernfs: add a revision to identify directory node changes Date: Wed, 21 May 2025 09:53:31 +0800 Message-ID: <20250521015336.3450911-2-dqfext@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250521015336.3450911-1-dqfext@gmail.com> References: <20250521015336.3450911-1-dqfext@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Kent Commit 895adbec302e92086359e6fd92611ac3be6d92c3 upstream. Add a revision counter to kernfs directory nodes so it can be used to detect if a directory node has changed during negative dentry revalidation. There's an assumption that sizeof(unsigned long) <=3D sizeof(pointer) on all architectures and as far as I know that assumption holds. So adding a revision counter to the struct kernfs_elem_dir variant of the kernfs_node type union won't increase the size of the kernfs_node struct. This is because struct kernfs_elem_dir is at least sizeof(pointer) smaller than the largest union variant. It's tempting to make the revision counter a u64 but that would increase the size of kernfs_node on archs where sizeof(pointer) is smaller than the revision counter. Reviewed-by: Miklos Szeredi Signed-off-by: Ian Kent Link: https://lore.kernel.org/r/162642769895.63632.8356662784964509867.stgi= t@web.messagingengine.com Signed-off-by: Greg Kroah-Hartman --- fs/kernfs/dir.c | 2 ++ fs/kernfs/kernfs-internal.h | 19 +++++++++++++++++++ include/linux/kernfs.h | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 0ba056e06e48..9bc73c8b6e3f 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -380,6 +380,7 @@ static int kernfs_link_sibling(struct kernfs_node *kn) /* successfully added, account subdir number */ if (kernfs_type(kn) =3D=3D KERNFS_DIR) kn->parent->dir.subdirs++; + kernfs_inc_rev(kn->parent); =20 return 0; } @@ -402,6 +403,7 @@ static bool kernfs_unlink_sibling(struct kernfs_node *k= n) =20 if (kernfs_type(kn) =3D=3D KERNFS_DIR) kn->parent->dir.subdirs--; + kernfs_inc_rev(kn->parent); =20 rb_erase(&kn->rb, &kn->parent->dir.children); RB_CLEAR_NODE(&kn->rb); diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h index 7ee97ef59184..6a8d0ca26d03 100644 --- a/fs/kernfs/kernfs-internal.h +++ b/fs/kernfs/kernfs-internal.h @@ -81,6 +81,25 @@ static inline struct kernfs_node *kernfs_dentry_node(str= uct dentry *dentry) return d_inode(dentry)->i_private; } =20 +static inline void kernfs_set_rev(struct kernfs_node *parent, + struct dentry *dentry) +{ + dentry->d_time =3D parent->dir.rev; +} + +static inline void kernfs_inc_rev(struct kernfs_node *parent) +{ + parent->dir.rev++; +} + +static inline bool kernfs_dir_changed(struct kernfs_node *parent, + struct dentry *dentry) +{ + if (parent->dir.rev !=3D dentry->d_time) + return true; + return false; +} + extern const struct super_operations kernfs_sops; extern struct kmem_cache *kernfs_node_cache, *kernfs_iattrs_cache; =20 diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 89f6a4214a70..195afa63ab1c 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -98,6 +98,11 @@ struct kernfs_elem_dir { * better directly in kernfs_node but is here to save space. */ struct kernfs_root *root; + /* + * Monotonic revision counter, used to identify if a directory + * node has changed during negative dentry revalidation. + */ + unsigned long rev; }; =20 struct kernfs_elem_symlink { --=20 2.43.0 From nobody Sun Feb 8 05:22:51 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2CD8221717; Wed, 21 May 2025 01:53:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792428; cv=none; b=AhTQjTvSX9aIr+V9qfLrgX6ob0AFmyljDhFfrmakJ36Jphh/N9kfVGev7Y22akoJ+zX9vQVeNs5dA4JM/4Lg1kT7Ok3p7lhN9O1fd+OUaog+NomtQkXrLDkufQrVWIOgVLaphOacLrZhRt1gp/Gc3g4H7dfLVfY4L+8k+VrLFPc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792428; c=relaxed/simple; bh=C+afvCMn4IIFunrreI/koJIOT0K0utwIdt4vaVSFAZY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PpfFzlOrMwVgrOoenkgFmwDU8oBkT1cdVKR4uBW4SbK2Vp907XyK7uX+VX7jjT/oPvFT2mKofwGcF2LO/048Nf3nrEZZ72k5dlcGeZHkgHacmXJVxjeD3ECYWDFHV9kftImlOT/rb69Z32HmviMWo+CPldlMaaJxKJQ86GMcFqc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=J6VXUa/e; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="J6VXUa/e" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-231e8553248so40197245ad.1; Tue, 20 May 2025 18:53:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747792426; x=1748397226; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mmazB8SGFETg58gqzeNKFWu1xciTSNCHPNcLrwlPpjc=; b=J6VXUa/e+Cnma+/wdULh8f4VqO7bzk0QPyh9cfkKavOhui7FDE5X04whc4FcHa22sH socehdXU6idvs4iG40xZKhwKt34//azPrfJxwoOiHGAov/+aurePFYs89Ok+i3zcDY9N p8P44Vn3f0mKBfO7RoY+CbohB0rTXCw7I2IuYFU4O0qUfX+x5aGqxX6+sxJGJeRq2Q5H GnAQYRTwtsWQbY2ncLV4gIXC6AECqhOjEjTijtIRRvvDwvdJ6PlIGGLZTBY8L24hTDot z147Q+feMywS+1G1KJsnTSYp/dC4+ECwFvv4EWxM9mhuV7D3MqLntaWUlw9zpF5cPGmO qH7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747792426; x=1748397226; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mmazB8SGFETg58gqzeNKFWu1xciTSNCHPNcLrwlPpjc=; b=XAQTJUAvx42b77HxJ4TTQWwA0/nDNVeBUHsH0UaNBqYulbgtIJ17XKaRxbdCoNe+SL 6XT/zQGVax6D/KLaaUNU57mInXdNVdNy1TNo0q0ES1nlhU+RN62GzblEnVeOSC01UGUI wE3VVLtbSKCFufJfNf2tuibYTFPT9F/XmX7QOzOqfHww41IPR9UB0uWOnYO+cVuJ3hTU vt5O6q5oOg3XbKWVhQQ95A/8VPM65udXWV3kDwTDP6Tu7LOslnjXN7wUTLQQb+kQpwXC Bjy9NTi8vpaSGB6ngGSNMtjI8DyNtzIB5we3E+I1CeXDa/tdGeQJn8dTWv1C9K0vrFyr jF6w== X-Forwarded-Encrypted: i=1; AJvYcCXJdCT5rk3n5rzkJGJUiQVM4NaSmM/wp6LnfNUzi7A9Z6rTrAdeUVzcGkFbWnuLkIhWqsbMMl8RzDbbpco=@vger.kernel.org X-Gm-Message-State: AOJu0YyTzQ4jOXlsVJvIfbTmbRsHp//xuICQmpzI1q0IA08U2jvAwSw2 8TYl2m9QmL5OyRtQ8p2kaAFvti132ZCW74NP95/WRiruzDW+uxGove805m72VlwsO9o= X-Gm-Gg: ASbGncuJy1RIrXW9tR/2MlqQ9fCx7//jEvhsqOc80YKtbozx7U342V+t7cdOUT0eaWf 8gu9xHWHAoU7HWWR06/mSFohC3RTHqzWK7gBgVLR0bC+9W2E960KLbIN+6otcx4CpDyk4SzyEEU 148smJFxx0s3WGZG4CjnuCDiCjR8TxDlYshaym9yRTdrx0fSc3B2XkFHpwVdM7ggRbl+bA+VXNx Rn3r9YTiThs3k1fNBk8ZbksPHYy/InT2Rz7dMPEpiYQLXY+ipTp0wTaCv6AqXdluq1Q1oYtYgAJ iMXBcz1aOtrR2dU8IOJ9gGkbl00dAbqEPhj4Dv2PnA09 X-Google-Smtp-Source: AGHT+IG0Zo1HpterVv9+DVON0WlhnzTyegJfE0fnvclWPcmXuPaTn+KyY8eAJ1oi4H7dWAGvVrW8/Q== X-Received: by 2002:a17:902:f610:b0:215:9bc2:42ec with SMTP id d9443c01a7336-231de37f1e3mr222057535ad.47.1747792425935; Tue, 20 May 2025 18:53:45 -0700 (PDT) Received: from gmail.com ([116.237.135.88]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4eedb59sm82796665ad.257.2025.05.20.18.53.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 May 2025 18:53:45 -0700 (PDT) From: Qingfang Deng To: stable@vger.kernel.org, Greg Kroah-Hartman , Tejun Heo , linux-kernel@vger.kernel.org Cc: Ian Kent , Miklos Szeredi Subject: [PATCH 5.10 2/5] kernfs: use VFS negative dentry caching Date: Wed, 21 May 2025 09:53:32 +0800 Message-ID: <20250521015336.3450911-3-dqfext@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250521015336.3450911-1-dqfext@gmail.com> References: <20250521015336.3450911-1-dqfext@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Kent Commit c7e7c04274b13f98f758fb69b03f2ab61976ea80 upstream. If there are many lookups for non-existent paths these negative lookups can lead to a lot of overhead during path walks. The VFS allows dentries to be created as negative and hashed, and caches them so they can be used to reduce the fairly high overhead alloc/free cycle that occurs during these lookups. Use the kernfs node parent revision to identify if a change has been made to the containing directory so that the negative dentry can be discarded and the lookup redone. Reviewed-by: Miklos Szeredi Signed-off-by: Ian Kent Link: https://lore.kernel.org/r/162642770420.63632.15791924970508867106.stg= it@web.messagingengine.com Signed-off-by: Greg Kroah-Hartman --- fs/kernfs/dir.c | 55 +++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 9bc73c8b6e3f..1756f7e43aac 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -565,9 +565,31 @@ static int kernfs_dop_revalidate(struct dentry *dentry= , unsigned int flags) if (flags & LOOKUP_RCU) return -ECHILD; =20 - /* Always perform fresh lookup for negatives */ - if (d_really_is_negative(dentry)) - goto out_bad_unlocked; + /* Negative hashed dentry? */ + if (d_really_is_negative(dentry)) { + struct kernfs_node *parent; + + /* If the kernfs parent node has changed discard and + * proceed to ->lookup. + */ + mutex_lock(&kernfs_mutex); + spin_lock(&dentry->d_lock); + parent =3D kernfs_dentry_node(dentry->d_parent); + if (parent) { + if (kernfs_dir_changed(parent, dentry)) { + spin_unlock(&dentry->d_lock); + mutex_unlock(&kernfs_mutex); + return 0; + } + } + spin_unlock(&dentry->d_lock); + mutex_unlock(&kernfs_mutex); + + /* The kernfs parent node hasn't changed, leave the + * dentry negative and return success. + */ + return 1; + } =20 kn =3D kernfs_dentry_node(dentry); mutex_lock(&kernfs_mutex); @@ -593,7 +615,6 @@ static int kernfs_dop_revalidate(struct dentry *dentry,= unsigned int flags) return 1; out_bad: mutex_unlock(&kernfs_mutex); -out_bad_unlocked: return 0; } =20 @@ -1104,33 +1125,27 @@ static struct dentry *kernfs_iop_lookup(struct inod= e *dir, struct dentry *ret; struct kernfs_node *parent =3D dir->i_private; struct kernfs_node *kn; - struct inode *inode; + struct inode *inode =3D NULL; const void *ns =3D NULL; =20 mutex_lock(&kernfs_mutex); - if (kernfs_ns_enabled(parent)) ns =3D kernfs_info(dir->i_sb)->ns; =20 kn =3D kernfs_find_ns(parent, dentry->d_name.name, ns); - - /* no such entry */ - if (!kn || !kernfs_active(kn)) { - ret =3D NULL; - goto out_unlock; - } - /* attach dentry and inode */ - inode =3D kernfs_get_inode(dir->i_sb, kn); - if (!inode) { - ret =3D ERR_PTR(-ENOMEM); - goto out_unlock; + if (kn && kernfs_active(kn)) { + inode =3D kernfs_get_inode(dir->i_sb, kn); + if (!inode) + inode =3D ERR_PTR(-ENOMEM); } - - /* instantiate and hash dentry */ + /* Needed only for negative dentry validation */ + if (!inode) + kernfs_set_rev(parent, dentry); + /* instantiate and hash (possibly negative) dentry */ ret =3D d_splice_alias(inode, dentry); - out_unlock: mutex_unlock(&kernfs_mutex); + return ret; } =20 --=20 2.43.0 From nobody Sun Feb 8 05:22:51 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B26B6221D8F; Wed, 21 May 2025 01:53:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792431; cv=none; b=TjMK6iSCdM/pA6ckzTWEZ3tUm8hb+sZTx0cBLiUIpKreCOwcJUq6z6AdqTqVSZy3hgnBtpaOqHtgjngQRb3aL8Y8iKL8n/3Da/PsWgP32uQm58xYOBGOT3cykLTOH+DFDcv3J8FGNTb2ce7E2hdSVKyuHs4F+aQT3r5N5SDUUTw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792431; c=relaxed/simple; bh=KHZo+nKyA1DftStJ0w50kOGGKXrjuV/CpUMxUHVEBbU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eep9VMz0MhJL4CsefLdAkYCv8lXk2q4DiRTCZ30QAVQWPhHKsnTE5tnYunQaABk73S41dKUhM/QgEa8WeUnVzOHUUdKbstN1CyOBOsvebQmSmYVKYiPpT62D2GRUFPdDPO8vSdNz1vFd5IyoVfleb6epYa4c1Y0iIAnYIoycO/I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=P9l6M3Ao; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="P9l6M3Ao" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-232059c0b50so34099145ad.2; Tue, 20 May 2025 18:53:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747792429; x=1748397229; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=6O56L2h87cUpxUqzozyRkGCbMF8U2ItQajiiuHkXOQ8=; b=P9l6M3Ao8iSjqNAKOO2sxENEw+sGEFDv1B/8wEg0GWasA4KXSeVFz4L1zhg/2M5dhp V25tB7pePblAdul2g37sy+70j9WifCXikdQaaCbKcj7pK5Z9b7uB0dvGm5syXkWxvTwt cWkgk4UhIcjj9rgGURwh+U5wBX5ST5W+xdDW2+s5cVI7o0824b6LgwKdl2Xxb3BPmGFA W6cXV5ygvOlqfkScl5w48arbLcF2JurQx1lSUWWiTlsbOHf0H/WEEX/8S7Evfb3X4Heg lYRL23DmjJmknHnYNuEQnpgMXeYkUzk/0zIxOiKEtshWg2FcF7OvqvGoRfOte2KvfqxZ f8Nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747792429; x=1748397229; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6O56L2h87cUpxUqzozyRkGCbMF8U2ItQajiiuHkXOQ8=; b=M4dnNjchseC2ff/GQnWPv+5MwV4pt6DHuorGD386Ydd7iozsrhGteKInc/IrcgXEHv acJfZLlTRn36ln3zLaQpsKDMAjuAiwA0L8ApwVDTmURVXjWADXh70Lt+nYEphLBQUWiI 9vnI0vJQJfc4UeuF4zkOsVw+fmoMaPOXpfebcSjxFA+nSV/1koMSeHX/RmPP6sA44wD9 bPEafjfGgMGjb+vg6UX6+skVqfktVO8K0BW9M+4bOfUS7iAPBkIJLefmzzFKn8D3+kI8 n6gsygxrpHl1MPXUGhk4zsuriip9iOo/WjBeY33TJcMge3gOI+yU2U6kdYdweH/rXesQ qShw== X-Forwarded-Encrypted: i=1; AJvYcCUnn6xp1Tio0o/7v7lZ1GybM8CGimNN/9WHie3hB2w+ZFqd/+ve3Dei35jny+0vx5RdGcDmFFIz6scWF8I=@vger.kernel.org X-Gm-Message-State: AOJu0YzIjZW69305qShnoGGmLblwmDjJjTAreQxsHCGU0GAFHrDerlzT gMKNSR0jcXJ7ukdfapzLK3yTYJet7+eHhm+ddOcZuGrz9xDA74GLgki2p2YXetkUjXQ= X-Gm-Gg: ASbGncvOszWvXT6y/lSpI/GI61tyAk3wB/7qza7kx5QjI0DE5zBVyYDFwjQG4gifHZj kNf28W8DFK6LR784rdLv839fKsezophreMTc06PtR9vobVV4VnAh/z7hFMwcIgv9V2D5I/yjcXA F/Z02gBSMXvkDyiU6dmlzbqg1lrFpzrq7io7d1c+3TDbADt55fT0ZN4pNhfOc09qXq4MjacuHFV TD46y6mgnfPuxLGJr566XU+dtya2wzCT2thefXP0Hh5qEDYb6TanTSa9YjWB1mqQHQAF91Q2q1z ll5gvTC5CYYqW+QpnWzX3M6WNcOXJR6coupHu12QwgHcIw6nGijkVMk= X-Google-Smtp-Source: AGHT+IEgfz7eKcp8qtyxk9ON+9kLhUBrzGZDseBty88lNVsoYpHYxcZYuwqP0BlNrrpl64ULD5MmZQ== X-Received: by 2002:a17:903:2391:b0:22f:a932:5374 with SMTP id d9443c01a7336-231de37ec19mr246366725ad.48.1747792428580; Tue, 20 May 2025 18:53:48 -0700 (PDT) Received: from gmail.com ([116.237.135.88]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4eedb59sm82796665ad.257.2025.05.20.18.53.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 May 2025 18:53:48 -0700 (PDT) From: Qingfang Deng To: stable@vger.kernel.org, Greg Kroah-Hartman , Tejun Heo , linux-kernel@vger.kernel.org Cc: Ian Kent , Miklos Szeredi Subject: [PATCH 5.10 3/5] kernfs: switch kernfs to use an rwsem Date: Wed, 21 May 2025 09:53:33 +0800 Message-ID: <20250521015336.3450911-4-dqfext@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250521015336.3450911-1-dqfext@gmail.com> References: <20250521015336.3450911-1-dqfext@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Kent Commit 7ba0273b2f34a55efe967d3c7381fb1da2ca195f upstream. The kernfs global lock restricts the ability to perform kernfs node lookup operations in parallel during path walks. Change the kernfs mutex to an rwsem so that, when opportunity arises, node searches can be done in parallel with path walk lookups. Reviewed-by: Miklos Szeredi Signed-off-by: Ian Kent Link: https://lore.kernel.org/r/162642770946.63632.2218304587223241374.stgi= t@web.messagingengine.com Signed-off-by: Greg Kroah-Hartman --- fs/kernfs/dir.c | 100 ++++++++++++++++++------------------ fs/kernfs/file.c | 4 +- fs/kernfs/inode.c | 16 +++--- fs/kernfs/kernfs-internal.h | 5 +- fs/kernfs/mount.c | 12 ++--- fs/kernfs/symlink.c | 4 +- include/linux/kernfs.h | 2 +- 7 files changed, 72 insertions(+), 71 deletions(-) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 1756f7e43aac..0443a9cd72a3 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -17,7 +17,7 @@ =20 #include "kernfs-internal.h" =20 -DEFINE_MUTEX(kernfs_mutex); +DECLARE_RWSEM(kernfs_rwsem); static DEFINE_SPINLOCK(kernfs_rename_lock); /* kn->parent and ->name */ /* * Don't use rename_lock to piggy back on pr_cont_buf. We don't want to @@ -34,7 +34,7 @@ static DEFINE_SPINLOCK(kernfs_idr_lock); /* root->ino_idr= */ =20 static bool kernfs_active(struct kernfs_node *kn) { - lockdep_assert_held(&kernfs_mutex); + lockdep_assert_held(&kernfs_rwsem); return atomic_read(&kn->active) >=3D 0; } =20 @@ -348,7 +348,7 @@ static int kernfs_sd_compare(const struct kernfs_node *= left, * @kn->parent->dir.children. * * Locking: - * mutex_lock(kernfs_mutex) + * kernfs_rwsem held exclusive * * RETURNS: * 0 on susccess -EEXIST on failure. @@ -394,7 +394,7 @@ static int kernfs_link_sibling(struct kernfs_node *kn) * removed, %false if @kn wasn't on the rbtree. * * Locking: - * mutex_lock(kernfs_mutex) + * kernfs_rwsem held exclusive */ static bool kernfs_unlink_sibling(struct kernfs_node *kn) { @@ -465,14 +465,14 @@ void kernfs_put_active(struct kernfs_node *kn) * return after draining is complete. */ static void kernfs_drain(struct kernfs_node *kn) - __releases(&kernfs_mutex) __acquires(&kernfs_mutex) + __releases(&kernfs_rwsem) __acquires(&kernfs_rwsem) { struct kernfs_root *root =3D kernfs_root(kn); =20 - lockdep_assert_held(&kernfs_mutex); + lockdep_assert_held_write(&kernfs_rwsem); WARN_ON_ONCE(kernfs_active(kn)); =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); =20 if (kernfs_lockdep(kn)) { rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_); @@ -491,7 +491,7 @@ static void kernfs_drain(struct kernfs_node *kn) =20 kernfs_drain_open_files(kn); =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); } =20 /** @@ -572,18 +572,18 @@ static int kernfs_dop_revalidate(struct dentry *dentr= y, unsigned int flags) /* If the kernfs parent node has changed discard and * proceed to ->lookup. */ - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); spin_lock(&dentry->d_lock); parent =3D kernfs_dentry_node(dentry->d_parent); if (parent) { if (kernfs_dir_changed(parent, dentry)) { spin_unlock(&dentry->d_lock); - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); return 0; } } spin_unlock(&dentry->d_lock); - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); =20 /* The kernfs parent node hasn't changed, leave the * dentry negative and return success. @@ -592,7 +592,7 @@ static int kernfs_dop_revalidate(struct dentry *dentry,= unsigned int flags) } =20 kn =3D kernfs_dentry_node(dentry); - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); =20 /* The kernfs node has been deactivated */ if (!kernfs_active(kn)) @@ -611,10 +611,10 @@ static int kernfs_dop_revalidate(struct dentry *dentr= y, unsigned int flags) kernfs_info(dentry->d_sb)->ns !=3D kn->ns) goto out_bad; =20 - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); return 1; out_bad: - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); return 0; } =20 @@ -809,7 +809,7 @@ int kernfs_add_one(struct kernfs_node *kn) bool has_ns; int ret; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); =20 ret =3D -EINVAL; has_ns =3D kernfs_ns_enabled(parent); @@ -840,7 +840,7 @@ int kernfs_add_one(struct kernfs_node *kn) ps_iattr->ia_mtime =3D ps_iattr->ia_ctime; } =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); =20 /* * Activate the new node unless CREATE_DEACTIVATED is requested. @@ -854,7 +854,7 @@ int kernfs_add_one(struct kernfs_node *kn) return 0; =20 out_unlock: - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); return ret; } =20 @@ -875,7 +875,7 @@ static struct kernfs_node *kernfs_find_ns(struct kernfs= _node *parent, bool has_ns =3D kernfs_ns_enabled(parent); unsigned int hash; =20 - lockdep_assert_held(&kernfs_mutex); + lockdep_assert_held(&kernfs_rwsem); =20 if (has_ns !=3D (bool)ns) { WARN(1, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n", @@ -907,7 +907,7 @@ static struct kernfs_node *kernfs_walk_ns(struct kernfs= _node *parent, size_t len; char *p, *name; =20 - lockdep_assert_held(&kernfs_mutex); + lockdep_assert_held_read(&kernfs_rwsem); =20 spin_lock_irq(&kernfs_pr_cont_lock); =20 @@ -946,10 +946,10 @@ struct kernfs_node *kernfs_find_and_get_ns(struct ker= nfs_node *parent, { struct kernfs_node *kn; =20 - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); kn =3D kernfs_find_ns(parent, name, ns); kernfs_get(kn); - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); =20 return kn; } @@ -970,10 +970,10 @@ struct kernfs_node *kernfs_walk_and_get_ns(struct ker= nfs_node *parent, { struct kernfs_node *kn; =20 - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); kn =3D kernfs_walk_ns(parent, path, ns); kernfs_get(kn); - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); =20 return kn; } @@ -1128,7 +1128,7 @@ static struct dentry *kernfs_iop_lookup(struct inode = *dir, struct inode *inode =3D NULL; const void *ns =3D NULL; =20 - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); if (kernfs_ns_enabled(parent)) ns =3D kernfs_info(dir->i_sb)->ns; =20 @@ -1144,7 +1144,7 @@ static struct dentry *kernfs_iop_lookup(struct inode = *dir, kernfs_set_rev(parent, dentry); /* instantiate and hash (possibly negative) dentry */ ret =3D d_splice_alias(inode, dentry); - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); =20 return ret; } @@ -1264,7 +1264,7 @@ static struct kernfs_node *kernfs_next_descendant_pos= t(struct kernfs_node *pos, { struct rb_node *rbn; =20 - lockdep_assert_held(&kernfs_mutex); + lockdep_assert_held_write(&kernfs_rwsem); =20 /* if first iteration, visit leftmost descendant which may be root */ if (!pos) @@ -1300,7 +1300,7 @@ void kernfs_activate(struct kernfs_node *kn) { struct kernfs_node *pos; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); =20 pos =3D NULL; while ((pos =3D kernfs_next_descendant_post(pos, kn))) { @@ -1314,14 +1314,14 @@ void kernfs_activate(struct kernfs_node *kn) pos->flags |=3D KERNFS_ACTIVATED; } =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); } =20 static void __kernfs_remove(struct kernfs_node *kn) { struct kernfs_node *pos; =20 - lockdep_assert_held(&kernfs_mutex); + lockdep_assert_held_write(&kernfs_rwsem); =20 /* * Short-circuit if non-root @kn has already finished removal. @@ -1344,7 +1344,7 @@ static void __kernfs_remove(struct kernfs_node *kn) pos =3D kernfs_leftmost_descendant(kn); =20 /* - * kernfs_drain() drops kernfs_mutex temporarily and @pos's + * kernfs_drain() drops kernfs_rwsem temporarily and @pos's * base ref could have been put by someone else by the time * the function returns. Make sure it doesn't go away * underneath us. @@ -1391,9 +1391,9 @@ static void __kernfs_remove(struct kernfs_node *kn) */ void kernfs_remove(struct kernfs_node *kn) { - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); __kernfs_remove(kn); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); } =20 /** @@ -1480,17 +1480,17 @@ bool kernfs_remove_self(struct kernfs_node *kn) { bool ret; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); kernfs_break_active_protection(kn); =20 /* * SUICIDAL is used to arbitrate among competing invocations. Only * the first one will actually perform removal. When the removal * is complete, SUICIDED is set and the active ref is restored - * while holding kernfs_mutex. The ones which lost arbitration - * waits for SUICDED && drained which can happen only after the - * enclosing kernfs operation which executed the winning instance - * of kernfs_remove_self() finished. + * while kernfs_rwsem for held exclusive. The ones which lost + * arbitration waits for SUICIDED && drained which can happen only + * after the enclosing kernfs operation which executed the winning + * instance of kernfs_remove_self() finished. */ if (!(kn->flags & KERNFS_SUICIDAL)) { kn->flags |=3D KERNFS_SUICIDAL; @@ -1508,9 +1508,9 @@ bool kernfs_remove_self(struct kernfs_node *kn) atomic_read(&kn->active) =3D=3D KN_DEACTIVATED_BIAS) break; =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); schedule(); - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); } finish_wait(waitq, &wait); WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb)); @@ -1518,12 +1518,12 @@ bool kernfs_remove_self(struct kernfs_node *kn) } =20 /* - * This must be done while holding kernfs_mutex; otherwise, waiting - * for SUICIDED && deactivated could finish prematurely. + * This must be done while kernfs_rwsem held exclusive; otherwise, + * waiting for SUICIDED && deactivated could finish prematurely. */ kernfs_unbreak_active_protection(kn); =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); return ret; } =20 @@ -1547,7 +1547,7 @@ int kernfs_remove_by_name_ns(struct kernfs_node *pare= nt, const char *name, return -ENOENT; } =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); =20 kn =3D kernfs_find_ns(parent, name, ns); if (kn) { @@ -1556,7 +1556,7 @@ int kernfs_remove_by_name_ns(struct kernfs_node *pare= nt, const char *name, kernfs_put(kn); } =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); =20 if (kn) return 0; @@ -1582,7 +1582,7 @@ int kernfs_rename_ns(struct kernfs_node *kn, struct k= ernfs_node *new_parent, if (!kn->parent) return -EINVAL; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); =20 error =3D -ENOENT; if (!kernfs_active(kn) || !kernfs_active(new_parent) || @@ -1636,7 +1636,7 @@ int kernfs_rename_ns(struct kernfs_node *kn, struct k= ernfs_node *new_parent, =20 error =3D 0; out: - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); return error; } =20 @@ -1711,7 +1711,7 @@ static int kernfs_fop_readdir(struct file *file, stru= ct dir_context *ctx) =20 if (!dir_emit_dots(file, ctx)) return 0; - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); =20 if (kernfs_ns_enabled(parent)) ns =3D kernfs_info(dentry->d_sb)->ns; @@ -1728,12 +1728,12 @@ static int kernfs_fop_readdir(struct file *file, st= ruct dir_context *ctx) file->private_data =3D pos; kernfs_get(pos); =20 - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); if (!dir_emit(ctx, name, len, ino, type)) return 0; - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); } - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); file->private_data =3D NULL; ctx->pos =3D INT_MAX; return 0; diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index c75719312147..60e2a86c535e 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c @@ -860,7 +860,7 @@ static void kernfs_notify_workfn(struct work_struct *wo= rk) spin_unlock_irq(&kernfs_notify_lock); =20 /* kick fsnotify */ - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); =20 list_for_each_entry(info, &kernfs_root(kn)->supers, node) { struct kernfs_node *parent; @@ -898,7 +898,7 @@ static void kernfs_notify_workfn(struct work_struct *wo= rk) iput(inode); } =20 - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); kernfs_put(kn); goto repeat; } diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index fc2469a20fed..ddaf18198935 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -106,9 +106,9 @@ int kernfs_setattr(struct kernfs_node *kn, const struct= iattr *iattr) { int ret; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); ret =3D __kernfs_setattr(kn, iattr); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); return ret; } =20 @@ -121,7 +121,7 @@ int kernfs_iop_setattr(struct dentry *dentry, struct ia= ttr *iattr) if (!kn) return -EINVAL; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); error =3D setattr_prepare(dentry, iattr); if (error) goto out; @@ -134,7 +134,7 @@ int kernfs_iop_setattr(struct dentry *dentry, struct ia= ttr *iattr) setattr_copy(inode, iattr); =20 out: - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); return error; } =20 @@ -189,9 +189,9 @@ int kernfs_iop_getattr(const struct path *path, struct = kstat *stat, struct inode *inode =3D d_inode(path->dentry); struct kernfs_node *kn =3D inode->i_private; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); kernfs_refresh_inode(kn, inode); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); =20 generic_fillattr(inode, stat); return 0; @@ -281,9 +281,9 @@ int kernfs_iop_permission(struct inode *inode, int mask) =20 kn =3D inode->i_private; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); kernfs_refresh_inode(kn, inode); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); =20 return generic_permission(inode, mask); } diff --git a/fs/kernfs/kernfs-internal.h b/fs/kernfs/kernfs-internal.h index 6a8d0ca26d03..c933d9bd8a78 100644 --- a/fs/kernfs/kernfs-internal.h +++ b/fs/kernfs/kernfs-internal.h @@ -13,6 +13,7 @@ #include #include #include +#include #include =20 #include @@ -69,7 +70,7 @@ struct kernfs_super_info { */ const void *ns; =20 - /* anchored at kernfs_root->supers, protected by kernfs_mutex */ + /* anchored at kernfs_root->supers, protected by kernfs_rwsem */ struct list_head node; }; #define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info)) @@ -118,7 +119,7 @@ int __kernfs_setattr(struct kernfs_node *kn, const stru= ct iattr *iattr); /* * dir.c */ -extern struct mutex kernfs_mutex; +extern struct rw_semaphore kernfs_rwsem; extern const struct dentry_operations kernfs_dops; extern const struct file_operations kernfs_dir_fops; extern const struct inode_operations kernfs_dir_iops; diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c index 9dc7e7a64e10..baa4155ba2ed 100644 --- a/fs/kernfs/mount.c +++ b/fs/kernfs/mount.c @@ -255,9 +255,9 @@ static int kernfs_fill_super(struct super_block *sb, st= ruct kernfs_fs_context *k sb->s_shrink.seeks =3D 0; =20 /* get root inode, initialize and unlock it */ - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); inode =3D kernfs_get_inode(sb, info->root->kn); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); if (!inode) { pr_debug("kernfs: could not get root inode\n"); return -ENOMEM; @@ -344,9 +344,9 @@ int kernfs_get_tree(struct fs_context *fc) } sb->s_flags |=3D SB_ACTIVE; =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); list_add(&info->node, &info->root->supers); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); } =20 fc->root =3D dget(sb->s_root); @@ -372,9 +372,9 @@ void kernfs_kill_sb(struct super_block *sb) { struct kernfs_super_info *info =3D kernfs_info(sb); =20 - mutex_lock(&kernfs_mutex); + down_write(&kernfs_rwsem); list_del(&info->node); - mutex_unlock(&kernfs_mutex); + up_write(&kernfs_rwsem); =20 /* * Remove the superblock from fs_supers/s_instances diff --git a/fs/kernfs/symlink.c b/fs/kernfs/symlink.c index 5432883d819f..c8f8e41b8411 100644 --- a/fs/kernfs/symlink.c +++ b/fs/kernfs/symlink.c @@ -116,9 +116,9 @@ static int kernfs_getlink(struct inode *inode, char *pa= th) struct kernfs_node *target =3D kn->symlink.target_kn; int error; =20 - mutex_lock(&kernfs_mutex); + down_read(&kernfs_rwsem); error =3D kernfs_get_target_path(parent, target, path); - mutex_unlock(&kernfs_mutex); + up_read(&kernfs_rwsem); =20 return error; } diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h index 195afa63ab1c..95e1948379d0 100644 --- a/include/linux/kernfs.h +++ b/include/linux/kernfs.h @@ -193,7 +193,7 @@ struct kernfs_root { u32 id_highbits; struct kernfs_syscall_ops *syscall_ops; =20 - /* list of kernfs_super_info of this root, protected by kernfs_mutex */ + /* list of kernfs_super_info of this root, protected by kernfs_rwsem */ struct list_head supers; =20 wait_queue_head_t deactivate_waitq; --=20 2.43.0 From nobody Sun Feb 8 05:22:51 2026 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8898221DB0; Wed, 21 May 2025 01:53:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792433; cv=none; b=qQ2lalGpfmuRzAHDO+/vgKkKJsix5pFtLsgsMClAzM5VotKprY5CylltFXDlvqyN8DOVK55j602QsF2655osLVUCddNkflOvXXmDnWvPBnuS3fG0Y4oiaNh6O8f9w0ML/nFRwtFFuNfhcPHyBhaAUmLlva/mqe0hD/qOYlTV+E8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792433; c=relaxed/simple; bh=Jmqb0qfzmckFPdhbVbqdMz2SzJYxVZTMfB26alyr/T0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mfY2YRvgml/2LesAtZZxVBtZKoW4prShLCEGrSOPDiYXvTAgJpVMGDao0xLQdROgUj999YP0iCrTsPGKG+rYqvS0HZ+gb82qt4Liy2LTmoQHxHaUZVtFtzahic9WKbdiDGt3/oP/A27f7A+fpX7/CTn3BXb154X6UwUYhDCDK9U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XplQ3WWI; arc=none smtp.client-ip=209.85.215.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XplQ3WWI" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-b0b2d0b2843so4769661a12.2; Tue, 20 May 2025 18:53:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747792431; x=1748397231; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vk7hGdbueTM/XeD7quVK27Y9jexgacMzkbIco6Hgcyk=; b=XplQ3WWIwg5AdiTE6f1/XgVmqtJ7gZYOvuJ9Gs3VhxhS5d1jtd8BcUwKSI2OCOoJsx Kbc1tVuy/dCb+r9f8K/ZZnjXeq00L6Di9llByCDqstjXc+o/BvGBd4wiULjZxXchZvma RcBjJCuqcNeN7ItnVoImJzoxc1n315B2rjU7u0rKPRU2fNUUg9/g8Myft6z441K2M1+Z KUzmei8YGzzls1fp8Jo9Mnj3409ghK3WNLgSV/qWob/DPKo6NJfeMxiBdKQ0d3HD2vuV MG4FIYspRrkX+9NhiDasyr2ee82qbEBS4I5YNiSr1QebE7S1oieeEkFro3PjnzUwHe7A x+jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747792431; x=1748397231; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vk7hGdbueTM/XeD7quVK27Y9jexgacMzkbIco6Hgcyk=; b=q52Wy4yP/yPqmgnfq9agMVUSyhO4ahulN6ZmDZSMqEQYtXxFNu6LgFL+9Bq75IA9cS IzPYazWIYtHSSTyTV5ZfJTrCaxDAgFw6uDRukI3d8NfCydTyDZZd+3aA+zaAPEKN5cG8 pAk+MrHpFIQ7jTHUx/1R6I6sBmii/GI6o7M6K++4zsKXeK8wMleyF/fn5y+FyUM4+Re0 iMlSVsFlYDBDWdaZFXYKtyszjLbWsy8KkunRqlnGKXUacLSAL5Yf9n5Fgxh6CMFeS543 hm6AzEi9jnkEk8RUMOQx/vIIB1/cSGplNfl1gKBkqOnbAnkbKx93NdWgZpK3pcwtB/xC nrRw== X-Forwarded-Encrypted: i=1; AJvYcCV7MgLZiqpFQw7VazhLO/Bq8bCYhqbk8BOYb7kj6lFlESOxmUjyyIlKy/SY0HhhDjGiaVf16jmqeJpcKQ0=@vger.kernel.org X-Gm-Message-State: AOJu0YzE6U4vGtEfn7RmFIel8xw+G9r+V6Ou0JRk/Fv1pKgXPcSagl0w TznZ3iSzceKX7o6rHpGlo7nTBXvs0+oEgpFXy1qotMNCd0UiRR3SLGiwIaLywYyToFc= X-Gm-Gg: ASbGncsrlokvI+srTTApyKX3PZe7e3QNajC7tYE3XSOy35w2XaqkRyC0GPX4SlZQcq2 g6gc8LVVr65oETPEeVyZsa1JsKYqHkQ2aoQPdpWCZ3RcobyrBQfdtsuOVciCq3isuvx7FAvKx+B ZXhVmU3z44P8LtnUeqnDZ3b1AgOL8cRVDMJD1F1oGkMSWbc2Uz7oeNHVZ3hJiT1te9aLwB+pNXA +8cPGN0eAnMzqpqWSOQFc2iTT9pgMVADB1c/QwUb53yGaQR6Q+8lUrOBnASWecPjpxWiEy4S2hj 0zca4qu8pjBvZNRw0cxYB9witKMD2Pz1iq4D2rwiIorAhiRJWZuHmDQ= X-Google-Smtp-Source: AGHT+IH6lYx4FVOHg5TaGuxx99FiGF29bNGDqe6QIzkNykPL9egSxg4wMfSRAq3/FRMwd9DOOaDIOg== X-Received: by 2002:a17:903:1acf:b0:224:255b:c934 with SMTP id d9443c01a7336-231d4583e46mr245108885ad.51.1747792430928; Tue, 20 May 2025 18:53:50 -0700 (PDT) Received: from gmail.com ([116.237.135.88]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4eedb59sm82796665ad.257.2025.05.20.18.53.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 May 2025 18:53:50 -0700 (PDT) From: Qingfang Deng To: stable@vger.kernel.org, Greg Kroah-Hartman , Tejun Heo , linux-kernel@vger.kernel.org Cc: Ian Kent , Miklos Szeredi Subject: [PATCH 5.10 4/5] kernfs: use i_lock to protect concurrent inode updates Date: Wed, 21 May 2025 09:53:34 +0800 Message-ID: <20250521015336.3450911-5-dqfext@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250521015336.3450911-1-dqfext@gmail.com> References: <20250521015336.3450911-1-dqfext@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Kent Commit 47b5c64d0ab5e7136db2b78c6ec710e0d8a5a36b upstream. The inode operations .permission() and .getattr() use the kernfs node write lock but all that's needed is the read lock to protect against partial updates of these kernfs node fields which are all done under the write lock. And .permission() is called frequently during path walks and can cause quite a bit of contention between kernfs node operations and path walks when the number of concurrent walks is high. To change kernfs_iop_getattr() and kernfs_iop_permission() to take the rw sem read lock instead of the write lock an additional lock is needed to protect against multiple processes concurrently updating the inode attributes and link count in kernfs_refresh_inode(). The inode i_lock seems like the sensible thing to use to protect these inode attribute updates so use it in kernfs_refresh_inode(). The last hunk in the patch, applied to kernfs_fill_super(), is possibly not needed but taking the lock was present originally. I prefer to continue to take it to protect against a partial update of the source kernfs fields during the call to kernfs_refresh_inode() made by kernfs_get_inode(). Reviewed-by: Miklos Szeredi Signed-off-by: Ian Kent Link: https://lore.kernel.org/r/162642771474.63632.16295959115893904470.stg= it@web.messagingengine.com Signed-off-by: Greg Kroah-Hartman --- fs/kernfs/inode.c | 18 ++++++++++++------ fs/kernfs/mount.c | 4 ++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index ddaf18198935..73d7d4a24c51 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -189,11 +189,13 @@ int kernfs_iop_getattr(const struct path *path, struc= t kstat *stat, struct inode *inode =3D d_inode(path->dentry); struct kernfs_node *kn =3D inode->i_private; =20 - down_write(&kernfs_rwsem); + down_read(&kernfs_rwsem); + spin_lock(&inode->i_lock); kernfs_refresh_inode(kn, inode); - up_write(&kernfs_rwsem); - generic_fillattr(inode, stat); + spin_unlock(&inode->i_lock); + up_read(&kernfs_rwsem); + return 0; } =20 @@ -275,17 +277,21 @@ void kernfs_evict_inode(struct inode *inode) int kernfs_iop_permission(struct inode *inode, int mask) { struct kernfs_node *kn; + int ret; =20 if (mask & MAY_NOT_BLOCK) return -ECHILD; =20 kn =3D inode->i_private; =20 - down_write(&kernfs_rwsem); + down_read(&kernfs_rwsem); + spin_lock(&inode->i_lock); kernfs_refresh_inode(kn, inode); - up_write(&kernfs_rwsem); + ret =3D generic_permission(inode, mask); + spin_unlock(&inode->i_lock); + up_read(&kernfs_rwsem); =20 - return generic_permission(inode, mask); + return ret; } =20 int kernfs_xattr_get(struct kernfs_node *kn, const char *name, diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c index baa4155ba2ed..f2f909d09f52 100644 --- a/fs/kernfs/mount.c +++ b/fs/kernfs/mount.c @@ -255,9 +255,9 @@ static int kernfs_fill_super(struct super_block *sb, st= ruct kernfs_fs_context *k sb->s_shrink.seeks =3D 0; =20 /* get root inode, initialize and unlock it */ - down_write(&kernfs_rwsem); + down_read(&kernfs_rwsem); inode =3D kernfs_get_inode(sb, info->root->kn); - up_write(&kernfs_rwsem); + up_read(&kernfs_rwsem); if (!inode) { pr_debug("kernfs: could not get root inode\n"); return -ENOMEM; --=20 2.43.0 From nobody Sun Feb 8 05:22:51 2026 Received: from mail-pg1-f172.google.com (mail-pg1-f172.google.com [209.85.215.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23C7F221F0C; Wed, 21 May 2025 01:53:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792435; cv=none; b=BZnUjVvtZDxm69k39BmpEP1mgMdPZ1ggwRWDYdabLY7AgMYzXwL+fA/eQIzO/9Lw0mYaqCssG98Qd+p3gy3fLpUq1BO92t8YcSHIWWjC3DxrdG+B0tHsF2zQuii0EAOAcUuligpd0W84IFz3Py4E3DiGyg4xodwI77/mV5L6fZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747792435; c=relaxed/simple; bh=+SWjNDzBMp8S37NaGQn1wgk8MhGHspoDe6lFI6sPKMc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p5wjW4IYtlPyR0Ja69E4Z68ioNuMcIVJbMdFwNgTDZrkztG7dbjKDmxDbOeuHXglEZROk84Jyy00OuGhYhGCA20tea0Ag4KXd3LKYOITAiwpMsyu3e+J2MJsureFxywLpaoyMAAwJl3ZWYX+WOgaGmele3lgEso2XrCWa5kBgVk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fwSxDibg; arc=none smtp.client-ip=209.85.215.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fwSxDibg" Received: by mail-pg1-f172.google.com with SMTP id 41be03b00d2f7-af5085f7861so4098914a12.3; Tue, 20 May 2025 18:53:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747792433; x=1748397233; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=66xskfZTYSTa36h/Txw1DnBFo3eDhYKJWl/CVOCE5Po=; b=fwSxDibgfRFUqIZmkDeIMQ7lXRHKmidyKbdH3bOea8Jjwk/HD7pZu+AQcd6uk9OB4f xzX4F3lOBJhMKyuPmuvv8uTcO5UTUDnz2G4XMSRextVExWs4OB+w5lj1PF6e8ifpj/qk jilFxOg0GnxIHNITiihrQPGmIdHynQwwf2FgJJNuSlqFhUW+EtX5rE8BUdqcEEnn+ifZ pz9Af+pK5lgMarinuL8sSXVINN8/Jt6hwbuAMBRoZ+BskRNswpXedfKs5T9DusLUzRDu XQP8mNJlAMLUhoMCDWSC1x3qeXcEc13Dw1ya7rk8e5WixwQmQsM10rEKJiUyKFqlQNRK xn6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747792433; x=1748397233; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=66xskfZTYSTa36h/Txw1DnBFo3eDhYKJWl/CVOCE5Po=; b=GgZhsKqH1m+5w1TYmu28pPW8VZIpEybaFrZjnxVtxyzOTY7e7qSi3oNdAuU3Wp9QLp jL41p83xr/GryMslTe5oVFeUktV4tCvUEW4HneFhfZ9yMItw2rJLt6I2siR2bF/6IBm2 kb+Ka7Nhrid8c/ar+rRfs7qJFwDnhMk9mI2lhLCAUAj0bBhMAnI3xc6uprqMPWoN8QGa CN64Lk5qi+Gs2rIhVK8niijYvrJEVWoBlaZg4YXwAPtOjtJuw2mguOsCrVOBhZpFPWvu fdMkPQqA6Y5lp7Zb6Hs+hkA6st965SdRQjy/EYDnXj61bWVWGRraIAgpoQBG/7H4/mwg Gd6Q== X-Forwarded-Encrypted: i=1; AJvYcCXY2GJmESLakuaH9gtng4Xz7iBD4+1ZZcNrWE5SYJ0RiO9HVKtT8pHSJxkSlvVTlNk7RsW5EUhVSsYRpFc=@vger.kernel.org X-Gm-Message-State: AOJu0YyCMl6HSTxRuHrdNEdt4JqDJW2ozpG70YCSmDkwo1o18Rmn2qZh WxgHjQoUxOz/IK7B9F9l1bSlhFG3APM72b0NB9qzGG5dlbku0+Z8Byd/X89EMkQaGXE= X-Gm-Gg: ASbGnctHlQhG+UXfQqXgXe0c1N7FOeFJLBNp9vb52sMQwwqW6FimbLXPrXkmdE/pOyl rfbAvHnpMszwkkPiA27MUWqNdETOqGAa9mB/lcv5Af1WBqGQQrsv1HzZn0uTQmxNVcqn05y/P3S alT1+N8LMyUSra3ESVu5DPId/DmV6JRUul52ynQRas06b99tgFW1U6G3bszTklwpqmjsrSttrEV SPhRk37V0H7cj83PkwQ8KcL1lVRajicW2MIqjiu5u18oXm9EmyuBDIH1SrX/ygxyMAGBe99RJWy GvGrTcUXn6gPuU6WuT7Ij0/AvGiX8cWUwH9JRAA3GRmm X-Google-Smtp-Source: AGHT+IG6AHmgtTNfQSoE+ReVE0/1RMinnFw7ZGP/lKTU73d4o6z4SY8xExogy/CUeNN2W96IiAaTew== X-Received: by 2002:a17:902:c951:b0:22e:7971:4d48 with SMTP id d9443c01a7336-231de37ebb8mr235956365ad.45.1747792433210; Tue, 20 May 2025 18:53:53 -0700 (PDT) Received: from gmail.com ([116.237.135.88]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-231d4eedb59sm82796665ad.257.2025.05.20.18.53.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 May 2025 18:53:52 -0700 (PDT) From: Qingfang Deng To: stable@vger.kernel.org, Greg Kroah-Hartman , Tejun Heo , linux-kernel@vger.kernel.org Cc: Ian Kent , Miklos Szeredi Subject: [PATCH 5.10 5/5] kernfs: dont call d_splice_alias() under kernfs node lock Date: Wed, 21 May 2025 09:53:35 +0800 Message-ID: <20250521015336.3450911-6-dqfext@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250521015336.3450911-1-dqfext@gmail.com> References: <20250521015336.3450911-1-dqfext@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Ian Kent Commit df6192f47d2311cf40cd4321cc59863a5853b665 upstream. The call to d_splice_alias() in kernfs_iop_lookup() doesn't depend on any kernfs node so there's no reason to hold the kernfs node lock when calling it. Reviewed-by: Miklos Szeredi Signed-off-by: Ian Kent Link: https://lore.kernel.org/r/162642772000.63632.10672683419693513226.stg= it@web.messagingengine.com Signed-off-by: Greg Kroah-Hartman --- fs/kernfs/dir.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 0443a9cd72a3..f301605d70b0 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c @@ -1122,7 +1122,6 @@ static struct dentry *kernfs_iop_lookup(struct inode = *dir, struct dentry *dentry, unsigned int flags) { - struct dentry *ret; struct kernfs_node *parent =3D dir->i_private; struct kernfs_node *kn; struct inode *inode =3D NULL; @@ -1142,11 +1141,10 @@ static struct dentry *kernfs_iop_lookup(struct inod= e *dir, /* Needed only for negative dentry validation */ if (!inode) kernfs_set_rev(parent, dentry); - /* instantiate and hash (possibly negative) dentry */ - ret =3D d_splice_alias(inode, dentry); up_read(&kernfs_rwsem); =20 - return ret; + /* instantiate and hash (possibly negative) dentry */ + return d_splice_alias(inode, dentry); } =20 static int kernfs_iop_mkdir(struct inode *dir, struct dentry *dentry, --=20 2.43.0