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. v2: - Added patches 5 and 6 [Paolo] - Fixed commit message of patch 1 [Eric] Kevin Wolf (6): 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: Don't wait for requests in bdrv_drain*_end() block: Unify order in drain functions block/io.c | 31 +++++++---- tests/test-bdrv-drain.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/Makefile.include | 2 + 3 files changed, 159 insertions(+), 11 deletions(-) create mode 100644 tests/test-bdrv-drain.c -- 2.13.6