diff --git a/lib/nvme/nvme_io_msg.c b/lib/nvme/nvme_io_msg.c index b0819fa3e..4223fe1a6 100644 --- a/lib/nvme/nvme_io_msg.c +++ b/lib/nvme/nvme_io_msg.c @@ -106,6 +106,20 @@ spdk_nvme_io_msg_process(struct spdk_nvme_ctrlr *ctrlr) return count; } +static bool +nvme_io_msg_is_producer_registered(struct spdk_nvme_ctrlr *ctrlr, + struct nvme_io_msg_producer *io_msg_producer) +{ + struct nvme_io_msg_producer *tmp; + + STAILQ_FOREACH(tmp, &ctrlr->io_producers, link) { + if (tmp == io_msg_producer) { + return true; + } + } + return false; +} + int nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, struct nvme_io_msg_producer *io_msg_producer) @@ -115,6 +129,10 @@ nvme_io_msg_ctrlr_register(struct spdk_nvme_ctrlr *ctrlr, return -EINVAL; } + if (nvme_io_msg_is_producer_registered(ctrlr, io_msg_producer)) { + return -EEXIST; + } + if (!STAILQ_EMPTY(&ctrlr->io_producers) || ctrlr->is_resetting) { /* There are registered producers - IO messaging already started */ STAILQ_INSERT_TAIL(&ctrlr->io_producers, io_msg_producer, link); @@ -173,6 +191,10 @@ nvme_io_msg_ctrlr_unregister(struct spdk_nvme_ctrlr *ctrlr, { assert(io_msg_producer != NULL); + if (!nvme_io_msg_is_producer_registered(ctrlr, io_msg_producer)) { + return; + } + STAILQ_REMOVE(&ctrlr->io_producers, io_msg_producer, nvme_io_msg_producer, link); if (STAILQ_EMPTY(&ctrlr->io_producers)) { nvme_io_msg_ctrlr_detach(ctrlr);