From: Christoph Hellwig Date: Wed, 7 Jan 2026 07:27:11 +0000 (+0100) Subject: NFS: use a local RCU critical section in nfs_start_delegation_return X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3365322401450971111ced702591ef78db950c28;p=thirdparty%2Fkernel%2Fstable.git 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 --- diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index a3996bd70236..09e0d3732fda 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;