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 <tomasz.zawadzki@intel.com>
Change-Id: I6e526e3f65f7f5bca0617888be06a5296422f8e0
Signed-off-by: Maciej Szwed <maciej.szwed@intel.com>
Reviewed-on: https://review.gerrithub.io/371885
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Tomasz Zawadzki 2017-08-21 12:17:33 +02:00 committed by Jim Harris
parent 179ed697b3
commit 2fbe26160f

View File

@ -1299,13 +1299,13 @@ _spdk_bs_channel_destroy(void *io_device, void *ctx_buf)
} }
static void 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; struct spdk_blob *blob, *blob_tmp;
spdk_bs_unregister_md_thread(bs); bs = SPDK_CONTAINEROF(io_device, struct spdk_blob_store, md_target);
spdk_io_device_unregister(&bs->io_target, NULL); bs->dev->destroy(bs->dev);
spdk_io_device_unregister(&bs->md_target, NULL);
TAILQ_FOREACH_SAFE(blob, &bs->blobs, link, blob_tmp) { TAILQ_FOREACH_SAFE(blob, &bs->blobs, link, blob_tmp) {
TAILQ_REMOVE(&bs->blobs, blob, link); 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_md_pages);
spdk_bit_array_free(&bs->used_clusters); spdk_bit_array_free(&bs->used_clusters);
bs->dev->destroy(bs->dev);
free(bs); 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 void
spdk_bs_opts_init(struct spdk_bs_opts *opts) spdk_bs_opts_init(struct spdk_bs_opts *opts)
{ {