diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-04-24 14:01:02 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-04-24 14:01:02 -0400 |
commit | 233607dbbc823caf685e778cabc49fb7f679900b (patch) | |
tree | 13840137ee10788061cbec60fcfe8ea4c274558e /net/sunrpc/clnt.c | |
parent | 3dc5063786b273f1aee545844f6bd4e9651ebffe (diff) | |
parent | b48633bd086d21f4a2a5bea96c7e6c7ba58eb60c (diff) |
Merge branch 'devel'
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 7b96ff38002..8945307556e 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -544,7 +544,7 @@ EXPORT_SYMBOL_GPL(rpc_run_task); | |||
544 | * @msg: RPC call parameters | 544 | * @msg: RPC call parameters |
545 | * @flags: RPC call flags | 545 | * @flags: RPC call flags |
546 | */ | 546 | */ |
547 | int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags) | 547 | int rpc_call_sync(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags) |
548 | { | 548 | { |
549 | struct rpc_task *task; | 549 | struct rpc_task *task; |
550 | struct rpc_task_setup task_setup_data = { | 550 | struct rpc_task_setup task_setup_data = { |
@@ -575,7 +575,7 @@ EXPORT_SYMBOL_GPL(rpc_call_sync); | |||
575 | * @data: user call data | 575 | * @data: user call data |
576 | */ | 576 | */ |
577 | int | 577 | int |
578 | rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags, | 578 | rpc_call_async(struct rpc_clnt *clnt, const struct rpc_message *msg, int flags, |
579 | const struct rpc_call_ops *tk_ops, void *data) | 579 | const struct rpc_call_ops *tk_ops, void *data) |
580 | { | 580 | { |
581 | struct rpc_task *task; | 581 | struct rpc_task *task; |
@@ -1062,7 +1062,7 @@ call_transmit(struct rpc_task *task) | |||
1062 | if (task->tk_msg.rpc_proc->p_decode != NULL) | 1062 | if (task->tk_msg.rpc_proc->p_decode != NULL) |
1063 | return; | 1063 | return; |
1064 | task->tk_action = rpc_exit_task; | 1064 | task->tk_action = rpc_exit_task; |
1065 | rpc_wake_up_task(task); | 1065 | rpc_wake_up_queued_task(&task->tk_xprt->pending, task); |
1066 | } | 1066 | } |
1067 | 1067 | ||
1068 | /* | 1068 | /* |
@@ -1116,7 +1116,8 @@ call_status(struct rpc_task *task) | |||
1116 | case -ETIMEDOUT: | 1116 | case -ETIMEDOUT: |
1117 | task->tk_action = call_timeout; | 1117 | task->tk_action = call_timeout; |
1118 | if (task->tk_client->cl_discrtry) | 1118 | if (task->tk_client->cl_discrtry) |
1119 | xprt_force_disconnect(task->tk_xprt); | 1119 | xprt_conditional_disconnect(task->tk_xprt, |
1120 | req->rq_connect_cookie); | ||
1120 | break; | 1121 | break; |
1121 | case -ECONNREFUSED: | 1122 | case -ECONNREFUSED: |
1122 | case -ENOTCONN: | 1123 | case -ENOTCONN: |
@@ -1168,6 +1169,11 @@ call_timeout(struct rpc_task *task) | |||
1168 | clnt->cl_protname, clnt->cl_server); | 1169 | clnt->cl_protname, clnt->cl_server); |
1169 | } | 1170 | } |
1170 | rpc_force_rebind(clnt); | 1171 | rpc_force_rebind(clnt); |
1172 | /* | ||
1173 | * Did our request time out due to an RPCSEC_GSS out-of-sequence | ||
1174 | * event? RFC2203 requires the server to drop all such requests. | ||
1175 | */ | ||
1176 | rpcauth_invalcred(task); | ||
1171 | 1177 | ||
1172 | retry: | 1178 | retry: |
1173 | clnt->cl_stats->rpcretrans++; | 1179 | clnt->cl_stats->rpcretrans++; |
@@ -1195,18 +1201,6 @@ call_decode(struct rpc_task *task) | |||
1195 | task->tk_flags &= ~RPC_CALL_MAJORSEEN; | 1201 | task->tk_flags &= ~RPC_CALL_MAJORSEEN; |
1196 | } | 1202 | } |
1197 | 1203 | ||
1198 | if (task->tk_status < 12) { | ||
1199 | if (!RPC_IS_SOFT(task)) { | ||
1200 | task->tk_action = call_bind; | ||
1201 | clnt->cl_stats->rpcretrans++; | ||
1202 | goto out_retry; | ||
1203 | } | ||
1204 | dprintk("RPC: %s: too small RPC reply size (%d bytes)\n", | ||
1205 | clnt->cl_protname, task->tk_status); | ||
1206 | task->tk_action = call_timeout; | ||
1207 | goto out_retry; | ||
1208 | } | ||
1209 | |||
1210 | /* | 1204 | /* |
1211 | * Ensure that we see all writes made by xprt_complete_rqst() | 1205 | * Ensure that we see all writes made by xprt_complete_rqst() |
1212 | * before it changed req->rq_received. | 1206 | * before it changed req->rq_received. |
@@ -1218,6 +1212,18 @@ call_decode(struct rpc_task *task) | |||
1218 | WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf, | 1212 | WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf, |
1219 | sizeof(req->rq_rcv_buf)) != 0); | 1213 | sizeof(req->rq_rcv_buf)) != 0); |
1220 | 1214 | ||
1215 | if (req->rq_rcv_buf.len < 12) { | ||
1216 | if (!RPC_IS_SOFT(task)) { | ||
1217 | task->tk_action = call_bind; | ||
1218 | clnt->cl_stats->rpcretrans++; | ||
1219 | goto out_retry; | ||
1220 | } | ||
1221 | dprintk("RPC: %s: too small RPC reply size (%d bytes)\n", | ||
1222 | clnt->cl_protname, task->tk_status); | ||
1223 | task->tk_action = call_timeout; | ||
1224 | goto out_retry; | ||
1225 | } | ||
1226 | |||
1221 | /* Verify the RPC header */ | 1227 | /* Verify the RPC header */ |
1222 | p = call_verify(task); | 1228 | p = call_verify(task); |
1223 | if (IS_ERR(p)) { | 1229 | if (IS_ERR(p)) { |
@@ -1236,10 +1242,14 @@ call_decode(struct rpc_task *task) | |||
1236 | task->tk_status); | 1242 | task->tk_status); |
1237 | return; | 1243 | return; |
1238 | out_retry: | 1244 | out_retry: |
1239 | req->rq_received = req->rq_private_buf.len = 0; | ||
1240 | task->tk_status = 0; | 1245 | task->tk_status = 0; |
1241 | if (task->tk_client->cl_discrtry) | 1246 | /* Note: call_verify() may have freed the RPC slot */ |
1242 | xprt_force_disconnect(task->tk_xprt); | 1247 | if (task->tk_rqstp == req) { |
1248 | req->rq_received = req->rq_rcv_buf.len = 0; | ||
1249 | if (task->tk_client->cl_discrtry) | ||
1250 | xprt_conditional_disconnect(task->tk_xprt, | ||
1251 | req->rq_connect_cookie); | ||
1252 | } | ||
1243 | } | 1253 | } |
1244 | 1254 | ||
1245 | /* | 1255 | /* |
@@ -1531,7 +1541,7 @@ void rpc_show_tasks(void) | |||
1531 | proc = -1; | 1541 | proc = -1; |
1532 | 1542 | ||
1533 | if (RPC_IS_QUEUED(t)) | 1543 | if (RPC_IS_QUEUED(t)) |
1534 | rpc_waitq = rpc_qname(t->u.tk_wait.rpc_waitq); | 1544 | rpc_waitq = rpc_qname(t->tk_waitqueue); |
1535 | 1545 | ||
1536 | printk("%5u %04d %04x %6d %8p %6d %8p %8ld %8s %8p %8p\n", | 1546 | printk("%5u %04d %04x %6d %8p %6d %8p %8ld %8s %8p %8p\n", |
1537 | t->tk_pid, proc, | 1547 | t->tk_pid, proc, |