NFSv4: Ensure that we don't drop a state owner more than once
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 21 Apr 2012 16:31:05 +0000 (12:31 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 21 Apr 2012 16:31:05 +0000 (12:31 -0400)
Retest the RB_EMPTY_NODE() condition under the spin lock
to ensure that we don't call rb_erase() more than once on the
same state owner.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4state.c

index 3b07f094f3a928d5bc62701abfc567663f6a0c78..b300fb840b2165ee221f5599db2fa1860bad9ccc 100644 (file)
@@ -435,13 +435,17 @@ nfs4_alloc_state_owner(struct nfs_server *server,
 static void
 nfs4_drop_state_owner(struct nfs4_state_owner *sp)
 {
-       if (!RB_EMPTY_NODE(&sp->so_server_node)) {
+       struct rb_node *rb_node = &sp->so_server_node;
+
+       if (!RB_EMPTY_NODE(rb_node)) {
                struct nfs_server *server = sp->so_server;
                struct nfs_client *clp = server->nfs_client;
 
                spin_lock(&clp->cl_lock);
-               rb_erase(&sp->so_server_node, &server->state_owners);
-               RB_CLEAR_NODE(&sp->so_server_node);
+               if (!RB_EMPTY_NODE(rb_node)) {
+                       rb_erase(rb_node, &server->state_owners);
+                       RB_CLEAR_NODE(rb_node);
+               }
                spin_unlock(&clp->cl_lock);
        }
 }