diff options
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 61c3abeaccae..6ab4cbd8a901 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -511,7 +511,7 @@ rpc_call_setup(struct rpc_task *task, struct rpc_message *msg, int flags) | |||
511 | if (task->tk_status == 0) | 511 | if (task->tk_status == 0) |
512 | task->tk_action = call_start; | 512 | task->tk_action = call_start; |
513 | else | 513 | else |
514 | task->tk_action = NULL; | 514 | task->tk_action = rpc_exit_task; |
515 | } | 515 | } |
516 | 516 | ||
517 | void | 517 | void |
@@ -892,7 +892,7 @@ call_transmit(struct rpc_task *task) | |||
892 | if (task->tk_status < 0) | 892 | if (task->tk_status < 0) |
893 | return; | 893 | return; |
894 | if (!task->tk_msg.rpc_proc->p_decode) { | 894 | if (!task->tk_msg.rpc_proc->p_decode) { |
895 | task->tk_action = NULL; | 895 | task->tk_action = rpc_exit_task; |
896 | rpc_wake_up_task(task); | 896 | rpc_wake_up_task(task); |
897 | } | 897 | } |
898 | return; | 898 | return; |
@@ -1039,13 +1039,14 @@ call_decode(struct rpc_task *task) | |||
1039 | sizeof(req->rq_rcv_buf)) != 0); | 1039 | sizeof(req->rq_rcv_buf)) != 0); |
1040 | 1040 | ||
1041 | /* Verify the RPC header */ | 1041 | /* Verify the RPC header */ |
1042 | if (!(p = call_verify(task))) { | 1042 | p = call_verify(task); |
1043 | if (task->tk_action == NULL) | 1043 | if (IS_ERR(p)) { |
1044 | return; | 1044 | if (p == ERR_PTR(-EAGAIN)) |
1045 | goto out_retry; | 1045 | goto out_retry; |
1046 | return; | ||
1046 | } | 1047 | } |
1047 | 1048 | ||
1048 | task->tk_action = NULL; | 1049 | task->tk_action = rpc_exit_task; |
1049 | 1050 | ||
1050 | if (decode) | 1051 | if (decode) |
1051 | task->tk_status = rpcauth_unwrap_resp(task, decode, req, p, | 1052 | task->tk_status = rpcauth_unwrap_resp(task, decode, req, p, |
@@ -1138,7 +1139,7 @@ call_verify(struct rpc_task *task) | |||
1138 | 1139 | ||
1139 | if ((n = ntohl(*p++)) != RPC_REPLY) { | 1140 | if ((n = ntohl(*p++)) != RPC_REPLY) { |
1140 | printk(KERN_WARNING "call_verify: not an RPC reply: %x\n", n); | 1141 | printk(KERN_WARNING "call_verify: not an RPC reply: %x\n", n); |
1141 | goto out_retry; | 1142 | goto out_garbage; |
1142 | } | 1143 | } |
1143 | if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) { | 1144 | if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) { |
1144 | if (--len < 0) | 1145 | if (--len < 0) |
@@ -1168,7 +1169,7 @@ call_verify(struct rpc_task *task) | |||
1168 | task->tk_pid); | 1169 | task->tk_pid); |
1169 | rpcauth_invalcred(task); | 1170 | rpcauth_invalcred(task); |
1170 | task->tk_action = call_refresh; | 1171 | task->tk_action = call_refresh; |
1171 | return NULL; | 1172 | goto out_retry; |
1172 | case RPC_AUTH_BADCRED: | 1173 | case RPC_AUTH_BADCRED: |
1173 | case RPC_AUTH_BADVERF: | 1174 | case RPC_AUTH_BADVERF: |
1174 | /* possibly garbled cred/verf? */ | 1175 | /* possibly garbled cred/verf? */ |
@@ -1178,7 +1179,7 @@ call_verify(struct rpc_task *task) | |||
1178 | dprintk("RPC: %4d call_verify: retry garbled creds\n", | 1179 | dprintk("RPC: %4d call_verify: retry garbled creds\n", |
1179 | task->tk_pid); | 1180 | task->tk_pid); |
1180 | task->tk_action = call_bind; | 1181 | task->tk_action = call_bind; |
1181 | return NULL; | 1182 | goto out_retry; |
1182 | case RPC_AUTH_TOOWEAK: | 1183 | case RPC_AUTH_TOOWEAK: |
1183 | printk(KERN_NOTICE "call_verify: server requires stronger " | 1184 | printk(KERN_NOTICE "call_verify: server requires stronger " |
1184 | "authentication.\n"); | 1185 | "authentication.\n"); |
@@ -1193,7 +1194,7 @@ call_verify(struct rpc_task *task) | |||
1193 | } | 1194 | } |
1194 | if (!(p = rpcauth_checkverf(task, p))) { | 1195 | if (!(p = rpcauth_checkverf(task, p))) { |
1195 | printk(KERN_WARNING "call_verify: auth check failed\n"); | 1196 | printk(KERN_WARNING "call_verify: auth check failed\n"); |
1196 | goto out_retry; /* bad verifier, retry */ | 1197 | goto out_garbage; /* bad verifier, retry */ |
1197 | } | 1198 | } |
1198 | len = p - (u32 *)iov->iov_base - 1; | 1199 | len = p - (u32 *)iov->iov_base - 1; |
1199 | if (len < 0) | 1200 | if (len < 0) |
@@ -1230,23 +1231,24 @@ call_verify(struct rpc_task *task) | |||
1230 | /* Also retry */ | 1231 | /* Also retry */ |
1231 | } | 1232 | } |
1232 | 1233 | ||
1233 | out_retry: | 1234 | out_garbage: |
1234 | task->tk_client->cl_stats->rpcgarbage++; | 1235 | task->tk_client->cl_stats->rpcgarbage++; |
1235 | if (task->tk_garb_retry) { | 1236 | if (task->tk_garb_retry) { |
1236 | task->tk_garb_retry--; | 1237 | task->tk_garb_retry--; |
1237 | dprintk("RPC %s: retrying %4d\n", __FUNCTION__, task->tk_pid); | 1238 | dprintk("RPC %s: retrying %4d\n", __FUNCTION__, task->tk_pid); |
1238 | task->tk_action = call_bind; | 1239 | task->tk_action = call_bind; |
1239 | return NULL; | 1240 | out_retry: |
1241 | return ERR_PTR(-EAGAIN); | ||
1240 | } | 1242 | } |
1241 | printk(KERN_WARNING "RPC %s: retry failed, exit EIO\n", __FUNCTION__); | 1243 | printk(KERN_WARNING "RPC %s: retry failed, exit EIO\n", __FUNCTION__); |
1242 | out_eio: | 1244 | out_eio: |
1243 | error = -EIO; | 1245 | error = -EIO; |
1244 | out_err: | 1246 | out_err: |
1245 | rpc_exit(task, error); | 1247 | rpc_exit(task, error); |
1246 | return NULL; | 1248 | return ERR_PTR(error); |
1247 | out_overflow: | 1249 | out_overflow: |
1248 | printk(KERN_WARNING "RPC %s: server reply was truncated.\n", __FUNCTION__); | 1250 | printk(KERN_WARNING "RPC %s: server reply was truncated.\n", __FUNCTION__); |
1249 | goto out_retry; | 1251 | goto out_garbage; |
1250 | } | 1252 | } |
1251 | 1253 | ||
1252 | static int rpcproc_encode_null(void *rqstp, u32 *data, void *obj) | 1254 | static int rpcproc_encode_null(void *rqstp, u32 *data, void *obj) |