diff options
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 57d344cf2256..8d83f9d48713 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -436,7 +436,9 @@ void rpc_killall_tasks(struct rpc_clnt *clnt) | |||
436 | if (!(rovr->tk_flags & RPC_TASK_KILLED)) { | 436 | if (!(rovr->tk_flags & RPC_TASK_KILLED)) { |
437 | rovr->tk_flags |= RPC_TASK_KILLED; | 437 | rovr->tk_flags |= RPC_TASK_KILLED; |
438 | rpc_exit(rovr, -EIO); | 438 | rpc_exit(rovr, -EIO); |
439 | rpc_wake_up_queued_task(rovr->tk_waitqueue, rovr); | 439 | if (RPC_IS_QUEUED(rovr)) |
440 | rpc_wake_up_queued_task(rovr->tk_waitqueue, | ||
441 | rovr); | ||
440 | } | 442 | } |
441 | } | 443 | } |
442 | spin_unlock(&clnt->cl_lock); | 444 | spin_unlock(&clnt->cl_lock); |
@@ -597,6 +599,14 @@ void rpc_task_set_client(struct rpc_task *task, struct rpc_clnt *clnt) | |||
597 | } | 599 | } |
598 | } | 600 | } |
599 | 601 | ||
602 | void rpc_task_reset_client(struct rpc_task *task, struct rpc_clnt *clnt) | ||
603 | { | ||
604 | rpc_task_release_client(task); | ||
605 | rpc_task_set_client(task, clnt); | ||
606 | } | ||
607 | EXPORT_SYMBOL_GPL(rpc_task_reset_client); | ||
608 | |||
609 | |||
600 | static void | 610 | static void |
601 | rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg) | 611 | rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg) |
602 | { | 612 | { |
@@ -636,12 +646,6 @@ struct rpc_task *rpc_run_task(const struct rpc_task_setup *task_setup_data) | |||
636 | rpc_task_set_client(task, task_setup_data->rpc_client); | 646 | rpc_task_set_client(task, task_setup_data->rpc_client); |
637 | rpc_task_set_rpc_message(task, task_setup_data->rpc_message); | 647 | rpc_task_set_rpc_message(task, task_setup_data->rpc_message); |
638 | 648 | ||
639 | if (task->tk_status != 0) { | ||
640 | int ret = task->tk_status; | ||
641 | rpc_put_task(task); | ||
642 | return ERR_PTR(ret); | ||
643 | } | ||
644 | |||
645 | if (task->tk_action == NULL) | 649 | if (task->tk_action == NULL) |
646 | rpc_call_start(task); | 650 | rpc_call_start(task); |
647 | 651 | ||
@@ -1504,7 +1508,10 @@ call_timeout(struct rpc_task *task) | |||
1504 | if (clnt->cl_chatty) | 1508 | if (clnt->cl_chatty) |
1505 | printk(KERN_NOTICE "%s: server %s not responding, timed out\n", | 1509 | printk(KERN_NOTICE "%s: server %s not responding, timed out\n", |
1506 | clnt->cl_protname, clnt->cl_server); | 1510 | clnt->cl_protname, clnt->cl_server); |
1507 | rpc_exit(task, -EIO); | 1511 | if (task->tk_flags & RPC_TASK_TIMEOUT) |
1512 | rpc_exit(task, -ETIMEDOUT); | ||
1513 | else | ||
1514 | rpc_exit(task, -EIO); | ||
1508 | return; | 1515 | return; |
1509 | } | 1516 | } |
1510 | 1517 | ||