diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index be741ec67..979277a64 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -318,7 +318,17 @@ bdev_nvme_destruct(void *ctx) nvme_ns->bdev = NULL; - nvme_bdev_ns_detach(nvme_ns); + pthread_mutex_lock(&nvme_ns->ctrlr->mutex); + + assert(nvme_ns->ref > 0); + nvme_ns->ref--; + if (nvme_ns->ref == 0) { + pthread_mutex_unlock(&nvme_ns->ctrlr->mutex); + + nvme_bdev_ctrlr_destruct(nvme_ns->ctrlr); + } else { + pthread_mutex_unlock(&nvme_ns->ctrlr->mutex); + } free(nvme_disk->disk.name); free(nvme_disk); diff --git a/module/bdev/nvme/bdev_ocssd.c b/module/bdev/nvme/bdev_ocssd.c index c742836f6..e4326dead 100644 --- a/module/bdev/nvme/bdev_ocssd.c +++ b/module/bdev/nvme/bdev_ocssd.c @@ -216,7 +216,17 @@ bdev_ocssd_destruct(void *ctx) nvme_ns->bdev = NULL; - nvme_bdev_ns_detach(nvme_ns); + pthread_mutex_lock(&nvme_ns->ctrlr->mutex); + + assert(nvme_ns->ref > 0); + nvme_ns->ref--; + if (nvme_ns->ref == 0) { + pthread_mutex_unlock(&nvme_ns->ctrlr->mutex); + + nvme_bdev_ctrlr_destruct(nvme_ns->ctrlr); + } else { + pthread_mutex_unlock(&nvme_ns->ctrlr->mutex); + } bdev_ocssd_free_bdev(ocssd_bdev); diff --git a/module/bdev/nvme/common.c b/module/bdev/nvme/common.c index bc6a5166a..ee4e3bf16 100644 --- a/module/bdev/nvme/common.c +++ b/module/bdev/nvme/common.c @@ -187,7 +187,7 @@ nvme_bdev_ctrlr_destruct(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr) } void -nvme_bdev_ns_detach(struct nvme_bdev_ns *nvme_ns) +nvme_ctrlr_depopulate_namespace_done(struct nvme_bdev_ns *nvme_ns) { struct nvme_bdev_ctrlr *nvme_bdev_ctrlr = nvme_ns->ctrlr; @@ -202,11 +202,5 @@ nvme_bdev_ns_detach(struct nvme_bdev_ns *nvme_ns) } pthread_mutex_unlock(&nvme_bdev_ctrlr->mutex); - nvme_bdev_ctrlr_destruct(nvme_ns->ctrlr); -} - -void -nvme_ctrlr_depopulate_namespace_done(struct nvme_bdev_ns *nvme_ns) -{ - nvme_bdev_ns_detach(nvme_ns); + nvme_bdev_ctrlr_destruct(nvme_bdev_ctrlr); } diff --git a/module/bdev/nvme/common.h b/module/bdev/nvme/common.h index 0ea802cf2..50784e328 100644 --- a/module/bdev/nvme/common.h +++ b/module/bdev/nvme/common.h @@ -177,7 +177,6 @@ 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); static inline bool bdev_nvme_find_io_path(struct nvme_bdev *nbdev, struct nvme_io_channel *nvme_ch,