diff --git a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c index 7c85e4438..5899579dc 100644 --- a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c +++ b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c @@ -2025,6 +2025,70 @@ test_nvme_ns_cmd_compare_with_md(void) free(metadata); } +static void +test_nvme_ns_cmd_setup_request(void) +{ + struct spdk_nvme_ns ns = {}; + struct nvme_request req = {}; + + ns.id = 1; + ns.pi_type = SPDK_NVME_FMT_NVM_PROTECTION_TYPE1; + ns.flags = SPDK_NVME_NS_DPS_PI_SUPPORTED; + + _nvme_ns_cmd_setup_request(&ns, &req, SPDK_NVME_OPC_READ, + 1024, 256, SPDK_NVME_IO_FLAGS_PRACT, 1, 1); + CU_ASSERT(req.cmd.cdw10 == 1024); + CU_ASSERT(req.cmd.opc == SPDK_NVME_OPC_READ); + CU_ASSERT(req.cmd.nsid == 1); + CU_ASSERT(req.cmd.cdw14 == 1024); + CU_ASSERT(req.cmd.fuse == 0); + CU_ASSERT(req.cmd.cdw12 == (255 | SPDK_NVME_IO_FLAGS_PRACT)); + CU_ASSERT(req.cmd.cdw15 == (1 << 16 | 1)); +} + +static void +test_spdk_nvme_ns_cmd_readv_with_md(void) +{ + struct spdk_nvme_ns ns; + struct spdk_nvme_ctrlr ctrlr; + struct spdk_nvme_qpair qpair; + int rc = 0; + char *metadata = NULL; + uint32_t lba_count = 256; + uint32_t sector_size = 512; + uint32_t md_size = 128; + uint64_t sge_length = lba_count * sector_size; + + metadata = (void *)0xDEADBEEF; + prepare_for_test(&ns, &ctrlr, &qpair, sector_size, + md_size, 128 * 1024, 0, false); + + rc = spdk_nvme_ns_cmd_readv_with_md(&ns, &qpair, 0x1000, lba_count, NULL, + &sge_length, 0, nvme_request_reset_sgl, + nvme_request_next_sge, metadata, 0, 0); + CU_ASSERT(rc == 0); + SPDK_CU_ASSERT_FATAL(g_request != NULL); + CU_ASSERT(g_request->cmd.opc == SPDK_NVME_OPC_READ); + CU_ASSERT(nvme_payload_type(&g_request->payload) == NVME_PAYLOAD_TYPE_SGL); + CU_ASSERT(g_request->payload.reset_sgl_fn == nvme_request_reset_sgl); + CU_ASSERT(g_request->payload.next_sge_fn == nvme_request_next_sge); + CU_ASSERT(g_request->payload.contig_or_cb_arg == &sge_length); + CU_ASSERT(g_request->payload.md == (void *)0xDEADBEEF); + CU_ASSERT(g_request->cmd.nsid == ns.id); + CU_ASSERT(g_request->payload_size == 256 * 512); + CU_ASSERT(g_request->qpair == &qpair); + CU_ASSERT(g_request->md_offset == 0); + CU_ASSERT(g_request->payload_offset == 0); + + rc = spdk_nvme_ns_cmd_readv_with_md(&ns, &qpair, 0x1000, lba_count, NULL, + NULL, 0, nvme_request_reset_sgl, NULL, + metadata, 0, 0); + CU_ASSERT(rc == -EINVAL); + + nvme_free_request(g_request); + cleanup_after_test(&qpair); +} + int main(int argc, char **argv) { CU_pSuite suite = NULL; @@ -2060,6 +2124,8 @@ int main(int argc, char **argv) CU_ADD_TEST(suite, test_nvme_ns_cmd_compare_and_write); CU_ADD_TEST(suite, test_nvme_ns_cmd_compare_with_md); CU_ADD_TEST(suite, test_nvme_ns_cmd_comparev_with_md); + CU_ADD_TEST(suite, test_nvme_ns_cmd_setup_request); + CU_ADD_TEST(suite, test_spdk_nvme_ns_cmd_readv_with_md); g_spdk_nvme_driver = &_g_nvme_driver;