diff options
author | Emanuele Giuseppe Esposito <eesposit@redhat.com> | 2023-01-13 21:42:09 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2023-02-01 16:52:32 +0100 |
commit | 2531b390fbf67ceccf63f7d236ab2a998f135624 (patch) | |
tree | 267449317e83b2b78a55361a8dbb5d3f6fb8b846 /block | |
parent | 3d47eb0a2a42b13734d1beb75c4310b3881f906f (diff) |
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 <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20230113204212.359076-12-kwolf@redhat.com>
Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/block-backend.c | 4 | ||||
-rw-r--r-- | block/copy-on-read.c | 6 | ||||
-rw-r--r-- | block/file-posix.c | 8 | ||||
-rw-r--r-- | block/filter-compress.c | 7 | ||||
-rw-r--r-- | block/raw-format.c | 6 |
5 files changed, 16 insertions, 15 deletions
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, |