bdev/nvme: Fix the RPC bdev_nvme_send_cmd to pass the registered io_device, nvme_bdev_ctrlr, correctly to get io_channel

Previously, not nvme_bdev_ctrlr but spdk_nvme_ctrlr pointer had been
passed to spdk_get_io_channel() in nvme_rpc_io_cmd_bdev_nvme().

There was no unit test for bdev_nvme_get_io_qpair(), and so add
unit test for it to guard us from degradation.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: I00fdc14ea6467162c5fb90d04389883d7c409a17
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6920
Community-CI: Broadcom CI
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Shuhei Matsumoto 2021-03-17 10:18:36 +09:00 committed by Tomasz Zawadzki
parent 05f8643e15
commit 9937ba0b5f
3 changed files with 43 additions and 2 deletions

View File

@ -209,7 +209,9 @@ bdev_nvme_get_io_qpair(struct spdk_io_channel *ctrlr_io_ch)
{ {
struct nvme_io_channel *nvme_ch; struct nvme_io_channel *nvme_ch;
nvme_ch = spdk_io_channel_get_ctx(ctrlr_io_ch); assert(ctrlr_io_ch != NULL);
nvme_ch = spdk_io_channel_get_ctx(ctrlr_io_ch);
return nvme_ch->qpair; return nvme_ch->qpair;
} }

View File

@ -190,7 +190,7 @@ nvme_rpc_io_cmd_bdev_nvme(struct rpc_bdev_nvme_send_cmd_ctx *ctx, struct spdk_nv
struct spdk_nvme_qpair *io_qpair; struct spdk_nvme_qpair *io_qpair;
int ret; int ret;
ctx->ctrlr_io_ch = spdk_get_io_channel(_nvme_ctrlr->ctrlr); ctx->ctrlr_io_ch = spdk_get_io_channel(_nvme_ctrlr);
io_qpair = bdev_nvme_get_io_qpair(ctx->ctrlr_io_ch); io_qpair = bdev_nvme_get_io_qpair(ctx->ctrlr_io_ch);
ret = spdk_nvme_ctrlr_cmd_io_raw_with_md(_nvme_ctrlr->ctrlr, io_qpair, ret = spdk_nvme_ctrlr_cmd_io_raw_with_md(_nvme_ctrlr->ctrlr, io_qpair,

View File

@ -1989,6 +1989,44 @@ test_abort(void)
ut_detach_ctrlr(ctrlr); ut_detach_ctrlr(ctrlr);
} }
static void
test_get_io_qpair(void)
{
struct spdk_nvme_transport_id trid = {};
struct spdk_nvme_ctrlr ctrlr = {};
struct nvme_bdev_ctrlr *nvme_bdev_ctrlr = NULL;
struct spdk_io_channel *ch;
struct nvme_io_channel *nvme_ch;
struct spdk_nvme_qpair *qpair;
int rc;
ut_init_trid(&trid);
TAILQ_INIT(&ctrlr.active_io_qpairs);
set_thread(0);
rc = nvme_bdev_ctrlr_create(&ctrlr, "nvme0", &trid, 0, &nvme_bdev_ctrlr);
CU_ASSERT(rc == 0);
SPDK_CU_ASSERT_FATAL(nvme_bdev_ctrlr != NULL);
ch = spdk_get_io_channel(nvme_bdev_ctrlr);
SPDK_CU_ASSERT_FATAL(ch != NULL);
nvme_ch = spdk_io_channel_get_ctx(ch);
CU_ASSERT(nvme_ch->qpair != NULL);
qpair = bdev_nvme_get_io_qpair(ch);
CU_ASSERT(qpair == nvme_ch->qpair);
spdk_put_io_channel(ch);
rc = bdev_nvme_delete("nvme0", NULL);
CU_ASSERT(rc == 0);
poll_threads();
CU_ASSERT(nvme_bdev_ctrlr_get_by_name("nvme0") == NULL);
}
int int
main(int argc, const char **argv) main(int argc, const char **argv)
{ {
@ -2011,6 +2049,7 @@ main(int argc, const char **argv)
CU_ADD_TEST(suite, test_submit_nvme_cmd); CU_ADD_TEST(suite, test_submit_nvme_cmd);
CU_ADD_TEST(suite, test_remove_trid); CU_ADD_TEST(suite, test_remove_trid);
CU_ADD_TEST(suite, test_abort); CU_ADD_TEST(suite, test_abort);
CU_ADD_TEST(suite, test_get_io_qpair);
CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_set_mode(CU_BRM_VERBOSE);