mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
NFSv4: Fix a race in nfs_inode_reclaim_delegation()
If we race with a delegreturn before taking the spin lock, we currently end up dropping the delegation stateid. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Tested-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
9c27869d3f
commit
b1a318de9b
@ -195,15 +195,13 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
|
||||
rcu_read_unlock();
|
||||
put_rpccred(oldcred);
|
||||
trace_nfs4_reclaim_delegation(inode, res->delegation_type);
|
||||
} else {
|
||||
/* We appear to have raced with a delegation return. */
|
||||
spin_unlock(&delegation->lock);
|
||||
rcu_read_unlock();
|
||||
nfs_inode_set_delegation(inode, cred, res);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
rcu_read_unlock();
|
||||
/* We appear to have raced with a delegation return. */
|
||||
spin_unlock(&delegation->lock);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
nfs_inode_set_delegation(inode, cred, res);
|
||||
}
|
||||
|
||||
static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation, int issync)
|
||||
|
Loading…
Reference in New Issue
Block a user