This fixes the following case that was reported by Max and was caused by not correctly waiting for activity to cease on the parent node before attaching a drained child node:
$ ./qemu-img create -f qed foo.qed 64M Formatting 'foo.qed', fmt=qed size=67108864 cluster_size=65536 $ echo "{'execute':'qmp_capabilities'} {'execute':'blockdev-snapshot', 'arguments':{'node':'backing','overlay':'overlay'}} {'execute':'quit'}" | \ x86_64-softmmu/qemu-system-x86_64 -qmp stdio -nodefaults \ -blockdev "{'node-name':'backing','driver':'null-co'}" \ -blockdev "{'node-name':'overlay','driver':'qed', 'file':{'driver':'file','filename':'foo.qed'}}" {"QMP": {"version": {"qemu": {"micro": 50, "minor": 12, "major": 2}, "package": "v2.12.0-1422-g0109e7e6f8"}, "capabilities": []}} {"return": {}} qemu-system-x86_64: block.c:3434: bdrv_replace_node: Assertion `!atomic_read(&to->in_flight)' failed. [1] 5252 done echo | 5253 abort (core dumped) x86_64-softmmu/qemu-system-x86_64 -qmp stdio -nodefaults -blockdev -blockdev Kevin Wolf (2): block: Poll after drain on attaching a node test-bdrv-drain: Test bdrv_append() to drained node include/block/block.h | 8 ++++++++ include/block/block_int.h | 3 +++ block.c | 2 +- block/io.c | 26 ++++++++++++++++++++------ tests/test-bdrv-drain.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 7 deletions(-) -- 2.13.6