Commit f663507e authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Force close the socket when a hard error is reported

Fix up xs_wake_error() to close the socket when a hard error is being
reported. Usually, that means an ECONNRESET was received on a connection
attempt.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent caa388f7
...@@ -1181,6 +1181,7 @@ static void xs_sock_reset_state_flags(struct rpc_xprt *xprt) ...@@ -1181,6 +1181,7 @@ static void xs_sock_reset_state_flags(struct rpc_xprt *xprt)
{ {
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
transport->xprt_err = 0;
clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state); clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state); clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state);
clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state); clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state);
...@@ -2772,18 +2773,13 @@ static void xs_wake_error(struct sock_xprt *transport) ...@@ -2772,18 +2773,13 @@ static void xs_wake_error(struct sock_xprt *transport)
{ {
int sockerr; int sockerr;
if (!test_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state))
return;
mutex_lock(&transport->recv_mutex);
if (transport->sock == NULL)
goto out;
if (!test_and_clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state)) if (!test_and_clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state))
goto out; return;
sockerr = xchg(&transport->xprt_err, 0); sockerr = xchg(&transport->xprt_err, 0);
if (sockerr < 0) if (sockerr < 0) {
xprt_wake_pending_tasks(&transport->xprt, sockerr); xprt_wake_pending_tasks(&transport->xprt, sockerr);
out: xs_tcp_force_close(&transport->xprt);
mutex_unlock(&transport->recv_mutex); }
} }
static void xs_wake_pending(struct sock_xprt *transport) static void xs_wake_pending(struct sock_xprt *transport)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment