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 <hch@lst.de>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
This commit is contained in:
Christoph Hellwig 2026-01-07 08:27:11 +01:00 committed by Anna Schumaker
parent 36e3e9387b
commit 3365322401

View File

@ -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;