On Wed, 2018-12-12 at 08:51 -0500, Dave Wysochanski wrote: > 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: Hi Dave, This isn't needed for 4.20 or newer because call_transmit() will now always call xprt_end_transmit(). I suggest that a stable fix do something similar (perhaps conditional on the error returned by xprt_transmit()?). Cheers Trond -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx