bdev/nvme: Call failover() instead of reset() if I/O qpair gets error first

Previously, only if admin qpair gets error, bdev_nvme_failover() was
called.

However, I/O qpair may get error earlier than admin qpair. In this case,
bdev_nvme_failover() was called but reset was already in progress. So
bdev_nvme_failover() returned without doing anything.

bdev_nvme_reset_complete() executes bdev_nvme_failover() if reset
failed. However the test time of test/nvmf/host/failover.sh was very
short. Timeout came before trying bdev_nvme_failover().

We can replace other bdev_nvme_reset() calls by bdev_nvme_failover()
but this patch focuses on the critical case.

Fixes issue #2128.

Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I68f54bbf54f92343aa56ae41f2b4cd92421c4bbb
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12295
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Shuhei Matsumoto 2022-04-19 10:27:45 +09:00 committed by Tomasz Zawadzki
parent c20e41cd38
commit 8cd418883d

View File

@ -1173,7 +1173,7 @@ bdev_nvme_disconnected_qpair_cb(struct spdk_nvme_qpair *qpair, void *poll_group_
} else {
/* qpair was disconnected unexpectedly. Reset controller for recovery. */
SPDK_NOTICELOG("qpair %p was disconnected and freed. reset controller.\n", qpair);
bdev_nvme_reset(nvme_qpair->ctrlr);
bdev_nvme_failover(nvme_qpair->ctrlr, false);
}
} else {
/* In this case, ctrlr_channel is already deleted. */