static void nlmclnt_unlock_callback(struct rpc_task *task) { struct nlm_rqst *req = (struct nlm_rqst *) task->tk_calldata; int status = req->a_res.status; if (RPC_ASSASSINATED(task)) goto die; if (task->tk_status < 0) { dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status); goto retry_rebind; } if (status == NLM_LCK_DENIED_GRACE_PERIOD) { rpc_delay(task, NLMCLNT_GRACE_WAIT); goto retry_unlock; } if (status != NLM_LCK_GRANTED) printk(KERN_WARNING "lockd: unexpected unlock status: %d\n", status); die: nlm_release_host(req->a_host); kfree(req); return; retry_rebind: nlm_rebind_host(req->a_host); retry_unlock: rpc_restart_call(task); }
/* * Restart an (async) RPC call. Usually called from within the * exit handler. */ void rpc_restart_call(struct rpc_task *task) { if (RPC_ASSASSINATED(task)) return; task->tk_action = call_reserve; rpcproc_count(task->tk_client, task->tk_msg.rpc_proc)++; }
static void nlmclnt_cancel_callback(struct rpc_task *task) { struct nlm_rqst *req = (struct nlm_rqst *) task->tk_calldata; if (RPC_ASSASSINATED(task)) goto die; if (task->tk_status < 0) { dprintk("lockd: CANCEL call error %d, retrying.\n", task->tk_status); goto retry_cancel; } dprintk("lockd: cancel status %d (task %d)\n", req->a_res.status, task->tk_pid); switch (req->a_res.status) { case NLM_LCK_GRANTED: case NLM_LCK_DENIED_GRACE_PERIOD: /* Everything's good */ break; case NLM_LCK_DENIED_NOLOCKS: dprintk("lockd: CANCEL failed (server has no locks)\n"); goto retry_cancel; default: printk(KERN_NOTICE "lockd: weird return %d for CANCEL call\n", req->a_res.status); } die: rpc_release_task(task); nlm_release_host(req->a_host); kfree(req); return; retry_cancel: nlm_rebind_host(req->a_host); rpc_restart_call(task); rpc_delay(task, 30 * HZ); return; }
static void nlmclnt_unlock_callback(struct rpc_task *task) { struct nlm_rqst *req = (struct nlm_rqst *) task->tk_calldata; int status = req->a_res.status; if (RPC_ASSASSINATED(task)) goto die; if (task->tk_status < 0) { dprintk("lockd: unlock failed (err = %d)\n", -task->tk_status); nlm_rebind_host(req->a_host); rpc_restart_call(task); return; } if (status != NLM_LCK_GRANTED && status != NLM_LCK_DENIED_GRACE_PERIOD) { printk("lockd: unexpected unlock status: %d\n", status); } die: rpc_release_task(task); }