From: Marc-André Lureau <[email protected]> The functions call coroutine functions or are called by coroutine.
Add an assert() in qcow2_do_close() code path which calls a no_coroutine_fn bdrv_graph_wrlock_drained(). Add an assert() in qcow2_update_options_commit() in the coroutine path. Signed-off-by: Marc-André Lureau <[email protected]> --- v3: - remove indentiation changes leftovers --- include/block/blockjob_int.h | 2 +- block/crypto.c | 13 +++++++------ block/io.c | 8 +++++--- block/qcow2.c | 9 ++++++--- blockjob.c | 3 ++- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index 4c3d2e25a209..34e172874fa9 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -150,7 +150,7 @@ void block_job_ratelimit_processed_bytes(BlockJob *job, uint64_t n); * Put the job to sleep (assuming that it wasn't canceled) to throttle it to the * right speed according to its rate limiting. */ -void block_job_ratelimit_sleep(BlockJob *job); +void coroutine_fn block_job_ratelimit_sleep(BlockJob *job); /** * block_job_error_action: diff --git a/block/crypto.c b/block/crypto.c index 36abb7af4680..8a34d92fded6 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -56,12 +56,13 @@ static int block_crypto_probe_generic(QCryptoBlockFormat format, } -static int block_crypto_read_func(QCryptoBlock *block, - size_t offset, - uint8_t *buf, - size_t buflen, - void *opaque, - Error **errp) +static int coroutine_mixed_fn +block_crypto_read_func(QCryptoBlock *block, + size_t offset, + uint8_t *buf, + size_t buflen, + void *opaque, + Error **errp) { BlockDriverState *bs = opaque; BlockCrypto *crypto = bs->opaque; diff --git a/block/io.c b/block/io.c index a916b236c3c8..99dd16864a3d 100644 --- a/block/io.c +++ b/block/io.c @@ -346,8 +346,9 @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs, assert(data.done); } -static void bdrv_do_drained_begin(BlockDriverState *bs, BdrvChild *parent, - bool poll) +static void coroutine_mixed_fn +bdrv_do_drained_begin(BlockDriverState *bs, BdrvChild *parent, + bool poll) { IO_OR_GS_CODE(); @@ -397,7 +398,8 @@ bdrv_drained_begin(BlockDriverState *bs) * This function does not poll, nor must any of its recursively called * functions. */ -static void bdrv_do_drained_end(BlockDriverState *bs, BdrvChild *parent) +static void coroutine_mixed_fn +bdrv_do_drained_end(BlockDriverState *bs, BdrvChild *parent) { IO_OR_GS_CODE(); diff --git a/block/qcow2.c b/block/qcow2.c index 19271b10a49f..03526c4a131f 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1287,9 +1287,10 @@ fail: } /* s_locked specifies whether s->lock is held or not */ -static void qcow2_update_options_commit(BlockDriverState *bs, - Qcow2ReopenState *r, - bool s_locked) +static coroutine_mixed_fn void +qcow2_update_options_commit(BlockDriverState *bs, + Qcow2ReopenState *r, + bool s_locked) { BDRVQcow2State *s = bs->opaque; int i; @@ -1299,6 +1300,7 @@ static void qcow2_update_options_commit(BlockDriverState *bs, * table caches */ if (s_locked) { + assert(qemu_in_coroutine()); cache_clean_timer_co_locked_del_and_wait(bs); } else { cache_clean_timer_del_and_wait(bs); @@ -2905,6 +2907,7 @@ qcow2_do_close(BlockDriverState *bs, bool close_data_file) g_free(s->image_backing_format); if (close_data_file && has_data_file(bs)) { + assert(!qemu_in_coroutine()); GLOBAL_STATE_CODE(); bdrv_graph_rdunlock_main_loop(); bdrv_graph_wrlock_drained(); diff --git a/blockjob.c b/blockjob.c index f3b11cc7a194..f3ad6a93125a 100644 --- a/blockjob.c +++ b/blockjob.c @@ -338,7 +338,8 @@ void block_job_ratelimit_processed_bytes(BlockJob *job, uint64_t n) ratelimit_calculate_delay(&job->limit, n); } -void block_job_ratelimit_sleep(BlockJob *job) +void coroutine_fn +block_job_ratelimit_sleep(BlockJob *job) { uint64_t delay_ns; -- 2.55.0
