summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/delegation.c11
1 files changed, 5 insertions, 6 deletions
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;