From: Stefan Hajnoczi <stefa...@redhat.com> Most export types install BlockDeviceOps pointers. It is easy to forget to remove them because that happens automatically via the "drive" qdev property in hw/ but not block/export/.
Put blk_set_dev_ops(blk, NULL, NULL) calls in the core export.c code so the export types don't need to remember. This fixes the nbd and vhost-user-blk export types. Fixes: fd6afc501a01 ("nbd/server: Use drained block ops to quiesce the server") Fixes: ca858a5fe94c ("vhost-user-blk-server: notify client about disk resize") Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> Reviewed-by: Eric Blake <ebl...@redhat.com> Message-Id: <20230502211119.720647-1-stefa...@redhat.com> Signed-off-by: Eric Blake <ebl...@redhat.com> --- block/export/export.c | 2 ++ block/export/vduse-blk.c | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/block/export/export.c b/block/export/export.c index e3fee606116..62c7c22d45d 100644 --- a/block/export/export.c +++ b/block/export/export.c @@ -192,6 +192,7 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp) return exp; fail: + blk_set_dev_ops(exp->blk, NULL, NULL); blk_unref(blk); aio_context_release(ctx); if (exp) { @@ -219,6 +220,7 @@ static void blk_exp_delete_bh(void *opaque) assert(exp->refcount == 0); QLIST_REMOVE(exp, next); exp->drv->delete(exp); + blk_set_dev_ops(exp->blk, NULL, NULL); blk_unref(exp->blk); qapi_event_send_block_export_deleted(exp->id); g_free(exp->id); diff --git a/block/export/vduse-blk.c b/block/export/vduse-blk.c index f7ae44e3cea..b53ef39da02 100644 --- a/block/export/vduse-blk.c +++ b/block/export/vduse-blk.c @@ -346,7 +346,6 @@ static void vduse_blk_exp_delete(BlockExport *exp) blk_remove_aio_context_notifier(exp->blk, blk_aio_attached, blk_aio_detach, vblk_exp); - blk_set_dev_ops(exp->blk, NULL, NULL); ret = vduse_dev_destroy(vblk_exp->dev); if (ret != -EBUSY) { unlink(vblk_exp->recon_file); -- 2.40.1