The 'libvirt-tmp-activewrite' bitmap is added during the 'pivot' operation of block copy and active layer block commit operations regardless of whether there are any bitmaps to merge, but was not removed unless a bitmap was merged. This meant that subsequent attempts to merge into the same image would fail. Fix it by checking whether the 'libvirt-tmp-activewrite' would be used by the code and don't skip the code which would delete it. This is a regression introduced when we switched to the new code for block commit in <20a7abc2d2d> and for block copy in <7bfff40fdfe5>. The actual bug originates from <4fa8654ece>. https://bugzilla.redhat.com/show_bug.cgi?id=1857735 Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_block.c | 3 ++- tests/qemublocktestdata/bitmapblockcommit/empty | 9 +++++++++ .../bitmapblockcopy/empty-deep-out.json | 9 +++++++++ .../bitmapblockcopy/empty-shallow-out.json | 9 +++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index a2eabbcd64..c8607e56a8 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -2962,7 +2962,7 @@ qemuBlockGetBitmapMergeActions(virStorageSourcePtr topsrc, if (!(bitmaps = qemuBlockGetBitmapMergeActionsGetBitmaps(topsrc, bitmapname, blockNamedNodeData))) - return 0; + goto done; for (next = bitmaps; next; next = next->next) { const char *curbitmap = next->data; @@ -3019,6 +3019,7 @@ qemuBlockGetBitmapMergeActions(virStorageSourcePtr topsrc, return -1; } + done: if (writebitmapsrc && qemuMonitorTransactionBitmapRemove(act, writebitmapsrc->nodeformat, "libvirt-tmp-activewrite") < 0) diff --git a/tests/qemublocktestdata/bitmapblockcommit/empty b/tests/qemublocktestdata/bitmapblockcommit/empty index 9260011852..eddef0ddcd 100644 --- a/tests/qemublocktestdata/bitmapblockcommit/empty +++ b/tests/qemublocktestdata/bitmapblockcommit/empty @@ -1 +1,10 @@ merge bitmpas: +[ + { + "type": "block-dirty-bitmap-remove", + "data": { + "node": "libvirt-2-format", + "name": "libvirt-tmp-activewrite" + } + } +] diff --git a/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json index e69de29bb2..99f2589ed4 100644 --- a/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json +++ b/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json @@ -0,0 +1,9 @@ +[ + { + "type": "block-dirty-bitmap-remove", + "data": { + "node": "mirror-format-node", + "name": "libvirt-tmp-activewrite" + } + } +] diff --git a/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json index e69de29bb2..99f2589ed4 100644 --- a/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json +++ b/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json @@ -0,0 +1,9 @@ +[ + { + "type": "block-dirty-bitmap-remove", + "data": { + "node": "mirror-format-node", + "name": "libvirt-tmp-activewrite" + } + } +] -- 2.26.2