This patch converts bdrv_create, bdrv_create_file and bdrv_img_create to be coroutine only functions. It adds a synchronous wrapper, bdrv_sync_create, for any synchronous callers.
Signed-off-by: Charlie Shepherd <char...@ctshepherd.com> --- block.c | 56 +++++++++++++++++++++++++-------------------------- include/block/block.h | 8 +++++--- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/block.c b/block.c index 1f9f653..51a6649 100644 --- a/block.c +++ b/block.c @@ -364,7 +364,7 @@ BlockDriver *bdrv_find_whitelisted_format(const char *format_name, typedef struct CreateCo { BlockDriver *drv; - char *filename; + const char *filename; QEMUOptionParameter *options; int ret; } CreateCo; @@ -372,48 +372,48 @@ typedef struct CreateCo { static void coroutine_fn bdrv_create_co_entry(void *opaque) { CreateCo *cco = opaque; - assert(cco->drv); - - cco->ret = cco->drv->bdrv_co_create(cco->filename, cco->options); + cco->ret = bdrv_create(cco->drv, cco->filename, cco->options); } -int bdrv_create(BlockDriver *drv, const char* filename, +int coroutine_fn bdrv_create(BlockDriver *drv, const char* filename, QEMUOptionParameter *options) { int ret; + char *dup_fn; + assert(drv); + if (!drv->bdrv_co_create) { + return -ENOTSUP; + } + + dup_fn = g_strdup(filename); + ret = drv->bdrv_co_create(dup_fn, options); + g_free(dup_fn); + return ret; +} + + +int bdrv_sync_create(BlockDriver *drv, const char* filename, + QEMUOptionParameter *options) +{ Coroutine *co; CreateCo cco = { .drv = drv, - .filename = g_strdup(filename), + .filename = filename, .options = options, .ret = NOT_DONE, }; - if (!drv->bdrv_co_create) { - ret = -ENOTSUP; - goto out; - } - - if (qemu_in_coroutine()) { - /* Fast-path if already in coroutine context */ - bdrv_create_co_entry(&cco); - } else { - co = qemu_coroutine_create(bdrv_create_co_entry); - qemu_coroutine_enter(co, &cco); - while (cco.ret == NOT_DONE) { - qemu_aio_wait(); - } + co = qemu_coroutine_create(bdrv_create_co_entry); + qemu_coroutine_enter(co, &cco); + while (cco.ret == NOT_DONE) { + qemu_aio_wait(); } - ret = cco.ret; - -out: - g_free(cco.filename); - return ret; + return cco.ret; } -int bdrv_create_file(const char* filename, QEMUOptionParameter *options) +int coroutine_fn bdrv_create_file(const char* filename, QEMUOptionParameter *options) { BlockDriver *drv; @@ -1035,7 +1035,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options, drv->format_name); } - ret = bdrv_create(bdrv_qcow2, tmp_filename, create_options); + ret = bdrv_sync_create(bdrv_qcow2, tmp_filename, create_options); free_option_parameters(create_options); if (ret < 0) { goto fail; @@ -4463,7 +4463,7 @@ bdrv_acct_done(BlockDriverState *bs, BlockAcctCookie *cookie) bs->total_time_ns[cookie->type] += get_clock() - cookie->start_time_ns; } -void bdrv_img_create(const char *filename, const char *fmt, +void coroutine_fn bdrv_img_create(const char *filename, const char *fmt, const char *base_filename, const char *base_fmt, char *options, uint64_t img_size, int flags, Error **errp, bool quiet) diff --git a/include/block/block.h b/include/block/block.h index 742fce5..c6a3aaf 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -116,9 +116,11 @@ BlockDriver *bdrv_find_protocol(const char *filename, BlockDriver *bdrv_find_format(const char *format_name); BlockDriver *bdrv_find_whitelisted_format(const char *format_name, bool readonly); -int bdrv_create(BlockDriver *drv, const char* filename, +int coroutine_fn bdrv_create(BlockDriver *drv, const char* filename, QEMUOptionParameter *options); -int bdrv_create_file(const char* filename, QEMUOptionParameter *options); +int bdrv_sync_create(BlockDriver *drv, const char* filename, + QEMUOptionParameter *options); +int coroutine_fn bdrv_create_file(const char* filename, QEMUOptionParameter *options); BlockDriverState *bdrv_new(const char *device_name); void bdrv_make_anon(BlockDriverState *bs); void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old); @@ -336,7 +338,7 @@ int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf, int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size); -void bdrv_img_create(const char *filename, const char *fmt, +void coroutine_fn bdrv_img_create(const char *filename, const char *fmt, const char *base_filename, const char *base_fmt, char *options, uint64_t img_size, int flags, Error **errp, bool quiet); -- 1.8.3.2