From 2fbe26160f47b26a256195a785c590fe9eaba625 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Mon, 21 Aug 2017 12:17:33 +0200 Subject: [PATCH] blobstore: defer destroying bs_dev This patch delays destruction of bs_dev till after md_target io_device is unregistered. Otherwise bs_dev would no longer exist when destroying attached channels. Signed-off-by: Tomasz Zawadzki Change-Id: I6e526e3f65f7f5bca0617888be06a5296422f8e0 Signed-off-by: Maciej Szwed Reviewed-on: https://review.gerrithub.io/371885 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/blob/blobstore.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index ea19b57b4..bafc34fcd 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -1299,13 +1299,13 @@ _spdk_bs_channel_destroy(void *io_device, void *ctx_buf) } static void -_spdk_bs_free(struct spdk_blob_store *bs) +_spdk_bs_dev_destroy(void *io_device) { + struct spdk_blob_store *bs; struct spdk_blob *blob, *blob_tmp; - spdk_bs_unregister_md_thread(bs); - spdk_io_device_unregister(&bs->io_target, NULL); - spdk_io_device_unregister(&bs->md_target, NULL); + bs = SPDK_CONTAINEROF(io_device, struct spdk_blob_store, md_target); + bs->dev->destroy(bs->dev); TAILQ_FOREACH_SAFE(blob, &bs->blobs, link, blob_tmp) { TAILQ_REMOVE(&bs->blobs, blob, link); @@ -1314,11 +1314,17 @@ _spdk_bs_free(struct spdk_blob_store *bs) spdk_bit_array_free(&bs->used_md_pages); spdk_bit_array_free(&bs->used_clusters); - - bs->dev->destroy(bs->dev); free(bs); } +static void +_spdk_bs_free(struct spdk_blob_store *bs) +{ + spdk_bs_unregister_md_thread(bs); + spdk_io_device_unregister(&bs->io_target, NULL); + spdk_io_device_unregister(&bs->md_target, _spdk_bs_dev_destroy); +} + void spdk_bs_opts_init(struct spdk_bs_opts *opts) {