nfs4: V2 prevent backlogging of renewd requests
Subsystems (2)
PATCH 2/4 nfs4: V2 prevent backlogging of renewd requests
Signed-off-by Alexandros Batsakis <[email protected]>
--- fs/nfs/nfs4proc.c | 3 +++ fs/nfs/nfs4renewd.c | 24 +++++++----------------- 2 files changed, 10 insertions(+), 17 deletions(-)
fs/nfs/nfs4proc.c +3 -0
@@ -3162,6 +3162,7 @@ static void nfs4_renew_done(struct rpc_task *task, void *data)if (time_before (clp->cl_last_renewal,timestamp)) clp->cl_last_renewal = timestamp;spin_unlock (&clp->cl_lock); +nfs4_schedule_state_renewal (clp); }static const struct rpc_call_ops nfs4_renew_ops = {
@@ -5049,6 +5050,8 @@ void nfs41_sequence_call_done(struct rpc_task *task, void *data) }dprintk ("%s rpc_cred %p\n" , __func__, task->tk_msg.rpc_cred); +nfs4_schedule_state_renewal (clp); +kfree (task->tk_msg.rpc_argp);kfree (task->tk_msg.rpc_resp);
fs/nfs/nfs4renewd.c +7 -17
@@ -36,11 +36,6 @@* as an rpc_task, not a real kernel thread, so it always runs in rpciod's * context. There is one renewd per nfs_server. * -* TODO: If the send queue gets backlogged (e.g., if the server goes down), -* we will keep filling the queue with periodic RENEW requests. We need a -* mechanism for ensuring that if renewd successfully sends off a request, -* then it only wakes up when the request is finished. Maybe use the -* child task framework of the RPC layer? */ #include <linux/mm.h>
@@ -63,7 +58,7 @@ nfs4_renew_state(struct work_struct *work)struct nfs_client *clp = container_of(work, struct nfs_client, cl_renewd.work);struct rpc_cred *cred; -long lease, timeout; +long lease;unsigned long last, now; ops = nfs4_state_renewal_ops[clp->cl_minorversion];
@@ -75,7 +70,6 @@ nfs4_renew_state(struct work_struct *work) lease = clp->cl_lease_time; last = clp->cl_last_renewal; now = jiffies; - timeout = (2 * lease) /3 + (long )last - (long )now;/* Are we close to a lease timeout? */ if (time_after (now, last + lease/3 )) { cred = ops->get_state_renewal_cred_locked (clp);
@@ -90,19 +84,15 @@ nfs4_renew_state(struct work_struct *work)/* Queue an asynchronous RENEW. */ ops->sched_state_renewal (clp, cred);put_rpccred (cred); + goto out_exp; } - timeout = (2 * lease) /3 ; -spin_lock (&clp->cl_lock); - }else + }else {dprintk ("%s: failed to call renewd. Reason: lease not expired \n" , __func__); -if (timeout <5 *HZ )/* safeguard */ - timeout =5 *HZ ; -dprintk ("%s: requeueing work. Lease period = %ld\n" , - __func__, (timeout +HZ -1 ) /HZ ); -cancel_delayed_work (&clp->cl_renewd); -schedule_delayed_work (&clp->cl_renewd, timeout); -spin_unlock (&clp->cl_lock); +spin_unlock (&clp->cl_lock); + } +nfs4_schedule_state_renewal (clp); +out_exp:nfs_expire_unreferenced_delegations (clp); out:dprintk ("%s: done\n" , __func__);
Signature · 1 line
1.6.2.5