SUNRPC: skip dead but not buried clients on PipeFS events
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Fri, 20 Apr 2012 14:11:02 +0000 (18:11 +0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 27 Apr 2012 18:09:59 +0000 (14:09 -0400)
These clients can't be safely dereferenced if their counter in 0.

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/clnt.c

index 67972462a543d1bad6326ec214c73bc9dce17d0b..d10ebc4310f71b422773b72d5cec261b065d8a01 100644 (file)
@@ -218,7 +218,8 @@ static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event)
                if (((event == RPC_PIPEFS_MOUNT) && clnt->cl_dentry) ||
                    ((event == RPC_PIPEFS_UMOUNT) && !clnt->cl_dentry))
                        continue;
-               atomic_inc(&clnt->cl_count);
+               if (atomic_inc_not_zero(&clnt->cl_count) == 0)
+                       continue;
                spin_unlock(&sn->rpc_client_lock);
                return clnt;
        }