diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-08-31 15:44:52 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-09-22 23:25:00 -0400 |
commit | da45828e2835057045150b318c4fbe9bb91f18dd (patch) | |
tree | b04b3ae7fe4cf79c8af2f399f44d5db65995ac55 /net | |
parent | 76303992b4701124f4cd0791ae2049ab4332f02c (diff) |
SUNRPC: Clean up soft task error handling
- Ensure that the task aborts the RPC call only when it has actually timed out.
- Ensure that req->rq_majortimeo is initialised correctly.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/clnt.c | 34 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 8 |
2 files changed, 15 insertions, 27 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 355e7863c0aa..ceadb728f0da 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -863,15 +863,11 @@ call_bind_status(struct rpc_task *task) | |||
863 | dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n", | 863 | dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n", |
864 | task->tk_pid); | 864 | task->tk_pid); |
865 | rpc_delay(task, 3*HZ); | 865 | rpc_delay(task, 3*HZ); |
866 | goto retry_bind; | 866 | goto retry_timeout; |
867 | case -ETIMEDOUT: | 867 | case -ETIMEDOUT: |
868 | dprintk("RPC: %4d rpcbind request timed out\n", | 868 | dprintk("RPC: %4d rpcbind request timed out\n", |
869 | task->tk_pid); | 869 | task->tk_pid); |
870 | if (RPC_IS_SOFT(task)) { | 870 | goto retry_timeout; |
871 | status = -EIO; | ||
872 | break; | ||
873 | } | ||
874 | goto retry_bind; | ||
875 | case -EPFNOSUPPORT: | 871 | case -EPFNOSUPPORT: |
876 | dprintk("RPC: %4d remote rpcbind service unavailable\n", | 872 | dprintk("RPC: %4d remote rpcbind service unavailable\n", |
877 | task->tk_pid); | 873 | task->tk_pid); |
@@ -884,16 +880,13 @@ call_bind_status(struct rpc_task *task) | |||
884 | dprintk("RPC: %4d unrecognized rpcbind error (%d)\n", | 880 | dprintk("RPC: %4d unrecognized rpcbind error (%d)\n", |
885 | task->tk_pid, -task->tk_status); | 881 | task->tk_pid, -task->tk_status); |
886 | status = -EIO; | 882 | status = -EIO; |
887 | break; | ||
888 | } | 883 | } |
889 | 884 | ||
890 | rpc_exit(task, status); | 885 | rpc_exit(task, status); |
891 | return; | 886 | return; |
892 | 887 | ||
893 | retry_bind: | 888 | retry_timeout: |
894 | task->tk_status = 0; | 889 | task->tk_action = call_timeout; |
895 | task->tk_action = call_bind; | ||
896 | return; | ||
897 | } | 890 | } |
898 | 891 | ||
899 | /* | 892 | /* |
@@ -941,14 +934,16 @@ call_connect_status(struct rpc_task *task) | |||
941 | 934 | ||
942 | switch (status) { | 935 | switch (status) { |
943 | case -ENOTCONN: | 936 | case -ENOTCONN: |
944 | case -ETIMEDOUT: | ||
945 | case -EAGAIN: | 937 | case -EAGAIN: |
946 | task->tk_action = call_bind; | 938 | task->tk_action = call_bind; |
947 | break; | 939 | if (!RPC_IS_SOFT(task)) |
948 | default: | 940 | return; |
949 | rpc_exit(task, -EIO); | 941 | /* if soft mounted, test if we've timed out */ |
950 | break; | 942 | case -ETIMEDOUT: |
943 | task->tk_action = call_timeout; | ||
944 | return; | ||
951 | } | 945 | } |
946 | rpc_exit(task, -EIO); | ||
952 | } | 947 | } |
953 | 948 | ||
954 | /* | 949 | /* |
@@ -1057,7 +1052,6 @@ call_status(struct rpc_task *task) | |||
1057 | printk("%s: RPC call returned error %d\n", | 1052 | printk("%s: RPC call returned error %d\n", |
1058 | clnt->cl_protname, -status); | 1053 | clnt->cl_protname, -status); |
1059 | rpc_exit(task, status); | 1054 | rpc_exit(task, status); |
1060 | break; | ||
1061 | } | 1055 | } |
1062 | } | 1056 | } |
1063 | 1057 | ||
@@ -1125,10 +1119,10 @@ call_decode(struct rpc_task *task) | |||
1125 | clnt->cl_stats->rpcretrans++; | 1119 | clnt->cl_stats->rpcretrans++; |
1126 | goto out_retry; | 1120 | goto out_retry; |
1127 | } | 1121 | } |
1128 | printk(KERN_WARNING "%s: too small RPC reply size (%d bytes)\n", | 1122 | dprintk("%s: too small RPC reply size (%d bytes)\n", |
1129 | clnt->cl_protname, task->tk_status); | 1123 | clnt->cl_protname, task->tk_status); |
1130 | rpc_exit(task, -EIO); | 1124 | task->tk_action = call_timeout; |
1131 | return; | 1125 | goto out_retry; |
1132 | } | 1126 | } |
1133 | 1127 | ||
1134 | /* | 1128 | /* |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index e4f64fb58ff2..a85f82baefc1 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -585,13 +585,6 @@ static void xprt_connect_status(struct rpc_task *task) | |||
585 | task->tk_pid, -task->tk_status, task->tk_client->cl_server); | 585 | task->tk_pid, -task->tk_status, task->tk_client->cl_server); |
586 | xprt_release_write(xprt, task); | 586 | xprt_release_write(xprt, task); |
587 | task->tk_status = -EIO; | 587 | task->tk_status = -EIO; |
588 | return; | ||
589 | } | ||
590 | |||
591 | /* if soft mounted, just cause this RPC to fail */ | ||
592 | if (RPC_IS_SOFT(task)) { | ||
593 | xprt_release_write(xprt, task); | ||
594 | task->tk_status = -EIO; | ||
595 | } | 588 | } |
596 | } | 589 | } |
597 | 590 | ||
@@ -829,6 +822,7 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) | |||
829 | req->rq_bufsize = 0; | 822 | req->rq_bufsize = 0; |
830 | req->rq_xid = xprt_alloc_xid(xprt); | 823 | req->rq_xid = xprt_alloc_xid(xprt); |
831 | req->rq_release_snd_buf = NULL; | 824 | req->rq_release_snd_buf = NULL; |
825 | xprt_reset_majortimeo(req); | ||
832 | dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid, | 826 | dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid, |
833 | req, ntohl(req->rq_xid)); | 827 | req, ntohl(req->rq_xid)); |
834 | } | 828 | } |