From 31d260156e2b5ebaafa3c31f6219e04a5eb3d825 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 6 Apr 2020 19:21:40 +0900 Subject: [PATCH] bdev/compress: Ensure bdev_close and related operations on the correct thread for vbdev_compress_destruct_cb() Not only bdev_close() but also TAILQ_REMOVE and bdev_module_release_bdev() are better to be executed on the correct thread for vbdev_compress_destruct_cb(). Signed-off-by: Shuhei Matsumoto Change-Id: I0810ecc4149747315e6ec290437ba40fb4b71686 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1694 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Reviewed-by: Changpeng Liu Reviewed-by: Paul Luse Reviewed-by: Ben Walker --- module/bdev/compress/vbdev_compress.c | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/module/bdev/compress/vbdev_compress.c b/module/bdev/compress/vbdev_compress.c index 2caa17b82..b6f85e7d5 100644 --- a/module/bdev/compress/vbdev_compress.c +++ b/module/bdev/compress/vbdev_compress.c @@ -899,9 +899,19 @@ _device_unregister_cb(void *io_device) static void _vbdev_compress_destruct_cb(void *ctx) { - struct spdk_bdev_desc *desc = ctx; + struct vbdev_compress *comp_bdev = ctx; - spdk_bdev_close(desc); + TAILQ_REMOVE(&g_vbdev_comp, comp_bdev, link); + spdk_bdev_module_release_bdev(comp_bdev->base_bdev); + /* Close the underlying bdev on its same opened thread. */ + spdk_bdev_close(comp_bdev->base_desc); + comp_bdev->vol = NULL; + if (comp_bdev->orphaned == false) { + spdk_io_device_unregister(comp_bdev, _device_unregister_cb); + } else { + vbdev_compress_delete_done(comp_bdev->delete_ctx, 0); + _device_unregister_cb(comp_bdev); + } } static void @@ -912,20 +922,11 @@ vbdev_compress_destruct_cb(void *cb_arg, int reduce_errno) if (reduce_errno) { SPDK_ERRLOG("number %d\n", reduce_errno); } else { - TAILQ_REMOVE(&g_vbdev_comp, comp_bdev, link); - spdk_bdev_module_release_bdev(comp_bdev->base_bdev); - /* Close the underlying bdev on its same opened thread. */ if (comp_bdev->thread && comp_bdev->thread != spdk_get_thread()) { - spdk_thread_send_msg(comp_bdev->thread, _vbdev_compress_destruct_cb, comp_bdev->base_desc); + spdk_thread_send_msg(comp_bdev->thread, + _vbdev_compress_destruct_cb, comp_bdev); } else { - spdk_bdev_close(comp_bdev->base_desc); - } - comp_bdev->vol = NULL; - if (comp_bdev->orphaned == false) { - spdk_io_device_unregister(comp_bdev, _device_unregister_cb); - } else { - vbdev_compress_delete_done(comp_bdev->delete_ctx, 0); - _device_unregister_cb(comp_bdev); + _vbdev_compress_destruct_cb(comp_bdev); } } }