• James Smart's avatar
    nvme-fc: fix io timeout to abort I/O · 52793d62
    James Smart authored
    Currently, an I/O timeout unconditionally invokes
    nvme_fc_error_recovery() which checks for LIVE or CONNECTING state.  If
    live, the routine resets the controller which initiates a reconnect -
    which is valid.  If CONNECTING, err_work is scheduled.  Err_work then
    calls the terminate_io routine, which also checks for CONNECTING and
    noops any further action on outstanding I/O.  The result is nothing
    happened to the timed out io.  As such, if the command was dropped on
    the wire, it will never timeout / complete, and the connect process
    will hang.
    
    Change the behavior of the io timeout routine to unconditionally abort
    the I/O.  I/O completion handling will note that an io failed due to an
    abort and will terminate the connection / association as needed.  If the
    abort was unable to happen, continue with a call to
    nvme_fc_error_recovery(). To ensure something different happens in
    nvme_fc_error_recovery() rework it so at it will abort all I/Os on the
    association to force a failure.
    
    As I/O aborts now may occur outside of delete_association, counting for
    completion must be wary and only count those aborted during
    delete_association when TERMIO is set on the controller.
    Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    52793d62
fc.c 106 KB