From e63eebca1bb265e5ec733a086c86c7564f7e2d86 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 18 Apr 2022 14:00:50 +0900 Subject: [PATCH] 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 Change-Id: I7d4ff036187bb79ada258cfc299582b4d287018b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12288 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Tested-by: SPDK CI Jenkins --- module/bdev/nvme/bdev_nvme.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index dc711d1ba..f7b1c8457 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -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;