From 2531b390fbf67ceccf63f7d236ab2a998f135624 Mon Sep 17 00:00:00 2001 From: Emanuele Giuseppe Esposito Date: Fri, 13 Jan 2023 21:42:09 +0100 Subject: [PATCH] block: Convert bdrv_eject() to co_wrapper bdrv_eject() is categorized as an I/O function, and it currently doesn't run in a coroutine. We should let it take a graph rdlock since it traverses the block nodes graph, which however is only possible in a coroutine. The only caller of this function is blk_eject(). Therefore make blk_eject() a co_wrapper, so that it always creates a new coroutine, and then make bdrv_eject() coroutine_fn where the lock can be taken. Signed-off-by: Emanuele Giuseppe Esposito Signed-off-by: Kevin Wolf Message-Id: <20230113204212.359076-12-kwolf@redhat.com> Reviewed-by: Emanuele Giuseppe Esposito Signed-off-by: Kevin Wolf --- block.c | 6 +++--- block/block-backend.c | 4 ++-- block/copy-on-read.c | 6 +++--- block/file-posix.c | 8 ++++---- block/filter-compress.c | 7 ++++--- block/raw-format.c | 6 +++--- include/block/block-io.h | 3 ++- include/block/block_int-common.h | 2 +- include/sysemu/block-backend-io.h | 4 +++- 9 files changed, 25 insertions(+), 21 deletions(-) diff --git a/block.c b/block.c index 46c7e57959..61ece8207d 100644 --- a/block.c +++ b/block.c @@ -6821,13 +6821,13 @@ 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(); - if (drv && drv->bdrv_eject) { - drv->bdrv_eject(bs, eject_flag); + if (drv && drv->bdrv_co_eject) { + drv->bdrv_co_eject(bs, eject_flag); } } diff --git a/block/block-backend.c b/block/block-backend.c index b4a8d259cf..7eaafc85b1 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -2009,14 +2009,14 @@ 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(); 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 8cad979e29..4204931277 100644 --- a/block/copy-on-read.c +++ b/block/copy-on-read.c @@ -217,9 +217,9 @@ static int coroutine_fn cor_co_pwritev_compressed(BlockDriverState *bs, } -static void cor_eject(BlockDriverState *bs, bool eject_flag) +static void coroutine_fn cor_co_eject(BlockDriverState *bs, bool eject_flag) { - bdrv_eject(bs->file->bs, eject_flag); + bdrv_co_eject(bs->file->bs, eject_flag); } @@ -258,7 +258,7 @@ static BlockDriver bdrv_copy_on_read = { .bdrv_co_pdiscard = cor_co_pdiscard, .bdrv_co_pwritev_compressed = cor_co_pwritev_compressed, - .bdrv_eject = cor_eject, + .bdrv_co_eject = cor_co_eject, .bdrv_lock_medium = cor_lock_medium, .has_variable_length = true, diff --git a/block/file-posix.c b/block/file-posix.c index c76ed7d9a7..a223dba7a5 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -3765,7 +3765,7 @@ static bool coroutine_fn cdrom_co_is_inserted(BlockDriverState *bs) return ret == CDS_DISC_OK; } -static void cdrom_eject(BlockDriverState *bs, bool eject_flag) +static void coroutine_fn cdrom_co_eject(BlockDriverState *bs, bool eject_flag) { BDRVRawState *s = bs->opaque; @@ -3823,7 +3823,7 @@ static BlockDriver bdrv_host_cdrom = { /* removable device support */ .bdrv_co_is_inserted = cdrom_co_is_inserted, - .bdrv_eject = cdrom_eject, + .bdrv_co_eject = cdrom_co_eject, .bdrv_lock_medium = cdrom_lock_medium, /* generic scsi device */ @@ -3886,7 +3886,7 @@ static bool coroutine_fn cdrom_co_is_inserted(BlockDriverState *bs) return raw_co_getlength(bs) > 0; } -static void cdrom_eject(BlockDriverState *bs, bool eject_flag) +static void coroutine_fn cdrom_co_eject(BlockDriverState *bs, bool eject_flag) { BDRVRawState *s = bs->opaque; @@ -3952,7 +3952,7 @@ static BlockDriver bdrv_host_cdrom = { /* removable device support */ .bdrv_co_is_inserted = cdrom_co_is_inserted, - .bdrv_eject = cdrom_eject, + .bdrv_co_eject = cdrom_co_eject, .bdrv_lock_medium = cdrom_lock_medium, }; #endif /* __FreeBSD__ */ diff --git a/block/filter-compress.c b/block/filter-compress.c index bcf76ac910..1e869bd304 100644 --- a/block/filter-compress.c +++ b/block/filter-compress.c @@ -117,9 +117,10 @@ static void compress_refresh_limits(BlockDriverState *bs, Error **errp) } -static void compress_eject(BlockDriverState *bs, bool eject_flag) +static void coroutine_fn +compress_co_eject(BlockDriverState *bs, bool eject_flag) { - bdrv_eject(bs->file->bs, eject_flag); + bdrv_co_eject(bs->file->bs, eject_flag); } @@ -143,7 +144,7 @@ static BlockDriver bdrv_compress = { .bdrv_co_pdiscard = compress_co_pdiscard, .bdrv_refresh_limits = compress_refresh_limits, - .bdrv_eject = compress_eject, + .bdrv_co_eject = compress_co_eject, .bdrv_lock_medium = compress_lock_medium, .has_variable_length = true, diff --git a/block/raw-format.c b/block/raw-format.c index 33d94e290b..21aa7fdaaf 100644 --- a/block/raw-format.c +++ b/block/raw-format.c @@ -405,9 +405,9 @@ static int coroutine_fn raw_co_truncate(BlockDriverState *bs, int64_t offset, return bdrv_co_truncate(bs->file, offset, exact, prealloc, flags, errp); } -static void raw_eject(BlockDriverState *bs, bool eject_flag) +static void coroutine_fn raw_co_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) @@ -631,7 +631,7 @@ BlockDriver bdrv_raw = { .bdrv_refresh_limits = &raw_refresh_limits, .bdrv_probe_blocksizes = &raw_probe_blocksizes, .bdrv_probe_geometry = &raw_probe_geometry, - .bdrv_eject = &raw_eject, + .bdrv_co_eject = &raw_co_eject, .bdrv_lock_medium = &raw_lock_medium, .bdrv_co_ioctl = &raw_co_ioctl, .create_opts = &raw_create_opts, diff --git a/include/block/block-io.h b/include/block/block-io.h index ed5a0fd01b..ecf62cdc4e 100644 --- a/include/block/block-io.h +++ b/include/block/block-io.h @@ -147,7 +147,8 @@ bool coroutine_fn bdrv_co_is_inserted(BlockDriverState *bs); bool co_wrapper 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 7c9406a6df..41429660de 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -708,7 +708,7 @@ struct BlockDriver { /* removable device specific */ bool coroutine_fn (*bdrv_co_is_inserted)(BlockDriverState *bs); - void (*bdrv_eject)(BlockDriverState *bs, bool eject_flag); + void coroutine_fn (*bdrv_co_eject)(BlockDriverState *bs, bool eject_flag); void (*bdrv_lock_medium)(BlockDriverState *bs, bool locked); /* to control generic scsi devices */ diff --git a/include/sysemu/block-backend-io.h b/include/sysemu/block-backend-io.h index ce013b3312..3db103087c 100644 --- a/include/sysemu/block-backend-io.h +++ b/include/sysemu/block-backend-io.h @@ -60,7 +60,9 @@ bool co_wrapper_mixed 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 co_wrapper blk_eject(BlockBackend *blk, bool eject_flag); int64_t coroutine_fn blk_co_getlength(BlockBackend *blk); int64_t co_wrapper_mixed blk_getlength(BlockBackend *blk);