Blame SOURCES/libvirt-qemu-snapshot-Load-data-necessary-for-relative-block-commit-to-work.patch

6d3351
From a1c6dd1700b461d84c6db3d62468c60f4e3b0a55 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <a1c6dd1700b461d84c6db3d62468c60f4e3b0a55@dist-git>
6d3351
From: Peter Krempa <pkrempa@redhat.com>
6d3351
Date: Tue, 20 Jun 2017 14:45:38 +0200
6d3351
Subject: [PATCH] qemu: snapshot: Load data necessary for relative block commit
6d3351
 to work
6d3351
6d3351
Commit 7456c4f5f introduced a regression by not reloading the backing
6d3351
chain of a disk after snapshot. The regression was caused as
6d3351
src->relPath was not set and thus the block commit code could not
6d3351
determine the relative path.
6d3351
6d3351
This patch adds code that will load the backing store string if
6d3351
VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT and store it in the correct place
6d3351
when a snapshot is successfully completed.
6d3351
6d3351
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1461303
6d3351
(cherry picked from commit e20853e1d32ff517e6feec3146066ec433fc39e6)
6d3351
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
6d3351
---
6d3351
 src/qemu/qemu_driver.c | 19 +++++++++++++++++--
6d3351
 1 file changed, 17 insertions(+), 2 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
6d3351
index c7c5e28ca3..a2fb41b91a 100644
6d3351
--- a/src/qemu/qemu_driver.c
6d3351
+++ b/src/qemu/qemu_driver.c
6d3351
@@ -14094,6 +14094,7 @@ struct _qemuDomainSnapshotDiskData {
6d3351
     bool created; /* @src was created by the snapshot code */
6d3351
     bool prepared; /* @src was prepared using qemuDomainDiskChainElementPrepare */
6d3351
     virDomainDiskDefPtr disk;
6d3351
+    char *relPath; /* relative path component to fill into original disk */
6d3351
 
6d3351
     virStorageSourcePtr persistsrc;
6d3351
     virDomainDiskDefPtr persistdisk;
6d3351
@@ -14127,6 +14128,7 @@ qemuDomainSnapshotDiskDataFree(qemuDomainSnapshotDiskDataPtr data,
6d3351
             virStorageSourceFree(data[i].src);
6d3351
         }
6d3351
         virStorageSourceFree(data[i].persistsrc);
6d3351
+        VIR_FREE(data[i].relPath);
6d3351
     }
6d3351
 
6d3351
     VIR_FREE(data);
6d3351
@@ -14142,11 +14144,13 @@ qemuDomainSnapshotDiskDataFree(qemuDomainSnapshotDiskDataPtr data,
6d3351
 static qemuDomainSnapshotDiskDataPtr
6d3351
 qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
6d3351
                                   virDomainObjPtr vm,
6d3351
-                                  virDomainSnapshotObjPtr snap)
6d3351
+                                  virDomainSnapshotObjPtr snap,
6d3351
+                                  bool reuse)
6d3351
 {
6d3351
     size_t i;
6d3351
     qemuDomainSnapshotDiskDataPtr ret;
6d3351
     qemuDomainSnapshotDiskDataPtr dd;
6d3351
+    char *backingStoreStr;
6d3351
 
6d3351
     if (VIR_ALLOC_N(ret, snap->def->ndisks) < 0)
6d3351
         return NULL;
6d3351
@@ -14170,6 +14174,16 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
6d3351
 
6d3351
         dd->initialized = true;
6d3351
 
6d3351
+        /* relative backing store paths need to be updated so that relative
6d3351
+         * block commit still works */
6d3351
+        if (reuse &&
6d3351
+            (backingStoreStr = virStorageFileGetBackingStoreStr(dd->src))) {
6d3351
+            if (virStorageIsRelative(backingStoreStr))
6d3351
+                VIR_STEAL_PTR(dd->relPath, backingStoreStr);
6d3351
+            else
6d3351
+                VIR_FREE(backingStoreStr);
6d3351
+        }
6d3351
+
6d3351
         /* Note that it's unsafe to assume that the disks in the persistent
6d3351
          * definition match up with the disks in the live definition just by
6d3351
          * checking that the target name is the same. We've done that
6d3351
@@ -14213,6 +14227,7 @@ qemuDomainSnapshotUpdateDiskSources(qemuDomainSnapshotDiskDataPtr dd,
6d3351
     if (dd->initialized)
6d3351
         virStorageFileDeinit(dd->src);
6d3351
 
6d3351
+    VIR_STEAL_PTR(dd->disk->src->relPath, dd->relPath);
6d3351
     VIR_STEAL_PTR(dd->src->backingStore, dd->disk->src);
6d3351
     VIR_STEAL_PTR(dd->disk->src, dd->src);
6d3351
 
6d3351
@@ -14326,7 +14341,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
6d3351
 
6d3351
     /* prepare a list of objects to use in the vm definition so that we don't
6d3351
      * have to roll back later */
6d3351
-    if (!(diskdata = qemuDomainSnapshotDiskDataCollect(driver, vm, snap)))
6d3351
+    if (!(diskdata = qemuDomainSnapshotDiskDataCollect(driver, vm, snap, reuse)))
6d3351
         goto cleanup;
6d3351
 
6d3351
     cfg = virQEMUDriverGetConfig(driver);
6d3351
-- 
6d3351
2.13.1
6d3351