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>
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 &&
struct nfs_delegation *delegation;
int err;
- rcu_read_lock();
delegation = nfs_start_delegation_return(nfsi);
- rcu_read_unlock();
-
if (!delegation)
return 0;