Currently, bdrv_close_all() force-closes all BDSs with a BlockBackend, which can lead to data corruption (see the iotest added in the final patch of this series) and is most certainly very ugly.
This series reworks bdrv_close_all() to notify all owners of a BlockBackend that they should release their reference (and additionally the monitor releases all its references to BB-less BDSs). This way, force-closing becomes unnecessary. Also, blk_hide_on_behalf_of_do_drive_del() is removed. Yay! This series depends on v2 of my series "blockdev: BlockBackend and media" (or any later version), and on my series "nbd: Drop BDS backpointer" (on the patch "iotests: Add 'wait' functionality to _cleanup_qemu"). v2: - Dropped old patches 1 (squashed into "blockdev: BlockBackend and media") and 20 (put into "nbd: Drop BDS backpointer") - Patch 1: Added (required for patch 3) - Patch 2: Added (required for patch 3); if someone has a better solution, I'd be very grateful - Patch 3: Added a test which ensures that if the BDS an NBD server is attached to through a BB is ejected, that NBD server is stopped - Patch 5: Replaces the old patch 5 (which removed the BDS close notifiers completely); as pointed out by Paolo, we do need the notifiers as eject notifiers for NBD, so this patch replaces the per-BDS close notifiers by an eject notifier for the BB which is called whenever blk_remove_bs() is called and removes a BDS tree from the BB - Patch 7: Fixed up to fit onto patch 5 - Patch 11: s/namespaces/namespace/ [Eric] - Patch 14: Rebase conflict due to the new bdrv_add_key() function git-backport-diff against v1: Key: [----] : patches are identical [####] : number of functional differences between upstream/downstream patch [down] : patch is downstream-only The flags [FC] indicate (F)unctional and (C)ontextual differences, respectively 001/22:[down] 'iotests: Move _filter_nbd into common.filter' 002/22:[down] 'iotests: Do not redirect qemu's stderr' 003/22:[down] 'iotests: Add test for eject under NBD server' 004/22:[----] [-C] 'quorum: Fix close path' 005/22:[down] 'block: Move BDS close notifiers into BB' 006/22:[----] [--] 'block: Add bdrv_close_all() notifiers' 007/22:[0075] [FC] 'block: Add bdrv_close_all() handlers' 008/22:[----] [-C] 'block: Use blk_remove_bs() in blk_delete()' 009/22:[----] [--] 'blockdev: Use blk_remove_bs() in do_drive_del()' 010/22:[----] [--] 'block: Make bdrv_close() static' 011/22:[0002] [FC] 'block: Add blk_name_taken()' 012/22:[----] [--] 'block: Add blk_next_inserted()' 013/22:[----] [--] 'block: Add blk_commit_all() and blk_invalidate_cache_all()' 014/22:[0009] [FC] 'block: Use BlockBackend more' 015/22:[----] [--] 'blockdev: Add list of monitor-owned BlockBackends' 016/22:[----] [--] 'blockdev: Remove blk_hide_on_behalf_of_do_drive_del()' 017/22:[----] [--] 'block: Make bdrv_drain_one() public' 018/22:[----] [-C] 'block: Move some bdrv_*_all() functions to BB' 019/22:[----] [--] 'block: Remove bdrv_states' 020/22:[----] [--] 'blockdev: Keep track of monitor-owned BDS' 021/22:[----] [--] 'block: Strip down bdrv_close_all()' 022/22:[----] [--] 'iotests: Add test for multiple BB on BDS tree' Max Reitz (22): iotests: Move _filter_nbd into common.filter iotests: Do not redirect qemu's stderr iotests: Add test for eject under NBD server quorum: Fix close path block: Move BDS close notifiers into BB block: Add bdrv_close_all() notifiers block: Add bdrv_close_all() handlers block: Use blk_remove_bs() in blk_delete() blockdev: Use blk_remove_bs() in do_drive_del() block: Make bdrv_close() static block: Add blk_name_taken() block: Add blk_next_inserted() block: Add blk_commit_all() and blk_invalidate_cache_all() block: Use BlockBackend more blockdev: Add list of monitor-owned BlockBackends blockdev: Remove blk_hide_on_behalf_of_do_drive_del() block: Make bdrv_drain_one() public block: Move some bdrv_*_all() functions to BB block: Remove bdrv_states blockdev: Keep track of monitor-owned BDS block: Strip down bdrv_close_all() iotests: Add test for multiple BB on BDS tree block.c | 168 ++++------------------ block/block-backend.c | 301 +++++++++++++++++++++++++++++++-------- block/qapi.c | 13 +- block/quorum.c | 3 +- block/snapshot.c | 3 +- blockdev-nbd.c | 36 +---- blockdev.c | 121 +++++++++++++--- cpus.c | 7 +- device-hotplug.c | 2 +- hw/block/xen_disk.c | 16 ++- hw/ide/piix.c | 1 - include/block/block.h | 9 +- include/block/block_int.h | 8 +- include/sysemu/block-backend.h | 24 ++-- include/sysemu/blockdev.h | 3 + migration/block.c | 10 +- migration/migration.c | 4 +- monitor.c | 13 +- nbd.c | 59 +++++++- qemu-char.c | 3 +- qemu-img.c | 39 ++--- qemu-io.c | 8 +- qemu-nbd.c | 6 +- qmp.c | 9 +- savevm.c | 66 +++++---- stubs/Makefile.objs | 2 +- stubs/bdrv-commit-all.c | 7 - stubs/blk-commit-all.c | 7 + tests/qemu-iotests/083 | 13 +- tests/qemu-iotests/083.out | 10 -- tests/qemu-iotests/091 | 3 +- tests/qemu-iotests/096 | 89 ++++++++++++ tests/qemu-iotests/096.out | 16 +++ tests/qemu-iotests/117 | 86 +++++++++++ tests/qemu-iotests/117.out | 14 ++ tests/qemu-iotests/common.filter | 12 ++ tests/qemu-iotests/common.qemu | 1 - tests/qemu-iotests/group | 2 + xen-mapcache.c | 3 +- 39 files changed, 807 insertions(+), 390 deletions(-) delete mode 100644 stubs/bdrv-commit-all.c create mode 100644 stubs/blk-commit-all.c create mode 100755 tests/qemu-iotests/096 create mode 100644 tests/qemu-iotests/096.out create mode 100755 tests/qemu-iotests/117 create mode 100644 tests/qemu-iotests/117.out -- 2.1.0