Blame SOURCES/libvirt-qemu-block-Remove-active-write-bitmap-even-if-there-are-no-bitmaps-to-merge.patch

79b470
From cb297cdd8dc75abc8fd0d60dddf54cbe305d4c14 Mon Sep 17 00:00:00 2001
79b470
Message-Id: <cb297cdd8dc75abc8fd0d60dddf54cbe305d4c14@dist-git>
79b470
From: Peter Krempa <pkrempa@redhat.com>
79b470
Date: Tue, 21 Jul 2020 13:56:23 +0200
79b470
Subject: [PATCH] qemu: block: Remove 'active-write' bitmap even if there are
79b470
 no bitmaps to merge
79b470
79b470
The 'libvirt-tmp-activewrite' bitmap is added during the 'pivot'
79b470
operation of block copy and active layer block commit operations
79b470
regardless of whether there are any bitmaps to merge, but was not
79b470
removed unless a bitmap was merged. This meant that subsequent attempts
79b470
to merge into the same image would fail.
79b470
79b470
Fix it by checking whether the 'libvirt-tmp-activewrite' would be used
79b470
by the code and don't skip the code which would delete it.
79b470
79b470
This is a regression introduced when we switched to the new code for
79b470
block commit in <20a7abc2d2d> and for block copy in <7bfff40fdfe5>. The
79b470
actual bug originates from <4fa8654ece>.
79b470
79b470
https://bugzilla.redhat.com/show_bug.cgi?id=1857735
79b470
79b470
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
79b470
Reviewed-by: Eric Blake <eblake@redhat.com>
79b470
(cherry picked from commit 9d039863e2cae227cc73b7a886b40be5e5218a12)
79b470
79b470
rhel-8.3: https://bugzilla.redhat.com/show_bug.cgi?id=1857779
79b470
rhel-av-8.2.1: not cloned yet
79b470
Message-Id: <4fea6a40be534d5a6fe7aad88d6bee1c3e77dcfb.1595332476.git.pkrempa@redhat.com>
79b470
79b470
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
79b470
---
79b470
 src/qemu/qemu_block.c                                    | 3 ++-
79b470
 tests/qemublocktestdata/bitmapblockcommit/empty          | 9 +++++++++
79b470
 .../bitmapblockcopy/empty-deep-out.json                  | 9 +++++++++
79b470
 .../bitmapblockcopy/empty-shallow-out.json               | 9 +++++++++
79b470
 4 files changed, 29 insertions(+), 1 deletion(-)
79b470
79b470
diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
79b470
index 18c3861a2e..dc5fa3da03 100644
79b470
--- a/src/qemu/qemu_block.c
79b470
+++ b/src/qemu/qemu_block.c
79b470
@@ -2935,7 +2935,7 @@ qemuBlockGetBitmapMergeActions(virStorageSourcePtr topsrc,
79b470
 
79b470
     if (!(bitmaps = qemuBlockGetBitmapMergeActionsGetBitmaps(topsrc, bitmapname,
79b470
                                                              blockNamedNodeData)))
79b470
-        return 0;
79b470
+        goto done;
79b470
 
79b470
     for (next = bitmaps; next; next = next->next) {
79b470
         const char *curbitmap = next->data;
79b470
@@ -2992,6 +2992,7 @@ qemuBlockGetBitmapMergeActions(virStorageSourcePtr topsrc,
79b470
             return -1;
79b470
     }
79b470
 
79b470
+ done:
79b470
     if (writebitmapsrc &&
79b470
         qemuMonitorTransactionBitmapRemove(act, writebitmapsrc->nodeformat,
79b470
                                            "libvirt-tmp-activewrite") < 0)
79b470
diff --git a/tests/qemublocktestdata/bitmapblockcommit/empty b/tests/qemublocktestdata/bitmapblockcommit/empty
79b470
index 9260011852..eddef0ddcd 100644
79b470
--- a/tests/qemublocktestdata/bitmapblockcommit/empty
79b470
+++ b/tests/qemublocktestdata/bitmapblockcommit/empty
79b470
@@ -1 +1,10 @@
79b470
 merge bitmpas:
79b470
+[
79b470
+  {
79b470
+    "type": "block-dirty-bitmap-remove",
79b470
+    "data": {
79b470
+      "node": "libvirt-2-format",
79b470
+      "name": "libvirt-tmp-activewrite"
79b470
+    }
79b470
+  }
79b470
+]
79b470
diff --git a/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json b/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json
79b470
index e69de29bb2..99f2589ed4 100644
79b470
--- a/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json
79b470
+++ b/tests/qemublocktestdata/bitmapblockcopy/empty-deep-out.json
79b470
@@ -0,0 +1,9 @@
79b470
+[
79b470
+  {
79b470
+    "type": "block-dirty-bitmap-remove",
79b470
+    "data": {
79b470
+      "node": "mirror-format-node",
79b470
+      "name": "libvirt-tmp-activewrite"
79b470
+    }
79b470
+  }
79b470
+]
79b470
diff --git a/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json b/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json
79b470
index e69de29bb2..99f2589ed4 100644
79b470
--- a/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json
79b470
+++ b/tests/qemublocktestdata/bitmapblockcopy/empty-shallow-out.json
79b470
@@ -0,0 +1,9 @@
79b470
+[
79b470
+  {
79b470
+    "type": "block-dirty-bitmap-remove",
79b470
+    "data": {
79b470
+      "node": "mirror-format-node",
79b470
+      "name": "libvirt-tmp-activewrite"
79b470
+    }
79b470
+  }
79b470
+]
79b470
-- 
79b470
2.27.0
79b470