Skip to content

Commit f663507

Browse files
author
Trond Myklebust
committed
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 <[email protected]>
1 parent caa388f commit f663507

File tree

1 file changed

+5
-9
lines changed

1 file changed

+5
-9
lines changed

net/sunrpc/xprtsock.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,7 @@ static void xs_sock_reset_state_flags(struct rpc_xprt *xprt)
11811181
{
11821182
struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
11831183

1184+
transport->xprt_err = 0;
11841185
clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
11851186
clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state);
11861187
clear_bit(XPRT_SOCK_WAKE_WRITE, &transport->sock_state);
@@ -2772,18 +2773,13 @@ static void xs_wake_error(struct sock_xprt *transport)
27722773
{
27732774
int sockerr;
27742775

2775-
if (!test_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state))
2776-
return;
2777-
mutex_lock(&transport->recv_mutex);
2778-
if (transport->sock == NULL)
2779-
goto out;
27802776
if (!test_and_clear_bit(XPRT_SOCK_WAKE_ERROR, &transport->sock_state))
2781-
goto out;
2777+
return;
27822778
sockerr = xchg(&transport->xprt_err, 0);
2783-
if (sockerr < 0)
2779+
if (sockerr < 0) {
27842780
xprt_wake_pending_tasks(&transport->xprt, sockerr);
2785-
out:
2786-
mutex_unlock(&transport->recv_mutex);
2781+
xs_tcp_force_close(&transport->xprt);
2782+
}
27872783
}
27882784

27892785
static void xs_wake_pending(struct sock_xprt *transport)

0 commit comments

Comments
 (0)