• Markus Pargmann's avatar
    nbd: Fix timeout detection · 7e2893a1
    Markus Pargmann authored
    At the moment the nbd timeout just detects hanging tcp operations. This
    is not enough to detect a hanging or bad connection as expected of a
    timeout.
    
    This patch redesigns the timeout detection to include some more cases.
    The timeout is now in relation to replies from the server. If the server
    does not send replies within the timeout the connection will be shut
    down.
    
    The patch adds a continous timer 'timeout_timer' that is setup in one of
    two cases:
     - The request list is empty and we are sending the first request out to
       the server. We want to have a reply within the given timeout,
       otherwise we consider the connection to be dead.
     - A server response was received. This means the server is still
       communicating with us. The timer is reset to the timeout value.
    
    The timer is not stopped if the list becomes empty. It will just trigger
    a timeout which will directly leave the handling routine again as the
    request list is empty.
    
    The whole patch does not use any additional explicit locking. The
    list_empty() calls are safe to be used concurrently. The timer is locked
    internally as we just use mod_timer and del_timer_sync().
    
    The patch is based on the idea of Michal Belczyk with a previous
    different implementation.
    
    Cc: Michal Belczyk <belczyk@bsd.krakow.pl>
    Cc: Hermann Lauer <Hermann.Lauer@iwr.uni-heidelberg.de>
    Signed-off-by: default avatarMarkus Pargmann <mpa@pengutronix.de>
    Tested-by: default avatarHermann Lauer <Hermann.Lauer@iwr.uni-heidelberg.de>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    7e2893a1
nbd.c 22.2 KB