|
@@ -894,6 +894,7 @@ EXPORT_SYMBOL_GPL(rpc_bind_new_program);
|
|
|
void rpc_task_release_client(struct rpc_task *task)
|
|
|
{
|
|
|
struct rpc_clnt *clnt = task->tk_client;
|
|
|
+ struct rpc_xprt *xprt = task->tk_xprt;
|
|
|
|
|
|
if (clnt != NULL) {
|
|
|
/* Remove from client task list */
|
|
@@ -904,13 +905,22 @@ void rpc_task_release_client(struct rpc_task *task)
|
|
|
|
|
|
rpc_release_client(clnt);
|
|
|
}
|
|
|
+
|
|
|
+ if (xprt != NULL) {
|
|
|
+ task->tk_xprt = NULL;
|
|
|
+
|
|
|
+ xprt_put(xprt);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static
|
|
|
void rpc_task_set_client(struct rpc_task *task, struct rpc_clnt *clnt)
|
|
|
{
|
|
|
+
|
|
|
if (clnt != NULL) {
|
|
|
rpc_task_release_client(task);
|
|
|
+ if (task->tk_xprt == NULL)
|
|
|
+ task->tk_xprt = xprt_iter_get_next(&clnt->cl_xpi);
|
|
|
task->tk_client = clnt;
|
|
|
atomic_inc(&clnt->cl_count);
|
|
|
if (clnt->cl_softrtry)
|
|
@@ -2122,11 +2132,9 @@ call_timeout(struct rpc_task *task)
|
|
|
}
|
|
|
if (RPC_IS_SOFT(task)) {
|
|
|
if (clnt->cl_chatty) {
|
|
|
- rcu_read_lock();
|
|
|
printk(KERN_NOTICE "%s: server %s not responding, timed out\n",
|
|
|
clnt->cl_program->name,
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
- rcu_read_unlock();
|
|
|
+ task->tk_xprt->servername);
|
|
|
}
|
|
|
if (task->tk_flags & RPC_TASK_TIMEOUT)
|
|
|
rpc_exit(task, -ETIMEDOUT);
|
|
@@ -2138,11 +2146,9 @@ call_timeout(struct rpc_task *task)
|
|
|
if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) {
|
|
|
task->tk_flags |= RPC_CALL_MAJORSEEN;
|
|
|
if (clnt->cl_chatty) {
|
|
|
- rcu_read_lock();
|
|
|
printk(KERN_NOTICE "%s: server %s not responding, still trying\n",
|
|
|
clnt->cl_program->name,
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
- rcu_read_unlock();
|
|
|
+ task->tk_xprt->servername);
|
|
|
}
|
|
|
}
|
|
|
rpc_force_rebind(clnt);
|
|
@@ -2172,11 +2178,9 @@ call_decode(struct rpc_task *task)
|
|
|
|
|
|
if (task->tk_flags & RPC_CALL_MAJORSEEN) {
|
|
|
if (clnt->cl_chatty) {
|
|
|
- rcu_read_lock();
|
|
|
printk(KERN_NOTICE "%s: server %s OK\n",
|
|
|
clnt->cl_program->name,
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
- rcu_read_unlock();
|
|
|
+ task->tk_xprt->servername);
|
|
|
}
|
|
|
task->tk_flags &= ~RPC_CALL_MAJORSEEN;
|
|
|
}
|
|
@@ -2330,11 +2334,9 @@ rpc_verify_header(struct rpc_task *task)
|
|
|
task->tk_action = call_bind;
|
|
|
goto out_retry;
|
|
|
case RPC_AUTH_TOOWEAK:
|
|
|
- rcu_read_lock();
|
|
|
printk(KERN_NOTICE "RPC: server %s requires stronger "
|
|
|
"authentication.\n",
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
- rcu_read_unlock();
|
|
|
+ task->tk_xprt->servername);
|
|
|
break;
|
|
|
default:
|
|
|
dprintk("RPC: %5u %s: unknown auth error: %x\n",
|
|
@@ -2359,27 +2361,27 @@ rpc_verify_header(struct rpc_task *task)
|
|
|
case RPC_SUCCESS:
|
|
|
return p;
|
|
|
case RPC_PROG_UNAVAIL:
|
|
|
- dprintk_rcu("RPC: %5u %s: program %u is unsupported "
|
|
|
+ dprintk("RPC: %5u %s: program %u is unsupported "
|
|
|
"by server %s\n", task->tk_pid, __func__,
|
|
|
(unsigned int)clnt->cl_prog,
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
+ task->tk_xprt->servername);
|
|
|
error = -EPFNOSUPPORT;
|
|
|
goto out_err;
|
|
|
case RPC_PROG_MISMATCH:
|
|
|
- dprintk_rcu("RPC: %5u %s: program %u, version %u unsupported "
|
|
|
+ dprintk("RPC: %5u %s: program %u, version %u unsupported "
|
|
|
"by server %s\n", task->tk_pid, __func__,
|
|
|
(unsigned int)clnt->cl_prog,
|
|
|
(unsigned int)clnt->cl_vers,
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
+ task->tk_xprt->servername);
|
|
|
error = -EPROTONOSUPPORT;
|
|
|
goto out_err;
|
|
|
case RPC_PROC_UNAVAIL:
|
|
|
- dprintk_rcu("RPC: %5u %s: proc %s unsupported by program %u, "
|
|
|
+ dprintk("RPC: %5u %s: proc %s unsupported by program %u, "
|
|
|
"version %u on server %s\n",
|
|
|
task->tk_pid, __func__,
|
|
|
rpc_proc_name(task),
|
|
|
clnt->cl_prog, clnt->cl_vers,
|
|
|
- rcu_dereference(clnt->cl_xprt)->servername);
|
|
|
+ task->tk_xprt->servername);
|
|
|
error = -EOPNOTSUPP;
|
|
|
goto out_err;
|
|
|
case RPC_GARBAGE_ARGS:
|