From 3365322401450971111ced702591ef78db950c28 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 7 Jan 2026 08:27:11 +0100 Subject: [PATCH] NFS: use a local RCU critical section in nfs_start_delegation_return Nested RCU critical sections are fine and very cheap. Have a local one in nfs_start_delegation_return so that the function is self-contained and to prepare for simplifying the callers. Signed-off-by: Christoph Hellwig Signed-off-by: Anna Schumaker --- fs/nfs/delegation.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index a3996bd702364..09e0d3732fda2 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -309,11 +309,13 @@ nfs_start_delegation_return(struct nfs_inode *nfsi) struct nfs_delegation *delegation; bool return_now = false; - lockdep_assert_in_rcu_read_lock(); - + rcu_read_lock(); delegation = rcu_dereference(nfsi->delegation); - if (!delegation || !refcount_inc_not_zero(&delegation->refcount)) + if (!delegation || !refcount_inc_not_zero(&delegation->refcount)) { + rcu_read_unlock(); return NULL; + } + rcu_read_unlock(); spin_lock(&delegation->lock); if (delegation->inode && @@ -767,10 +769,7 @@ int nfs4_inode_return_delegation(struct inode *inode) struct nfs_delegation *delegation; int err; - rcu_read_lock(); delegation = nfs_start_delegation_return(nfsi); - rcu_read_unlock(); - if (!delegation) return 0; -- 2.47.3