mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +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
1 changed files with 5 additions and 9 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue