diff options
-rw-r--r-- | include/linux/sunrpc/sched.h | 2 | ||||
-rw-r--r-- | net/sunrpc/clnt.c | 11 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 2 |
3 files changed, 12 insertions, 3 deletions
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 401097781fc..1906782ec86 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
@@ -130,12 +130,14 @@ struct rpc_task_setup { | |||
130 | #define RPC_TASK_DYNAMIC 0x0080 /* task was kmalloc'ed */ | 130 | #define RPC_TASK_DYNAMIC 0x0080 /* task was kmalloc'ed */ |
131 | #define RPC_TASK_KILLED 0x0100 /* task was killed */ | 131 | #define RPC_TASK_KILLED 0x0100 /* task was killed */ |
132 | #define RPC_TASK_SOFT 0x0200 /* Use soft timeouts */ | 132 | #define RPC_TASK_SOFT 0x0200 /* Use soft timeouts */ |
133 | #define RPC_TASK_SOFTCONN 0x0400 /* Fail if can't connect */ | ||
133 | 134 | ||
134 | #define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC) | 135 | #define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC) |
135 | #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) | 136 | #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) |
136 | #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) | 137 | #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) |
137 | #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) | 138 | #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) |
138 | #define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) | 139 | #define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) |
140 | #define RPC_IS_SOFTCONN(t) ((t)->tk_flags & RPC_TASK_SOFTCONN) | ||
139 | 141 | ||
140 | #define RPC_TASK_RUNNING 0 | 142 | #define RPC_TASK_RUNNING 0 |
141 | #define RPC_TASK_QUEUED 1 | 143 | #define RPC_TASK_QUEUED 1 |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 7bcd931e06e..68a23583f44 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -1197,6 +1197,8 @@ call_transmit_status(struct rpc_task *task) | |||
1197 | default: | 1197 | default: |
1198 | dprint_status(task); | 1198 | dprint_status(task); |
1199 | xprt_end_transmit(task); | 1199 | xprt_end_transmit(task); |
1200 | rpc_task_force_reencode(task); | ||
1201 | break; | ||
1200 | /* | 1202 | /* |
1201 | * Special cases: if we've been waiting on the | 1203 | * Special cases: if we've been waiting on the |
1202 | * socket's write_space() callback, or if the | 1204 | * socket's write_space() callback, or if the |
@@ -1204,11 +1206,16 @@ call_transmit_status(struct rpc_task *task) | |||
1204 | * then hold onto the transport lock. | 1206 | * then hold onto the transport lock. |
1205 | */ | 1207 | */ |
1206 | case -ECONNREFUSED: | 1208 | case -ECONNREFUSED: |
1207 | case -ECONNRESET: | ||
1208 | case -ENOTCONN: | ||
1209 | case -EHOSTDOWN: | 1209 | case -EHOSTDOWN: |
1210 | case -EHOSTUNREACH: | 1210 | case -EHOSTUNREACH: |
1211 | case -ENETUNREACH: | 1211 | case -ENETUNREACH: |
1212 | if (RPC_IS_SOFTCONN(task)) { | ||
1213 | xprt_end_transmit(task); | ||
1214 | rpc_exit(task, task->tk_status); | ||
1215 | break; | ||
1216 | } | ||
1217 | case -ECONNRESET: | ||
1218 | case -ENOTCONN: | ||
1212 | case -EPIPE: | 1219 | case -EPIPE: |
1213 | rpc_task_force_reencode(task); | 1220 | rpc_task_force_reencode(task); |
1214 | } | 1221 | } |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 37c5475ba25..ff312f8b018 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -2033,7 +2033,7 @@ static void xs_connect(struct rpc_task *task) | |||
2033 | if (xprt_test_and_set_connecting(xprt)) | 2033 | if (xprt_test_and_set_connecting(xprt)) |
2034 | return; | 2034 | return; |
2035 | 2035 | ||
2036 | if (transport->sock != NULL) { | 2036 | if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) { |
2037 | dprintk("RPC: xs_connect delayed xprt %p for %lu " | 2037 | dprintk("RPC: xs_connect delayed xprt %p for %lu " |
2038 | "seconds\n", | 2038 | "seconds\n", |
2039 | xprt, xprt->reestablish_timeout / HZ); | 2039 | xprt, xprt->reestablish_timeout / HZ); |