nfs4: renewd renew operations should take/put a client reference
authorAlexandros Batsakis <batsakis@netapp.com>
Fri, 5 Feb 2010 11:45:06 +0000 (03:45 -0800)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 2 Mar 2010 18:00:03 +0000 (13:00 -0500)
renewd sends RENEW requests to the NFS server in order to renew state.
As the request is asynchronous, renewd should take a reference to the
nfs_client to prevent concurrent umounts from freeing the client

Signed-off-by: Alexandros Batsakis <batsakis@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4proc.c

index 663ae0c3683432f42bc6c6ec59fe8b3f36e1116c..68f1fe00c08cb2e77640a8369f4b44d1389190f6 100644 (file)
@@ -3152,7 +3152,9 @@ static void nfs4_renew_release(void *data)
 {
        struct nfs_client *clp = data;
 
-       nfs4_schedule_state_renewal(clp);
+       if (atomic_read(&clp->cl_count) > 1)
+               nfs4_schedule_state_renewal(clp);
+       nfs_put_client(clp);
 }
 
 static void nfs4_renew_done(struct rpc_task *task, void *data)
@@ -3185,6 +3187,8 @@ int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred)
                .rpc_cred       = cred,
        };
 
+       if (!atomic_inc_not_zero(&clp->cl_count))
+               return -EIO;
        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
                        &nfs4_renew_ops, clp);
 }