bdrv_open*() must not be called from coroutine context, amongst others because it modifies the block graph. However, some functions - in particular all .bdrv_co_create* implementations of image formats - do call it from coroutine context. This is already wrong today, but when we add locking, it actually becomes visible.
This series adds no_co_wrapper functions, which are automatically generated wrappers that run in coroutine context and use a BH to call the wrapped function outside of coroutine context. It then uses these wrappers to fix the problematic bdrv_open*() calls. Kevin Wolf (13): block-coroutine-wrapper: Introduce no_co_wrapper block: Create no_co_wrappers for open functions luks: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper parallels: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper qcow: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper qcow2: Fix open/create to open images with no_co_wrapper qed: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper vdi: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper vhdx: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper vmdk: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper vpc: Fix .bdrv_co_create(_opts) to open images with no_co_wrapper block: Fix bdrv_co_create_opts_simple() to open images with no_co_wrapper block: Assert non-coroutine context for bdrv_open_inherit() include/block/block-common.h | 14 ++++ include/block/block-global-state.h | 35 ++++++--- include/sysemu/block-backend-global-state.h | 21 +++++- block.c | 17 ++--- block/crypto.c | 10 +-- block/parallels.c | 10 +-- block/qcow.c | 10 +-- block/qcow2.c | 43 +++++------ block/qed.c | 10 +-- block/vdi.c | 10 +-- block/vhdx.c | 10 +-- block/vmdk.c | 22 +++--- block/vpc.c | 10 +-- scripts/block-coroutine-wrapper.py | 83 ++++++++++++++++++--- block/meson.build | 1 + 15 files changed, 207 insertions(+), 99 deletions(-) -- 2.38.1