aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2008-05-14 22:48:25 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-07-09 12:08:41 -0400
commit8b39f2b41033754e7ba669503d27268beb1b524a (patch)
tree50377c7d6c4918141f3b8bda5040477854458e7c /net
parent2116271a347d1181b5497602c2bfada1de8fd53b (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>
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/clnt.c9
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)