Skip to content

Commit

Permalink
SUNRPC: Ensure xs_reset_transport() resets the close connection flags
Browse files Browse the repository at this point in the history
Otherwise, we may end up looping.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
  • Loading branch information
Trond Myklebust committed Feb 9, 2015
1 parent 76698b2 commit 6cc7e90
Showing 1 changed file with 13 additions and 16 deletions.
29 changes: 13 additions & 16 deletions net/sunrpc/xprtsock.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,10 +803,21 @@ static void xs_error_report(struct sock *sk)
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)
{
struct socket *sock = transport->sock;
struct sock *sk = transport->inet;
struct rpc_xprt *xprt = &transport->xprt;

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

xs_restore_old_callbacks(transport, sk);
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);
}

Expand All @@ -845,11 +857,6 @@ static void xs_close(struct rpc_xprt *xprt)
xs_reset_transport(transport);
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);
}

Expand Down Expand Up @@ -1455,16 +1462,6 @@ static void xs_tcp_cancel_linger_timeout(struct rpc_xprt *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)
{
xs_sock_reset_connection_flags(xprt);
Expand Down

0 comments on commit 6cc7e90

Please sign in to comment.