nvme-fc: fix io timeout to abort I/O
authorJames Smart <james.smart@broadcom.com>
Fri, 16 Oct 2020 21:06:27 +0000 (14:06 -0700)
committerChristoph Hellwig <hch@lst.de>
Fri, 23 Oct 2020 10:52:16 +0000 (12:52 +0200)
commit52793d62a696e9188092eb0817fb1219ee5729ff
treee0b97d704070b87dde2bc94c29131f337a80c489
parent150dfb6c834c9e0e92db7794530b09fd2b9f05c8
nvme-fc: fix io timeout to abort I/O

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: James Smart <james.smart@broadcom.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/fc.c