NFS: Clear up state owner lock usage

can_open_cached() reads values out of the state structure, meaning that
we need the so_lock to have a correct return value.  As a bonus, this
helps clear up some potentially confusing code.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Anna Schumaker 2014-09-03 14:15:40 -04:00 committed by Trond Myklebust
parent 0f7a622ca6
commit 61beef75cc

View File

@ -1307,15 +1307,13 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
int ret = -EAGAIN; int ret = -EAGAIN;
for (;;) { for (;;) {
spin_lock(&state->owner->so_lock);
if (can_open_cached(state, fmode, open_mode)) { if (can_open_cached(state, fmode, open_mode)) {
spin_lock(&state->owner->so_lock); update_open_stateflags(state, fmode);
if (can_open_cached(state, fmode, open_mode)) {
update_open_stateflags(state, fmode);
spin_unlock(&state->owner->so_lock);
goto out_return_state;
}
spin_unlock(&state->owner->so_lock); spin_unlock(&state->owner->so_lock);
goto out_return_state;
} }
spin_unlock(&state->owner->so_lock);
rcu_read_lock(); rcu_read_lock();
delegation = rcu_dereference(nfsi->delegation); delegation = rcu_dereference(nfsi->delegation);
if (!can_open_delegated(delegation, fmode)) { if (!can_open_delegated(delegation, fmode)) {