Commit f663507e authored by Trond Myklebust's avatar Trond Myklebust
Browse files

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
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -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)