|
|
|
@ -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; |
|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -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); |
|
|
|
|