render / rpms / libvirt

Forked from rpms/libvirt 9 months ago
Clone
a41c76
From 85658fdaaf7b24f64c31950f4bf710c0dcdafacd Mon Sep 17 00:00:00 2001
a41c76
Message-Id: <85658fdaaf7b24f64c31950f4bf710c0dcdafacd@dist-git>
a41c76
From: Peter Krempa <pkrempa@redhat.com>
a41c76
Date: Tue, 4 Feb 2020 15:08:27 +0100
a41c76
Subject: [PATCH] qemuDomainBlockPivot: Copy bitmaps backing checkpoints for
a41c76
 virDomainBlockCopy
a41c76
MIME-Version: 1.0
a41c76
Content-Type: text/plain; charset=UTF-8
a41c76
Content-Transfer-Encoding: 8bit
a41c76
a41c76
Use qemuBlockBitmapsHandleBlockcopy to calculate bitmaps to copy over
a41c76
for a block-copy job.
a41c76
a41c76
We copy them when pivoting to the new image as at that point we are
a41c76
certain that we don't dirty any bitmap unnecessarily.
a41c76
a41c76
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
a41c76
Reviewed-by: Ján Tomko <jtomko@redhat.com>
a41c76
(cherry picked from commit 54030892f5122ef120c1e8ffb6e0546871030272)
a41c76
a41c76
https://bugzilla.redhat.com/show_bug.cgi?id=1207659
a41c76
Message-Id: <c60a7a567a634836370fc9c0c38317569fa5a22d.1580824112.git.pkrempa@redhat.com>
a41c76
Reviewed-by: Ján Tomko <jtomko@redhat.com>
a41c76
---
a41c76
 src/qemu/qemu_driver.c | 28 +++++++++++++++++++++++++---
a41c76
 1 file changed, 25 insertions(+), 3 deletions(-)
a41c76
a41c76
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
a41c76
index 71c75b25a6..caeb76a20c 100644
a41c76
--- a/src/qemu/qemu_driver.c
a41c76
+++ b/src/qemu/qemu_driver.c
a41c76
@@ -17552,6 +17552,7 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
a41c76
     int ret = -1;
a41c76
     qemuDomainObjPrivatePtr priv = vm->privateData;
a41c76
     bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
a41c76
+    g_autoptr(virJSONValue) actions = NULL;
a41c76
 
a41c76
     switch ((qemuBlockJobType) job->type) {
a41c76
     case QEMU_BLOCKJOB_TYPE_NONE:
a41c76
@@ -17572,6 +17573,20 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
a41c76
         return -1;
a41c76
 
a41c76
     case QEMU_BLOCKJOB_TYPE_COPY:
a41c76
+        if (blockdev && !job->jobflagsmissing) {
a41c76
+            g_autoptr(virHashTable) blockNamedNodeData = NULL;
a41c76
+            bool shallow = job->jobflags & VIR_DOMAIN_BLOCK_COPY_SHALLOW;
a41c76
+
a41c76
+            if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_NONE)))
a41c76
+                return -1;
a41c76
+
a41c76
+            if (qemuBlockBitmapsHandleBlockcopy(disk->src, disk->mirror,
a41c76
+                                                blockNamedNodeData,
a41c76
+                                                shallow, &actions) < 0)
a41c76
+                return -1;
a41c76
+        }
a41c76
+        break;
a41c76
+
a41c76
     case QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT:
a41c76
         break;
a41c76
     }
a41c76
@@ -17584,10 +17599,17 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
a41c76
     }
a41c76
 
a41c76
     qemuDomainObjEnterMonitor(driver, vm);
a41c76
-    if (blockdev)
a41c76
-        ret = qemuMonitorJobComplete(priv->mon, job->name);
a41c76
-    else
a41c76
+    if (blockdev) {
a41c76
+        int rc = 0;
a41c76
+
a41c76
+        if (actions)
a41c76
+            rc = qemuMonitorTransaction(priv->mon, &actions);
a41c76
+
a41c76
+        if (rc == 0)
a41c76
+            ret = qemuMonitorJobComplete(priv->mon, job->name);
a41c76
+    } else {
a41c76
         ret = qemuMonitorDrivePivot(priv->mon, job->name);
a41c76
+    }
a41c76
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
a41c76
         return -1;
a41c76
 
a41c76
-- 
a41c76
2.25.0
a41c76