diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 26a727ceb..a270a3d64 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -2111,28 +2111,14 @@ exit: } } -static void -bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) +static inline void +_bdev_nvme_submit_request(struct nvme_bdev_channel *nbdev_ch, struct spdk_bdev_io *bdev_io) { - struct nvme_bdev_channel *nbdev_ch = spdk_io_channel_get_ctx(ch); - struct spdk_bdev *bdev = bdev_io->bdev; struct nvme_bdev_io *nbdev_io = (struct nvme_bdev_io *)bdev_io->driver_ctx; + struct spdk_bdev *bdev = bdev_io->bdev; struct nvme_bdev_io *nbdev_io_to_abort; int rc = 0; - spdk_trace_record(TRACE_BDEV_NVME_IO_START, 0, 0, (uintptr_t)nbdev_io, (uintptr_t)bdev_io); - nbdev_io->io_path = bdev_nvme_find_io_path(nbdev_ch); - if (spdk_unlikely(!nbdev_io->io_path)) { - if (!bdev_nvme_io_type_is_admin(bdev_io->type)) { - rc = -ENXIO; - goto exit; - } - - /* Admin commands do not use the optimal I/O path. - * Simply fall through even if it is not found. - */ - } - switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: if (bdev_io->u.bdev.iovs && bdev_io->u.bdev.iovs[0].iov_base) { @@ -2257,12 +2243,33 @@ bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i break; } -exit: if (spdk_unlikely(rc != 0)) { bdev_nvme_io_complete(nbdev_io, rc); } } +static void +bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) +{ + struct nvme_bdev_channel *nbdev_ch = spdk_io_channel_get_ctx(ch); + struct nvme_bdev_io *nbdev_io = (struct nvme_bdev_io *)bdev_io->driver_ctx; + + spdk_trace_record(TRACE_BDEV_NVME_IO_START, 0, 0, (uintptr_t)nbdev_io, (uintptr_t)bdev_io); + nbdev_io->io_path = bdev_nvme_find_io_path(nbdev_ch); + if (spdk_unlikely(!nbdev_io->io_path)) { + if (!bdev_nvme_io_type_is_admin(bdev_io->type)) { + bdev_nvme_io_complete(nbdev_io, -ENXIO); + return; + } + + /* Admin commands do not use the optimal I/O path. + * Simply fall through even if it is not found. + */ + } + + _bdev_nvme_submit_request(nbdev_ch, bdev_io); +} + static bool bdev_nvme_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type) { diff --git a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c index 20b8aac18..27241e173 100644 --- a/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c +++ b/test/unit/lib/bdev/nvme/bdev_nvme.c/bdev_nvme_ut.c @@ -1858,9 +1858,6 @@ test_pending_reset(void) ctrlr_ch1 = io_path1->qpair->ctrlr_ch; SPDK_CU_ASSERT_FATAL(ctrlr_ch1 != NULL); - first_bdev_io = ut_alloc_bdev_io(SPDK_BDEV_IO_TYPE_RESET, bdev, ch1); - first_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED; - set_thread(1); ch2 = spdk_get_io_channel(bdev); @@ -1872,7 +1869,10 @@ test_pending_reset(void) ctrlr_ch2 = io_path2->qpair->ctrlr_ch; SPDK_CU_ASSERT_FATAL(ctrlr_ch2 != NULL); - second_bdev_io = ut_alloc_bdev_io(SPDK_BDEV_IO_TYPE_RESET, bdev, ch2); + first_bdev_io = ut_alloc_bdev_io(SPDK_BDEV_IO_TYPE_RESET, bdev, ch2); + first_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED; + + second_bdev_io = ut_alloc_bdev_io(SPDK_BDEV_IO_TYPE_RESET, bdev, ch1); second_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED; /* The first reset request is submitted on thread 1, and the second reset request