diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 73209eb37..2f8d22e50 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -1312,16 +1312,7 @@ timeout_cb(void *cb_arg, struct spdk_nvme_ctrlr *ctrlr, void nvme_ctrlr_depopulate_namespace_done(struct nvme_bdev_ns *nvme_ns) { - pthread_mutex_lock(&g_bdev_nvme_mutex); - assert(nvme_ns->ref > 0); - nvme_ns->ref--; - if (nvme_ns->ref > 0) { - pthread_mutex_unlock(&g_bdev_nvme_mutex); - return; - } - pthread_mutex_unlock(&g_bdev_nvme_mutex); - - nvme_bdev_ctrlr_destruct(nvme_ns->ctrlr); + nvme_bdev_ns_detach(nvme_ns); } static void diff --git a/module/bdev/nvme/common.c b/module/bdev/nvme/common.c index 28aef1740..14e5d1424 100644 --- a/module/bdev/nvme/common.c +++ b/module/bdev/nvme/common.c @@ -184,6 +184,21 @@ nvme_bdev_ctrlr_destruct(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr) nvme_bdev_ctrlr_do_destruct(nvme_bdev_ctrlr); } +void +nvme_bdev_ns_detach(struct nvme_bdev_ns *nvme_ns) +{ + pthread_mutex_lock(&g_bdev_nvme_mutex); + assert(nvme_ns->ref > 0); + nvme_ns->ref--; + if (nvme_ns->ref > 0) { + pthread_mutex_unlock(&g_bdev_nvme_mutex); + return; + } + pthread_mutex_unlock(&g_bdev_nvme_mutex); + + nvme_bdev_ctrlr_destruct(nvme_ns->ctrlr); +} + void nvme_bdev_attach_bdev_to_ns(struct nvme_bdev_ns *nvme_ns, struct nvme_bdev *nvme_disk) { @@ -201,14 +216,7 @@ nvme_bdev_detach_bdev_from_ns(struct nvme_bdev *nvme_disk) pthread_mutex_lock(&g_bdev_nvme_mutex); TAILQ_REMOVE(&nvme_disk->nvme_ns->bdevs, nvme_disk, tailq); - - assert(nvme_ns->ref > 0); - nvme_ns->ref--; - if (nvme_ns->ref > 0) { - pthread_mutex_unlock(&g_bdev_nvme_mutex); - return; - } pthread_mutex_unlock(&g_bdev_nvme_mutex); - nvme_bdev_ctrlr_destruct(nvme_ns->ctrlr); + nvme_bdev_ns_detach(nvme_ns); } diff --git a/module/bdev/nvme/common.h b/module/bdev/nvme/common.h index 83bd30247..6567c212e 100644 --- a/module/bdev/nvme/common.h +++ b/module/bdev/nvme/common.h @@ -167,6 +167,7 @@ void nvme_bdev_dump_trid_json(const struct spdk_nvme_transport_id *trid, void nvme_bdev_ctrlr_destruct(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr); void nvme_bdev_ctrlr_do_destruct(void *ctx); +void nvme_bdev_ns_detach(struct nvme_bdev_ns *nvme_ns); void nvme_bdev_attach_bdev_to_ns(struct nvme_bdev_ns *nvme_ns, struct nvme_bdev *nvme_disk); void nvme_bdev_detach_bdev_from_ns(struct nvme_bdev *nvme_disk); diff --git a/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c b/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c index 6f76a614c..6b511a5ee 100644 --- a/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c +++ b/test/unit/lib/bdev/bdev_ocssd.c/bdev_ocssd_ut.c @@ -197,13 +197,7 @@ nvme_ctrlr_populate_namespace_done(struct nvme_async_probe_ctx *ctx, void nvme_ctrlr_depopulate_namespace_done(struct nvme_bdev_ns *ns) { - CU_ASSERT(ns->ref > 0); - ns->ref--; - if (ns->ref > 0) { - return; - } - - nvme_bdev_ctrlr_destruct(ns->ctrlr); + nvme_bdev_ns_detach(ns); } static struct nvme_bdev_ctrlr *