Browse Source

NFSv4: Ensure we honour NFS_DELEGATION_RETURNING in nfs_inode_set_delegation()

Ensure that nfs_inode_set_delegation() doesn't inadvertently detach a
delegation that is already in the process of being returned.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Trond Myklebust 10 years ago
parent
commit
ade04647dd
1 changed files with 4 additions and 1 deletions
  1. 4 1
      fs/nfs/delegation.c

+ 4 - 1
fs/nfs/delegation.c

@@ -370,7 +370,10 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct
 			delegation = NULL;
 			delegation = NULL;
 			goto out;
 			goto out;
 		}
 		}
-		freeme = nfs_detach_delegation_locked(nfsi, 
+		if (test_and_set_bit(NFS_DELEGATION_RETURNING,
+					&old_delegation->flags))
+			goto out;
+		freeme = nfs_detach_delegation_locked(nfsi,
 				old_delegation, clp);
 				old_delegation, clp);
 		if (freeme == NULL)
 		if (freeme == NULL)
 			goto out;
 			goto out;