nfsd: return correct lockowner when there is a race on hash insert
authorJ. Bruce Fields <bfields@redhat.com>
Mon, 23 Mar 2015 15:02:30 +0000 (11:02 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Thu, 26 Mar 2015 01:06:16 +0000 (21:06 -0400)
alloc_init_lock_stateowner can return an already freed entry if there is
a race to put openowners in the hashtable.

Noticed by inspection after Jeff Layton fixed the same bug for open
owners.  Depending on client behavior, this one may be trickier to
trigger in practice.

Fixes: c58c6610ec24 "nfsd: Protect adding/removing lock owners using client_lock"
Cc: <stable@vger.kernel.org>
Cc: Trond Myklebust <trond.myklebust@primarydata.com>
Acked-by: Jeff Layton <jeff.layton@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index cf29d1a698b35d3fc6a0fe210953a68e2de99acc..8ba1d888f1e624d672453bd1eea20c40e054f746 100644 (file)
@@ -5062,7 +5062,7 @@ alloc_init_lock_stateowner(unsigned int strhashval, struct nfs4_client *clp,
        } else
                nfs4_free_lockowner(&lo->lo_owner);
        spin_unlock(&clp->cl_lock);
-       return lo;
+       return ret;
 }
 
 static void