diff --git a/lib/nvme/nvme_cuse.c b/lib/nvme/nvme_cuse.c index 4d5507274..b06e2065c 100644 --- a/lib/nvme/nvme_cuse.c +++ b/lib/nvme/nvme_cuse.c @@ -784,6 +784,7 @@ nvme_cuse_stop(struct spdk_nvme_ctrlr *ctrlr) static struct nvme_io_msg_producer cuse_nvme_io_msg_producer = { .name = "cuse", + .stop = nvme_cuse_stop, }; int diff --git a/lib/nvme/nvme_io_msg.c b/lib/nvme/nvme_io_msg.c index 41a1aee62..a89a55fe9 100644 --- a/lib/nvme/nvme_io_msg.c +++ b/lib/nvme/nvme_io_msg.c @@ -147,6 +147,14 @@ nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, void nvme_io_msg_ctrlr_detach(struct spdk_nvme_ctrlr *ctrlr) { + struct nvme_io_msg_producer *io_msg_producer, *tmp; + + /* Stop all producers */ + STAILQ_FOREACH_SAFE(io_msg_producer, &ctrlr->io_producers, link, tmp) { + io_msg_producer->stop(ctrlr); + STAILQ_REMOVE(&ctrlr->io_producers, io_msg_producer, nvme_io_msg_producer, link); + } + if (ctrlr->external_io_msgs) { spdk_ring_free(ctrlr->external_io_msgs); } diff --git a/lib/nvme/nvme_io_msg.h b/lib/nvme/nvme_io_msg.h index 60e8c54d0..d909e9d52 100644 --- a/lib/nvme/nvme_io_msg.h +++ b/lib/nvme/nvme_io_msg.h @@ -52,6 +52,7 @@ struct spdk_nvme_io_msg { struct nvme_io_msg_producer { const char *name; + void (*stop)(struct spdk_nvme_ctrlr *ctrlr); STAILQ_ENTRY(nvme_io_msg_producer) link; };