diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-05-14 22:48:25 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-07-09 12:08:41 -0400 |
commit | 8b39f2b41033754e7ba669503d27268beb1b524a (patch) | |
tree | 50377c7d6c4918141f3b8bda5040477854458e7c | |
parent | 2116271a347d1181b5497602c2bfada1de8fd53b (diff) |
SUNRPC: Ensure we exit early in case of an encode error
All errors from call_encode(), with exception of EAGAIN are fatal, so we
should immediately return instead of proceeding to xprt_transmit().
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | net/sunrpc/clnt.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 8945307556ec..9503b4c177d2 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -890,7 +890,6 @@ call_encode(struct rpc_task *task) | |||
890 | task->tk_msg.rpc_argp); | 890 | task->tk_msg.rpc_argp); |
891 | if (task->tk_status == -ENOMEM) { | 891 | if (task->tk_status == -ENOMEM) { |
892 | /* XXX: Is this sane? */ | 892 | /* XXX: Is this sane? */ |
893 | rpc_delay(task, 3*HZ); | ||
894 | task->tk_status = -EAGAIN; | 893 | task->tk_status = -EAGAIN; |
895 | } | 894 | } |
896 | } | 895 | } |
@@ -1048,8 +1047,14 @@ call_transmit(struct rpc_task *task) | |||
1048 | BUG_ON(task->tk_rqstp->rq_bytes_sent != 0); | 1047 | BUG_ON(task->tk_rqstp->rq_bytes_sent != 0); |
1049 | call_encode(task); | 1048 | call_encode(task); |
1050 | /* Did the encode result in an error condition? */ | 1049 | /* Did the encode result in an error condition? */ |
1051 | if (task->tk_status != 0) | 1050 | if (task->tk_status != 0) { |
1051 | /* Was the error nonfatal? */ | ||
1052 | if (task->tk_status == -EAGAIN) | ||
1053 | rpc_delay(task, HZ >> 4); | ||
1054 | else | ||
1055 | rpc_exit(task, task->tk_status); | ||
1052 | return; | 1056 | return; |
1057 | } | ||
1053 | } | 1058 | } |
1054 | xprt_transmit(task); | 1059 | xprt_transmit(task); |
1055 | if (task->tk_status < 0) | 1060 | if (task->tk_status < 0) |