/* * 1. Reserve an RPC call slot */ static void call_reserve(struct rpc_task *task) { struct rpc_clnt *clnt = task->tk_client; dprintk("RPC: %4d call_reserve\n", task->tk_pid); if (!clnt->cl_port) { printk(KERN_NOTICE "%s: couldn't bind to server %s - %s.\n", clnt->cl_protname, clnt->cl_server, clnt->cl_softrtry? "giving up" : "retrying"); if (!clnt->cl_softrtry) { rpc_delay(task, 5*HZ); return; } rpc_exit(task, -EIO); return; } if (!rpcauth_uptodatecred(task)) { task->tk_action = call_refresh; return; } task->tk_action = call_reserveresult; task->tk_timeout = clnt->cl_timeout.to_resrvval; task->tk_status = 0; clnt->cl_stats->rpccnt++; xprt_reserve(task); }
/* * 1b. Grok the result of xprt_reserve() */ static void call_reserveresult(struct rpc_task *task) { dprintk("RPC: %4d call_reserveresult (status %d)\n", task->tk_pid, task->tk_status); /* * After a call to xprt_reserve(), we must have either * a request slot or else an error status. */ if ((task->tk_status >= 0 && !task->tk_rqstp) || (task->tk_status < 0 && task->tk_rqstp)) printk("call_reserveresult: status=%d, request=%p??\n", task->tk_status, task->tk_rqstp); if (task->tk_status >= 0) { task->tk_action = call_allocate; goto out; } else if (task->tk_status == -EAGAIN) { task->tk_timeout = task->tk_client->cl_timeout.to_resrvval; task->tk_status = 0; xprt_reserve(task); goto out; } else if (task->tk_status == -ETIMEDOUT) { dprintk("RPC: task timed out\n"); task->tk_action = call_timeout; goto out; } else { task->tk_action = NULL; } if (!task->tk_rqstp) { printk("RPC: task has no request, exit EIO\n"); rpc_exit(task, -EIO); } out: return; }
/* * 1. Reserve an RPC call slot */ static void call_reserve(struct rpc_task *task) { struct rpc_clnt *clnt = task->tk_client; if (task->tk_msg.rpc_proc > clnt->cl_maxproc) { printk(KERN_WARNING "%s (vers %d): bad procedure number %d\n", clnt->cl_protname, clnt->cl_vers, task->tk_msg.rpc_proc); rpc_exit(task, -EIO); return; } dprintk("RPC: %4d call_reserve\n", task->tk_pid); if (!rpcauth_uptodatecred(task)) { task->tk_action = call_refresh; return; } task->tk_status = 0; task->tk_action = call_reserveresult; task->tk_timeout = clnt->cl_timeout.to_resrvval; clnt->cl_stats->rpccnt++; xprt_reserve(task); }