mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
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: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
caa388f7e5
commit
f663507e29
|
@ -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);
|
||||
|
||||
transport->xprt_err = 0;
|
||||
clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
|
||||
clear_bit(XPRT_SOCK_WAKE_ERROR, &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)
|
|||
{
|
||||
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))
|
||||
goto out;
|
||||
return;
|
||||
sockerr = xchg(&transport->xprt_err, 0);
|
||||
if (sockerr < 0)
|
||||
if (sockerr < 0) {
|
||||
xprt_wake_pending_tasks(&transport->xprt, sockerr);
|
||||
out:
|
||||
mutex_unlock(&transport->recv_mutex);
|
||||
xs_tcp_force_close(&transport->xprt);
|
||||
}
|
||||
}
|
||||
|
||||
static void xs_wake_pending(struct sock_xprt *transport)
|
||||
|
|
Loading…
Reference in a new issue