BlockDriver->bdrv_eject is categorized as IO callback, and it currently doesn't run in a coroutine. This makes very difficult to add the graph rdlock, since the callback traverses the block nodes graph.
The only caller of this function is blk_eject, therefore make blk_eject a generated_co_wrapper_simple, so that it always creates a new coroutine, and then make bdrv_eject coroutine_fn. Signed-off-by: Emanuele Giuseppe Esposito <eespo...@redhat.com> --- block.c | 3 ++- block/block-backend.c | 5 +++-- block/copy-on-read.c | 2 +- block/filter-compress.c | 2 +- block/raw-format.c | 2 +- include/block/block-io.h | 3 ++- include/block/block_int-common.h | 2 +- include/sysemu/block-backend-io.h | 4 +++- 8 files changed, 14 insertions(+), 9 deletions(-) diff --git a/block.c b/block.c index 4205735308..ffbb8c602f 100644 --- a/block.c +++ b/block.c @@ -6802,10 +6802,11 @@ bool coroutine_fn bdrv_co_is_inserted(BlockDriverState *bs) /** * If eject_flag is TRUE, eject the media. Otherwise, close the tray */ -void bdrv_eject(BlockDriverState *bs, bool eject_flag) +void coroutine_fn bdrv_co_eject(BlockDriverState *bs, bool eject_flag) { BlockDriver *drv = bs->drv; IO_CODE(); + assert_bdrv_graph_readable(); if (drv && drv->bdrv_eject) { drv->bdrv_eject(bs, eject_flag); diff --git a/block/block-backend.c b/block/block-backend.c index 9a500fdde3..308dd2070a 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -2019,14 +2019,15 @@ void blk_lock_medium(BlockBackend *blk, bool locked) } } -void blk_eject(BlockBackend *blk, bool eject_flag) +void coroutine_fn blk_co_eject(BlockBackend *blk, bool eject_flag) { BlockDriverState *bs = blk_bs(blk); char *id; IO_CODE(); + assert_bdrv_graph_readable(); if (bs) { - bdrv_eject(bs, eject_flag); + bdrv_co_eject(bs, eject_flag); } /* Whether or not we ejected on the backend, diff --git a/block/copy-on-read.c b/block/copy-on-read.c index 74f7727a02..76f884a6ae 100644 --- a/block/copy-on-read.c +++ b/block/copy-on-read.c @@ -218,7 +218,7 @@ static int coroutine_fn cor_co_pwritev_compressed(BlockDriverState *bs, static void cor_eject(BlockDriverState *bs, bool eject_flag) { - bdrv_eject(bs->file->bs, eject_flag); + bdrv_co_eject(bs->file->bs, eject_flag); } diff --git a/block/filter-compress.c b/block/filter-compress.c index 305716c86c..571e4684dd 100644 --- a/block/filter-compress.c +++ b/block/filter-compress.c @@ -118,7 +118,7 @@ static void compress_refresh_limits(BlockDriverState *bs, Error **errp) static void compress_eject(BlockDriverState *bs, bool eject_flag) { - bdrv_eject(bs->file->bs, eject_flag); + bdrv_co_eject(bs->file->bs, eject_flag); } diff --git a/block/raw-format.c b/block/raw-format.c index 4773bf9cda..9b23cf17bb 100644 --- a/block/raw-format.c +++ b/block/raw-format.c @@ -405,7 +405,7 @@ static int coroutine_fn raw_co_truncate(BlockDriverState *bs, int64_t offset, static void raw_eject(BlockDriverState *bs, bool eject_flag) { - bdrv_eject(bs->file->bs, eject_flag); + bdrv_co_eject(bs->file->bs, eject_flag); } static void raw_lock_medium(BlockDriverState *bs, bool locked) diff --git a/include/block/block-io.h b/include/block/block-io.h index 3432e6ad3e..204adeb701 100644 --- a/include/block/block-io.h +++ b/include/block/block-io.h @@ -125,7 +125,8 @@ bool coroutine_fn bdrv_co_is_inserted(BlockDriverState *bs); bool generated_co_wrapper_simple bdrv_is_inserted(BlockDriverState *bs); void bdrv_lock_medium(BlockDriverState *bs, bool locked); -void bdrv_eject(BlockDriverState *bs, bool eject_flag); +void coroutine_fn bdrv_co_eject(BlockDriverState *bs, bool eject_flag); + const char *bdrv_get_format_name(BlockDriverState *bs); bool bdrv_supports_compressed_writes(BlockDriverState *bs); diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h index 4cad48b2ad..d01b3d44f5 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -761,7 +761,7 @@ struct BlockDriver { /* removable device specific. Called with graph rdlock held. */ bool coroutine_fn (*bdrv_is_inserted)(BlockDriverState *bs); - void (*bdrv_eject)(BlockDriverState *bs, bool eject_flag); + void coroutine_fn (*bdrv_eject)(BlockDriverState *bs, bool eject_flag); void (*bdrv_lock_medium)(BlockDriverState *bs, bool locked); /* to control generic scsi devices. Called with graph rdlock taken. */ diff --git a/include/sysemu/block-backend-io.h b/include/sysemu/block-backend-io.h index bf88f7699e..cc706c03d8 100644 --- a/include/sysemu/block-backend-io.h +++ b/include/sysemu/block-backend-io.h @@ -59,7 +59,9 @@ bool generated_co_wrapper blk_is_inserted(BlockBackend *blk); bool blk_is_available(BlockBackend *blk); void blk_lock_medium(BlockBackend *blk, bool locked); -void blk_eject(BlockBackend *blk, bool eject_flag); + +void coroutine_fn blk_co_eject(BlockBackend *blk, bool eject_flag); +void generated_co_wrapper_simple blk_eject(BlockBackend *blk, bool eject_flag); int64_t coroutine_fn blk_co_getlength(BlockBackend *blk); int64_t generated_co_wrapper_blk blk_getlength(BlockBackend *blk); -- 2.31.1