Re: [PATCH 1/1] SUNRPC: Ensure XPRT_CONNECTED is cleared while handling TCP RST

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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






[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux