From 137684a8202c5f56d45e4f5f3006898eb40f6814 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 6 Apr 2020 16:18:21 +0900 Subject: [PATCH] bdev/compress: Ensure release I/O channel on the correct thread at vbdev_reduce_init_cb() vbdev_reduce_init_cb() had ensured only closing bdev was done on the correct thread. I/O channel should have been released on the same thread. Fix this potential issue. reduce_errno and vol cannot be passed through message because message can have a single parameter. So set vol before sending message and use vol as reduce_errno. Signed-off-by: Shuhei Matsumoto Change-Id: I923a9e3148db0f5413a6903d62f869eec122dcca Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1693 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker Reviewed-by: Paul Luse --- module/bdev/compress/vbdev_compress.c | 32 +++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/module/bdev/compress/vbdev_compress.c b/module/bdev/compress/vbdev_compress.c index 6d1e21416..2caa17b82 100644 --- a/module/bdev/compress/vbdev_compress.c +++ b/module/bdev/compress/vbdev_compress.c @@ -1102,9 +1102,19 @@ vbdev_compress_config_json(struct spdk_json_write_ctx *w) static void _vbdev_reduce_init_cb(void *ctx) { - struct spdk_bdev_desc *desc = ctx; + struct vbdev_compress *meta_ctx = ctx; - spdk_bdev_close(desc); + /* We're done with metadata operations */ + spdk_put_io_channel(meta_ctx->base_ch); + /* Close the underlying bdev on its same opened thread. */ + spdk_bdev_close(meta_ctx->base_desc); + meta_ctx->base_desc = NULL; + + if (meta_ctx->vol) { + vbdev_compress_claim(meta_ctx); + } else { + free(meta_ctx); + } } /* Callback from reduce for when init is complete. We'll pass the vbdev_comp struct @@ -1116,23 +1126,17 @@ vbdev_reduce_init_cb(void *cb_arg, struct spdk_reduce_vol *vol, int reduce_errno { struct vbdev_compress *meta_ctx = cb_arg; - /* We're done with metadata operations */ - spdk_put_io_channel(meta_ctx->base_ch); - /* Close the underlying bdev on its same opened thread. */ - if (meta_ctx->thread && meta_ctx->thread != spdk_get_thread()) { - spdk_thread_send_msg(meta_ctx->thread, _vbdev_reduce_init_cb, meta_ctx->base_desc); - } else { - spdk_bdev_close(meta_ctx->base_desc); - } - meta_ctx->base_desc = NULL; - if (reduce_errno == 0) { meta_ctx->vol = vol; - vbdev_compress_claim(meta_ctx); } else { SPDK_ERRLOG("for vol %s, error %u\n", spdk_bdev_get_name(meta_ctx->base_bdev), reduce_errno); - free(meta_ctx); + } + + if (meta_ctx->thread && meta_ctx->thread != spdk_get_thread()) { + spdk_thread_send_msg(meta_ctx->thread, _vbdev_reduce_init_cb, meta_ctx); + } else { + _vbdev_reduce_init_cb(meta_ctx); } }