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(a)redhat.com>
---
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