NFS: Clear up state owner lock usage
authorAnna Schumaker <Anna.Schumaker@netapp.com>
Wed, 3 Sep 2014 18:15:40 +0000 (14:15 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 10 Sep 2014 19:47:00 +0000 (12:47 -0700)
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>
fs/nfs/nfs4proc.c

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