/* * File is generated by scripts/coroutine-wrapper.py */ #include "qemu/osdep.h" #include "block/block_int.h" /* * Wrappers for bdrv_co_check */ typedef struct bdrv_co_check__ArgumentsPack { BlockDriverState *bs; BdrvCheckResult *res; BdrvCheckMode fix; int _ret; bool _in_progress; } bdrv_co_check__ArgumentsPack; static void bdrv_co_check__entry(void *opaque) { bdrv_co_check__ArgumentsPack *pack = opaque; pack->_ret = bdrv_co_check(pack->bs, pack->res, pack->fix); pack->_in_progress = false; aio_wait_kick(); } int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix) { if (qemu_in_coroutine()) { /* Fast-path if already in coroutine context */ return bdrv_co_check(bs, res, fix); } else { bdrv_co_check__ArgumentsPack pack = { .bs = bs, .res = res, .fix = fix, ._in_progress = true, }; Coroutine *co = qemu_coroutine_create(bdrv_co_check__entry, &pack); bdrv_coroutine_enter(bs, co); BDRV_POLL_WHILE(bs, pack._in_progress); return pack._ret; } } /* * Wrappers for bdrv_co_invalidate_cache */ typedef struct bdrv_co_invalidate_cache__ArgumentsPack { BlockDriverState *bs; Error **errp; bool _in_progress; } bdrv_co_invalidate_cache__ArgumentsPack; static void bdrv_co_invalidate_cache__entry(void *opaque) { bdrv_co_invalidate_cache__ArgumentsPack *pack = opaque; bdrv_co_invalidate_cache(pack->bs, pack->errp); pack->_in_progress = false; aio_wait_kick(); } void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp) { if (qemu_in_coroutine()) { /* Fast-path if already in coroutine context */ bdrv_co_invalidate_cache(bs, errp); } else { bdrv_co_invalidate_cache__ArgumentsPack pack = { .bs = bs, .errp = errp, ._in_progress = true, }; Coroutine *co = qemu_coroutine_create(bdrv_co_invalidate_cache__entry, &pack); bdrv_coroutine_enter(bs, co); BDRV_POLL_WHILE(bs, pack._in_progress); } }