Branch: https://github.com/XanClic/qemu.git fix-can-replace-v4 Branch: https://git.xanclic.moe/XanClic/qemu.git fix-can-replace-v4
v1: https://lists.nongnu.org/archive/html/qemu-block/2019-09/msg01027.html v2: https://lists.nongnu.org/archive/html/qemu-block/2019-11/msg00370.html v3: https://lists.nongnu.org/archive/html/qemu-block/2020-01/msg00922.html Hi, For what this series does, see the cover letter of v1 (linked above). Changes in v4 compared to v3: - Following the discussion with Kevin, I changed Quorum’s .bdrv_recurse_can_replace() implementation from unsharing the CONSISTENT_READ permission and taking the WRITE permission to just checking whether there are any other parents - This made the old patches 8 and 9 unnecessary, so they’ve been dropped - And of course it requires some changes to patch 10 (now 8) - (Patch 10 (was: 12) gets a rebase conflict that’s obvious to resolve, so I kept Vladimir’s R-b) - As suggested by Vladimir, I added the root node name to the cannot-follow-path error message in patch 14 (was: 16), and added an assertion that the root node exists in the first place git-backport-diff against v3: 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/19:[----] [--] 'blockdev: Allow external snapshots everywhere' 002/19:[----] [--] 'blockdev: Allow resizing everywhere' 003/19:[----] [--] 'block: Drop bdrv_is_first_non_filter()' 004/19:[----] [--] 'iotests: Let 041 use -blockdev for quorum children' 005/19:[----] [--] 'quorum: Fix child permissions' 006/19:[----] [--] 'block: Add bdrv_recurse_can_replace()' 007/19:[----] [--] 'blkverify: Implement .bdrv_recurse_can_replace()' 008/19:[0019] [FC] 'quorum: Implement .bdrv_recurse_can_replace()' 009/19:[----] [--] 'block: Use bdrv_recurse_can_replace()' 010/19:[0002] [FC] 'block: Remove bdrv_recurse_is_first_non_filter()' 011/19:[----] [--] 'mirror: Double-check immediately before replacing' 012/19:[----] [--] 'quorum: Stop marking it as a filter' 013/19:[----] [--] 'iotests: Use complete_and_wait() in 155' 014/19:[0005] [FC] 'iotests: Add VM.assert_block_path()' 015/19:[----] [--] 'iotests/041: Drop superfluous shutdowns' 016/19:[----] [--] 'iotests: Resolve TODOs in 041' 017/19:[----] [--] 'iotests: Use self.image_len in TestRepairQuorum' 018/19:[----] [--] 'iotests: Add tests for invalid Quorum @replaces' 019/19:[----] [--] 'iotests: Check that @replaces can replace filters' Max Reitz (19): blockdev: Allow external snapshots everywhere blockdev: Allow resizing everywhere block: Drop bdrv_is_first_non_filter() iotests: Let 041 use -blockdev for quorum children quorum: Fix child permissions block: Add bdrv_recurse_can_replace() blkverify: Implement .bdrv_recurse_can_replace() quorum: Implement .bdrv_recurse_can_replace() block: Use bdrv_recurse_can_replace() block: Remove bdrv_recurse_is_first_non_filter() mirror: Double-check immediately before replacing quorum: Stop marking it as a filter iotests: Use complete_and_wait() in 155 iotests: Add VM.assert_block_path() iotests/041: Drop superfluous shutdowns iotests: Resolve TODOs in 041 iotests: Use self.image_len in TestRepairQuorum iotests: Add tests for invalid Quorum @replaces iotests: Check that @replaces can replace filters block.c | 85 ++++++++++----------- block/blkverify.c | 20 ++--- block/copy-on-read.c | 9 --- block/filter-compress.c | 9 --- block/mirror.c | 14 +++- block/quorum.c | 70 ++++++++++++++--- block/replication.c | 7 -- block/throttle.c | 8 -- blockdev.c | 10 --- include/block/block.h | 5 -- include/block/block_int.h | 16 ++-- tests/qemu-iotests/041 | 138 +++++++++++++++++++++++++++++----- tests/qemu-iotests/041.out | 4 +- tests/qemu-iotests/155 | 7 +- tests/qemu-iotests/iotests.py | 59 +++++++++++++++ 15 files changed, 315 insertions(+), 146 deletions(-) -- 2.24.1