NFSv4: Don't call put_rpccred() under the rcu_read_lock()
authorTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 26 Feb 2015 17:54:46 +0000 (12:54 -0500)
committerBen Hutchings <ben@decadent.org.uk>
Sat, 9 May 2015 22:16:22 +0000 (23:16 +0100)
commit 7c0af9ffb7bb4e5355470fa60b3eb711ddf226fa upstream.

put_rpccred() can sleep.

Fixes: 8f649c3762547 ("NFSv4: Fix the locking in nfs_inode_reclaim_delegation()")
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
[bwh: Backported to 3.2: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
fs/nfs/delegation.c

index ac889af..92cf07d 100644 (file)
@@ -149,8 +149,8 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
                                  &delegation->flags);
                        NFS_I(inode)->delegation_state = delegation->type;
                        spin_unlock(&delegation->lock);
-                       put_rpccred(oldcred);
                        rcu_read_unlock();
+                       put_rpccred(oldcred);
                } else {
                        /* We appear to have raced with a delegation return. */
                        spin_unlock(&delegation->lock);