Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cc7e908 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Ensure xs_reset_transport() resets the close connection flags



Otherwise, we may end up looping.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 76698b23
Loading
Loading
Loading
Loading
+13 −16
Original line number Original line Diff line number Diff line
@@ -803,10 +803,21 @@ static void xs_error_report(struct sock *sk)
	read_unlock_bh(&sk->sk_callback_lock);
	read_unlock_bh(&sk->sk_callback_lock);
}
}


static void xs_sock_reset_connection_flags(struct rpc_xprt *xprt)
{
	smp_mb__before_atomic();
	clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
	clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
	clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
	clear_bit(XPRT_CLOSING, &xprt->state);
	smp_mb__after_atomic();
}

static void xs_reset_transport(struct sock_xprt *transport)
static void xs_reset_transport(struct sock_xprt *transport)
{
{
	struct socket *sock = transport->sock;
	struct socket *sock = transport->sock;
	struct sock *sk = transport->inet;
	struct sock *sk = transport->inet;
	struct rpc_xprt *xprt = &transport->xprt;


	if (sk == NULL)
	if (sk == NULL)
		return;
		return;
@@ -819,8 +830,9 @@ static void xs_reset_transport(struct sock_xprt *transport)


	xs_restore_old_callbacks(transport, sk);
	xs_restore_old_callbacks(transport, sk);
	write_unlock_bh(&sk->sk_callback_lock);
	write_unlock_bh(&sk->sk_callback_lock);
	xs_sock_reset_connection_flags(xprt);


	trace_rpc_socket_close(&transport->xprt, sock);
	trace_rpc_socket_close(xprt, sock);
	sock_release(sock);
	sock_release(sock);
}
}


@@ -845,11 +857,6 @@ static void xs_close(struct rpc_xprt *xprt)
	xs_reset_transport(transport);
	xs_reset_transport(transport);
	xprt->reestablish_timeout = 0;
	xprt->reestablish_timeout = 0;


	smp_mb__before_atomic();
	clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
	clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
	clear_bit(XPRT_CLOSING, &xprt->state);
	smp_mb__after_atomic();
	xprt_disconnect_done(xprt);
	xprt_disconnect_done(xprt);
}
}


@@ -1455,16 +1462,6 @@ static void xs_tcp_cancel_linger_timeout(struct rpc_xprt *xprt)
	xprt_clear_connecting(xprt);
	xprt_clear_connecting(xprt);
}
}


static void xs_sock_reset_connection_flags(struct rpc_xprt *xprt)
{
	smp_mb__before_atomic();
	clear_bit(XPRT_CONNECTION_ABORT, &xprt->state);
	clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
	clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
	clear_bit(XPRT_CLOSING, &xprt->state);
	smp_mb__after_atomic();
}

static void xs_sock_mark_closed(struct rpc_xprt *xprt)
static void xs_sock_mark_closed(struct rpc_xprt *xprt)
{
{
	xs_sock_reset_connection_flags(xprt);
	xs_sock_reset_connection_flags(xprt);