Commit 9b30889c548a changed the handling of TCP_CLOSE inside xs_tcp_state_change. Prior to this change, the XPRT_CONNECTED bit was cleared unconditionally inside xprt_disconnect_done, similar to the handling of TCP_CLOSE_WAIT. After the change the clearing of XPRT_CONNECTED depends on successfully queueing a work based xprt_autoclose which depends on XPRT_LOCKED and may not happen. This is significant in the case of an unexpected RST from the server, as the client will only see xs_tcp_state_change called with sk_state == TCP_CLOSE. Restore the unconditional clear_bit on XPRT_CONNECTED while handling TCP_CLOSE and make it consistent with handling TCP_CLOSE_WAIT. Signed-off-by: Dave Wysochanski <dwysocha@xxxxxxxxxx> --- net/sunrpc/xprtsock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 8a5e823e0b33..b9789036051d 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -1492,6 +1492,7 @@ static void xs_tcp_state_change(struct sock *sk) if (sk->sk_err) xprt_wake_pending_tasks(xprt, -sk->sk_err); /* Trigger the socket release */ + clear_bit(XPRT_CONNECTED, &xprt->state); xs_tcp_force_close(xprt); } out: -- 2.14.4