From 98bbb72dc24d982b8e77679b582b8d05d7299edb Mon Sep 17 00:00:00 2001 From: Tomasz Kulasek Date: Fri, 10 Jan 2020 17:41:07 +0100 Subject: [PATCH] unit/nvmf: fused compare and write Change-Id: Iad60e3d53a9f6b0a6f71b95d66b57d6852d90cb2 Signed-off-by: Tomasz Kulasek Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/481406 Tested-by: SPDK CI Jenkins Community-CI: Broadcom SPDK FC-NVMe CI Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c | 97 ++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index 0c6bfddac..de0193883 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -1420,6 +1420,100 @@ test_custom_admin_cmd(void) CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS); } +static void +test_fused_compare_and_write(void) +{ + struct spdk_nvmf_request req; + struct spdk_nvmf_qpair qpair; + struct spdk_nvme_cmd cmd; + union nvmf_c2h_msg rsp; + struct spdk_nvmf_ctrlr ctrlr; + struct spdk_nvmf_subsystem subsystem; + struct spdk_nvmf_ns ns; + struct spdk_nvmf_ns *subsys_ns[1]; + struct spdk_bdev bdev; + + struct spdk_nvmf_poll_group group; + struct spdk_nvmf_subsystem_poll_group sgroups; + struct spdk_nvmf_subsystem_pg_ns_info ns_info; + + ns.bdev = &bdev; + + subsystem.id = 0; + subsystem.max_nsid = 1; + subsys_ns[0] = &ns; + subsystem.ns = (struct spdk_nvmf_ns **)&subsys_ns; + + /* Enable controller */ + ctrlr.vcprop.cc.bits.en = 1; + ctrlr.subsys = (struct spdk_nvmf_subsystem *)&subsystem; + + group.num_sgroups = 1; + sgroups.state = SPDK_NVMF_SUBSYSTEM_ACTIVE; + sgroups.num_ns = 1; + sgroups.ns_info = &ns_info; + TAILQ_INIT(&sgroups.queued); + group.sgroups = &sgroups; + TAILQ_INIT(&qpair.outstanding); + + qpair.ctrlr = &ctrlr; + qpair.group = &group; + qpair.qid = 1; + qpair.state = SPDK_NVMF_QPAIR_ACTIVE; + + cmd.nsid = 1; + + req.qpair = &qpair; + req.cmd = (union nvmf_h2c_msg *)&cmd; + req.rsp = &rsp; + + /* SUCCESS/SUCCESS */ + cmd.fuse = SPDK_NVME_CMD_FUSE_FIRST; + cmd.opc = SPDK_NVME_OPC_COMPARE; + + spdk_nvmf_request_exec(&req); + CU_ASSERT(qpair.first_fused_req != NULL); + CU_ASSERT(nvme_status_success(&rsp.nvme_cpl.status)); + + cmd.fuse = SPDK_NVME_CMD_FUSE_SECOND; + cmd.opc = SPDK_NVME_OPC_WRITE; + + spdk_nvmf_request_exec(&req); + CU_ASSERT(qpair.first_fused_req == NULL); + CU_ASSERT(nvme_status_success(&rsp.nvme_cpl.status)); + + /* Wrong sequence */ + cmd.fuse = SPDK_NVME_CMD_FUSE_SECOND; + cmd.opc = SPDK_NVME_OPC_WRITE; + + spdk_nvmf_request_exec(&req); + CU_ASSERT(!nvme_status_success(&rsp.nvme_cpl.status)); + CU_ASSERT(qpair.first_fused_req == NULL); + + /* Write as FUSE_FIRST (Wrong op code) */ + cmd.fuse = SPDK_NVME_CMD_FUSE_FIRST; + cmd.opc = SPDK_NVME_OPC_WRITE; + + spdk_nvmf_request_exec(&req); + CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_OPCODE); + CU_ASSERT(qpair.first_fused_req == NULL); + + /* Compare as FUSE_SECOND (Wrong op code) */ + cmd.fuse = SPDK_NVME_CMD_FUSE_FIRST; + cmd.opc = SPDK_NVME_OPC_COMPARE; + + spdk_nvmf_request_exec(&req); + CU_ASSERT(qpair.first_fused_req != NULL); + CU_ASSERT(nvme_status_success(&rsp.nvme_cpl.status)); + + cmd.fuse = SPDK_NVME_CMD_FUSE_SECOND; + cmd.opc = SPDK_NVME_OPC_COMPARE; + + spdk_nvmf_request_exec(&req); + CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_INVALID_OPCODE); + CU_ASSERT(qpair.first_fused_req == NULL); +} + int main(int argc, char **argv) { CU_pSuite suite = NULL; @@ -1451,7 +1545,8 @@ int main(int argc, char **argv) CU_add_test(suite, "get_dif_ctx", test_get_dif_ctx) == NULL || CU_add_test(suite, "set_get_features", test_set_get_features) == NULL || CU_add_test(suite, "identify_ctrlr", test_identify_ctrlr) == NULL || - CU_add_test(suite, "custom_admin_cmd", test_custom_admin_cmd) == NULL) { + CU_add_test(suite, "custom_admin_cmd", test_custom_admin_cmd) == NULL || + CU_add_test(suite, "fused_compare_and_write", test_fused_compare_and_write) == NULL) { CU_cleanup_registry(); return CU_get_error(); }