bdev/nvme: Retry creating qpair if it fails when creating bdev channel

We may fail creating qpair when adding io_path while creating a bdev_channel
if connection is down. But if we enable I/O error recovery, we can retry
creating qpair later.

So let nvme_qpair_create() succeed if the ctrlr is being reset or
I/O error recovery is enabled even if creating qpair failed.

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

View File

@ -2203,10 +2203,12 @@ nvme_qpair_create(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ctrlr_channel *ctrl
rc = bdev_nvme_create_qpair(nvme_qpair);
if (rc != 0) {
/* nvme ctrlr can't create IO qpair during reset. In that case ctrlr_ch->qpair
* pointer will be NULL and IO qpair will be created when reset completes.
* If the user submits IO requests during reset, they will be queued and resubmitted later */
if (!nvme_ctrlr->resetting) {
/* nvme_ctrlr can't create IO qpair if connection is down. If nvme_ctrlr is
* being reset or scheduled to reconnect later, ignore this failure.
* Then IO qpair will be created later when reconnect completes.
* If the user submits IO requests in the meantime, they will be queued and
* resubmitted later */
if (!nvme_ctrlr->resetting && !nvme_ctrlr->reconnect_is_delayed) {
spdk_put_io_channel(pg_ch);
free(nvme_qpair);
return rc;