I was looking into the drain functions in order to develop them a bit in the direction that Fam suggested, to unify the code between bdrv_drain() and bdrv_drain_all() a bit more, and maybe to find a place to take coroutine locks for graph changes.
The first thing I found is a bug in bdrv_drain_all(), so I'm already sending this part before I have made much progress with my actual plan. Kevin Wolf (4): block: Make bdrv_drain_invoke() recursive block: Call .drain_begin only once in bdrv_drain_all_begin() test-bdrv-drain: Test BlockDriver callbacks for drain block: bdrv_drain_recurse(): Remove unused begin parameter block/io.c | 25 +++++---- tests/test-bdrv-drain.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/Makefile.include | 2 + 3 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 tests/test-bdrv-drain.c -- 2.13.6