render / rpms / libvirt

Forked from rpms/libvirt 9 months ago
Clone
a41c76
From 14b1e4fc93ba1a87854aa1afaf519cc3accff4c6 Mon Sep 17 00:00:00 2001
a41c76
Message-Id: <14b1e4fc93ba1a87854aa1afaf519cc3accff4c6@dist-git>
a41c76
From: Peter Krempa <pkrempa@redhat.com>
a41c76
Date: Tue, 23 Jun 2020 12:23:34 +0200
a41c76
Subject: [PATCH] qemu: backup: Fix handling of backing store for backup target
a41c76
 images
a41c76
MIME-Version: 1.0
a41c76
Content-Type: text/plain; charset=UTF-8
a41c76
Content-Transfer-Encoding: 8bit
a41c76
a41c76
We always tried to install backing store for the image even if it didn't
a41c76
make sense, e.g. for a full backup into a raw image. Additionally we
a41c76
didn't record the backing file into the qcow2 metadata so the image
a41c76
itself contained the diff of data but reading from it would be
a41c76
incomplete as it depends on the backing image.
a41c76
a41c76
This patch fixes both issues by carefully installing the correct backing
a41c76
file when appropriate and also recording it into the metadata when
a41c76
creating the image.
a41c76
a41c76
https://bugzilla.redhat.com/show_bug.cgi?id=1813310
a41c76
a41c76
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
a41c76
Reviewed-by: Ján Tomko <jtomko@redhat.com>
a41c76
(cherry picked from commit 4aea6f42fe32175ce0cb9015913db536097130e4)
a41c76
https://bugzilla.redhat.com/show_bug.cgi?id=1804593
a41c76
Message-Id: <8c4ebc06863aac1f75532b6633772944a6b0bd2a.1592906423.git.pkrempa@redhat.com>
a41c76
Reviewed-by: Ján Tomko <jtomko@redhat.com>
a41c76
---
a41c76
 src/qemu/qemu_backup.c | 26 ++++++++++++++++++++++----
a41c76
 1 file changed, 22 insertions(+), 4 deletions(-)
a41c76
a41c76
diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c
a41c76
index 9a056fa407..5d18720f53 100644
a41c76
--- a/src/qemu/qemu_backup.c
a41c76
+++ b/src/qemu/qemu_backup.c
a41c76
@@ -105,6 +105,8 @@ struct qemuBackupDiskData {
a41c76
     virDomainDiskDefPtr domdisk;
a41c76
     qemuBlockJobDataPtr blockjob;
a41c76
     virStorageSourcePtr store;
a41c76
+    virStorageSourcePtr terminator;
a41c76
+    virStorageSourcePtr backingStore;
a41c76
     char *incrementalBitmap;
a41c76
     qemuBlockStorageSourceChainDataPtr crdata;
a41c76
     bool labelled;
a41c76
@@ -146,6 +148,7 @@ qemuBackupDiskDataCleanupOne(virDomainObjPtr vm,
a41c76
         qemuBlockJobStartupFinalize(vm, dd->blockjob);
a41c76
 
a41c76
     qemuBlockStorageSourceChainDataFree(dd->crdata);
a41c76
+    virObjectUnref(dd->terminator);
a41c76
 }
a41c76
 
a41c76
 
a41c76
@@ -295,6 +298,7 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm,
a41c76
                              virDomainBackupDiskDefPtr backupdisk,
a41c76
                              struct qemuBackupDiskData *dd,
a41c76
                              virJSONValuePtr actions,
a41c76
+                             bool pull,
a41c76
                              virDomainMomentDefPtr *incremental,
a41c76
                              virHashTablePtr blockNamedNodeData,
a41c76
                              virQEMUDriverConfigPtr cfg)
a41c76
@@ -314,6 +318,19 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm,
a41c76
     if (!dd->store->format)
a41c76
         dd->store->format = VIR_STORAGE_FILE_QCOW2;
a41c76
 
a41c76
+    /* calculate backing store to use:
a41c76
+     * push mode:
a41c76
+     *   full backups: no backing store
a41c76
+     *   incremental: original disk if format supports backing store
a41c76
+     * pull mode:
a41c76
+     *   both: original disk
a41c76
+     */
a41c76
+    if (pull || (incremental && dd->store->format >= VIR_STORAGE_FILE_BACKING)) {
a41c76
+        dd->backingStore = dd->domdisk->src;
a41c76
+    } else {
a41c76
+        dd->backingStore = dd->terminator = virStorageSourceNew();
a41c76
+    }
a41c76
+
a41c76
     if (qemuDomainStorageFileInit(priv->driver, vm, dd->store, dd->domdisk->src) < 0)
a41c76
         return -1;
a41c76
 
a41c76
@@ -337,7 +354,7 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm,
a41c76
 
a41c76
     /* use original disk as backing to prevent opening the backing chain */
a41c76
     if (!(dd->crdata = qemuBuildStorageSourceChainAttachPrepareBlockdevTop(dd->store,
a41c76
-                                                                           dd->domdisk->src,
a41c76
+                                                                           dd->backingStore,
a41c76
                                                                            priv->qemuCaps)))
a41c76
         return -1;
a41c76
 
a41c76
@@ -398,6 +415,7 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm,
a41c76
     struct qemuBackupDiskData *disks = NULL;
a41c76
     ssize_t ndisks = 0;
a41c76
     size_t i;
a41c76
+    bool pull = def->type == VIR_DOMAIN_BACKUP_TYPE_PULL;
a41c76
 
a41c76
     disks = g_new0(struct qemuBackupDiskData, def->ndisks);
a41c76
 
a41c76
@@ -410,12 +428,12 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm,
a41c76
 
a41c76
         ndisks++;
a41c76
 
a41c76
-        if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions,
a41c76
+        if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions, pull,
a41c76
                                          incremental, blockNamedNodeData,
a41c76
                                          cfg) < 0)
a41c76
             goto error;
a41c76
 
a41c76
-        if (def->type == VIR_DOMAIN_BACKUP_TYPE_PULL) {
a41c76
+        if (pull) {
a41c76
             if (qemuBackupDiskPrepareDataOnePull(actions, dd) < 0)
a41c76
                 goto error;
a41c76
         } else {
a41c76
@@ -480,7 +498,7 @@ qemuBackupDiskPrepareOneStorage(virDomainObjPtr vm,
a41c76
                                                    dd->store, dd->domdisk->src) < 0)
a41c76
             return -1;
a41c76
 
a41c76
-        if (qemuBlockStorageSourceCreate(vm, dd->store, NULL, NULL,
a41c76
+        if (qemuBlockStorageSourceCreate(vm, dd->store, dd->backingStore, NULL,
a41c76
                                          dd->crdata->srcdata[0],
a41c76
                                          QEMU_ASYNC_JOB_BACKUP) < 0)
a41c76
             return -1;
a41c76
-- 
a41c76
2.27.0
a41c76