From 1fd2af01507ceb09ed37c2e4272177fec26d3e16 Mon Sep 17 00:00:00 2001 From: Evgeniy Kochetov Date: Thu, 1 Jul 2021 12:38:49 +0300 Subject: [PATCH] nvmf/ctrlr_bdev: Set DNR bit in status for failed NVMe passthru When NVMe passthru command (IO or admin) fails on submission (e.g. it is not supported), set DNR bit in completion status field. There is no sense in retrying the command in this case. Signed-off-by: Evgeniy Kochetov Change-Id: I55960c128bd9fc31f6defef0b9832259a71684b1 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8578 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/nvmf/ctrlr_bdev.c | 2 ++ test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/nvmf/ctrlr_bdev.c b/lib/nvmf/ctrlr_bdev.c index c44a54fef..5d1fac958 100644 --- a/lib/nvmf/ctrlr_bdev.c +++ b/lib/nvmf/ctrlr_bdev.c @@ -697,6 +697,7 @@ nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc * } req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC; req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INVALID_OPCODE; + req->rsp->nvme_cpl.status.dnr = 1; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } @@ -726,6 +727,7 @@ spdk_nvmf_bdev_ctrlr_nvme_passthru_admin(struct spdk_bdev *bdev, struct spdk_bde req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR; } + req->rsp->nvme_cpl.status.dnr = 1; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } diff --git a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c index 4dea1e827..98051b207 100644 --- a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c +++ b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c @@ -846,6 +846,7 @@ test_nvmf_bdev_ctrlr_nvme_passthru(void) CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_OPCODE); + CU_ASSERT(rsp.nvme_cpl.status.dnr == 1); /* NVME_IO no channel - queue IO */ memset(&rsp, 0, sizeof(rsp)); @@ -881,6 +882,7 @@ test_nvmf_bdev_ctrlr_nvme_passthru(void) CU_ASSERT(rc == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE); CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC); CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_OPCODE); + CU_ASSERT(rsp.nvme_cpl.status.dnr == 1); /* NVME_ADMIN no channel - queue IO */ memset(&rsp, 0, sizeof(rsp));