• Calum Mackay's avatar
    lockd: don't use interval-based rebinding over TCP · 9b82d88d
    Calum Mackay authored
    NLM uses an interval-based rebinding, i.e. it clears the transport's
    binding under certain conditions if more than 60 seconds have elapsed
    since the connection was last bound.
    
    This rebinding is not necessary for an autobind RPC client over a
    connection-oriented protocol like TCP.
    
    It can also cause problems: it is possible for nlm_bind_host() to clear
    XPRT_BOUND whilst a connection worker is in the middle of trying to
    reconnect, after it had already been checked in xprt_connect().
    
    When the connection worker notices that XPRT_BOUND has been cleared
    under it, in xs_tcp_finish_connecting(), that results in:
    
    	xs_tcp_setup_socket: connect returned unhandled error -107
    
    Worse, it's possible that the two can get into lockstep, resulting in
    the same behaviour repeated indefinitely, with the above error every
    300 seconds, without ever recovering, and the connection never being
    established. This has been seen in practice, with a large number of NLM
    client tasks, following a server restart.
    
    The existing callers of nlm_bind_host & nlm_rebind_host should not need
    to force the rebind, for TCP, so restrict the interval-based rebinding
    to UDP only.
    
    For TCP, we will still rebind when needed, e.g. on timeout, and connection
    error (including closure), since connection-related errors on an existing
    connection, ECONNREFUSED when trying to connect, and rpc_check_timeout(),
    already unconditionally clear XPRT_BOUND.
    
    To avoid having to add the fix, and explanation, to both nlm_bind_host()
    and nlm_rebind_host(), remove the duplicate code from the former, and
    have it call the latter.
    
    Drop the dprintk, which adds no value over a trace.
    Signed-off-by: default avatarCalum Mackay <calum.mackay@oracle.com>
    Fixes: 35f5a422 ("SUNRPC: new interface to force an RPC rebind")
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
    9b82d88d
host.c 17.5 KB