]> err.no Git - linux-2.6/commitdiff
knfsd: nfsv4 delegation recall should take reference on client
authorJ. Bruce Fields <bfields@citi.umich.edu>
Thu, 13 Sep 2007 00:35:15 +0000 (20:35 -0400)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 9 Oct 2007 22:31:57 +0000 (18:31 -0400)
It's not enough to take a reference on the delegation object itself; we
need to ensure that the rpc_client won't go away just as we're about to
make an rpc call.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4callback.c
fs/nfsd/nfs4state.c

index c1cb7e009c1ef54fc3391b933564f872f769c2b7..9d536a8cb3795651551af7b228407a09d890f7b7 100644 (file)
@@ -486,6 +486,7 @@ out_put_cred:
        /* Success or failure, now we're either waiting for lease expiration
         * or deleg_return. */
        dprintk("NFSD: nfs4_cb_recall: dp %p dl_flock %p dl_count %d\n",dp, dp->dl_flock, atomic_read(&dp->dl_count));
+       put_nfs4_client(clp);
        nfs4_put_delegation(dp);
        return;
 }
index e706c69616916a16da7d588b68566f1f0e5680f7..6f182d25793dd67c2651b37e854d7936ab8223ea 100644 (file)
@@ -1345,6 +1345,7 @@ void nfsd_break_deleg_cb(struct file_lock *fl)
         * lock) we know the server hasn't removed the lease yet, we know
         * it's safe to take a reference: */
        atomic_inc(&dp->dl_count);
+       atomic_inc(&dp->dl_client->cl_count);
 
        spin_lock(&recall_lock);
        list_add_tail(&dp->dl_recall_lru, &del_recall_lru);
@@ -1367,6 +1368,7 @@ void nfsd_break_deleg_cb(struct file_lock *fl)
                printk(KERN_INFO "NFSD: Callback thread failed for "
                        "for client (clientid %08x/%08x)\n",
                        clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
+               put_nfs4_client(dp->dl_client);
                nfs4_put_delegation(dp);
        }
 }