diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index d33f2bbe5..40add47d9 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -146,6 +146,14 @@ nvme_allocate_request_null(spdk_nvme_cmd_cb cb_fn, void *cb_arg) return nvme_allocate_request_contig(NULL, 0, cb_fn, cb_arg); } +void +nvme_remove_child_request(struct nvme_request *parent, + struct nvme_request *child) +{ + parent->num_children--; + TAILQ_REMOVE(&parent->children, child, child_tailq); +} + void nvme_free_request(struct nvme_request *req) { diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index a49b190b1..1c52ac02f 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -549,6 +549,7 @@ struct nvme_request *nvme_allocate_request_null(spdk_nvme_cmd_cb cb_fn, void *cb struct nvme_request *nvme_allocate_request_contig(void *buffer, uint32_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg); void nvme_free_request(struct nvme_request *req); +void nvme_remove_child_request(struct nvme_request *parent, struct nvme_request *child); bool nvme_intel_has_quirk(struct pci_id *id, uint64_t quirk); void spdk_nvme_ctrlr_opts_set_defaults(struct spdk_nvme_ctrlr_opts *opts); diff --git a/lib/nvme/nvme_ns_cmd.c b/lib/nvme/nvme_ns_cmd.c index cb6d12bc4..889b266da 100644 --- a/lib/nvme/nvme_ns_cmd.c +++ b/lib/nvme/nvme_ns_cmd.c @@ -44,8 +44,7 @@ nvme_cb_complete_child(void *child_arg, const struct spdk_nvme_cpl *cpl) struct nvme_request *child = child_arg; struct nvme_request *parent = child->parent; - parent->num_children--; - TAILQ_REMOVE(&parent->children, child, child_tailq); + nvme_remove_child_request(parent, child); if (spdk_nvme_cpl_is_error(cpl)) { memcpy(&parent->parent_status, cpl, sizeof(*cpl)); diff --git a/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c b/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c index bdc33aa20..623fbd442 100644 --- a/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c +++ b/test/lib/nvme/unit/nvme_ns_cmd_c/nvme_ns_cmd_ut.c @@ -191,7 +191,7 @@ split_test2(void) CU_ASSERT(g_request->num_children == 2); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == 128 * 1024); @@ -200,7 +200,7 @@ split_test2(void) nvme_free_request(child); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == 128 * 1024); @@ -247,7 +247,7 @@ split_test3(void) SPDK_CU_ASSERT_FATAL(g_request->num_children == 2); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == 128 * 1024); @@ -256,7 +256,7 @@ split_test3(void) nvme_free_request(child); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == 128 * 1024); @@ -306,7 +306,7 @@ split_test4(void) SPDK_CU_ASSERT_FATAL(g_request->num_children == 3); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == (256 - 10) * 512); @@ -318,7 +318,7 @@ split_test4(void) nvme_free_request(child); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == 128 * 1024); @@ -330,7 +330,7 @@ split_test4(void) nvme_free_request(child); child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + nvme_remove_child_request(g_request, child); nvme_cmd_interpret_rw(&child->cmd, &cmd_lba, &cmd_lba_count); CU_ASSERT(child->num_children == 0); CU_ASSERT(child->payload_size == 10 * 512); @@ -355,10 +355,10 @@ test_cmd_child_request(void) struct spdk_nvme_ctrlr ctrlr; struct spdk_nvme_qpair qpair; int rc = 0; - struct nvme_request *child; + struct nvme_request *child, *tmp; void *payload; uint64_t lba = 0x1000; - uint32_t i; + uint32_t i = 0; uint32_t offset = 0; uint32_t sector_size = 512; uint32_t max_io_size = 128 * 1024; @@ -383,9 +383,8 @@ test_cmd_child_request(void) CU_ASSERT(rc == 0); CU_ASSERT(g_request->num_children == 4); - for (i = 0; i < g_request->num_children; i++) { - child = TAILQ_FIRST(&g_request->children); - TAILQ_REMOVE(&g_request->children, child, child_tailq); + TAILQ_FOREACH_SAFE(child, &g_request->children, child_tailq, tmp) { + nvme_remove_child_request(g_request, child); CU_ASSERT(child->payload_offset == offset); CU_ASSERT(child->cmd.opc == SPDK_NVME_OPC_READ); CU_ASSERT(child->cmd.nsid == ns.id); @@ -393,6 +392,7 @@ test_cmd_child_request(void) CU_ASSERT(child->cmd.cdw12 == ((sectors_per_max_io - 1) | 0)); offset += max_io_size; nvme_free_request(child); + i++; } free(payload); diff --git a/test/lib/nvme/unit/nvme_qpair_c/nvme_qpair_ut.c b/test/lib/nvme/unit/nvme_qpair_c/nvme_qpair_ut.c index 1f19ba252..2cc329ac8 100644 --- a/test/lib/nvme/unit/nvme_qpair_c/nvme_qpair_ut.c +++ b/test/lib/nvme/unit/nvme_qpair_c/nvme_qpair_ut.c @@ -176,6 +176,14 @@ nvme_free_request(struct nvme_request *req) nvme_dealloc_request(req); } +void +nvme_remove_child_request(struct nvme_request *parent, + struct nvme_request *child) +{ + parent->num_children--; + TAILQ_REMOVE(&parent->children, child, child_tailq); +} + static void test1(void) {