]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: blockjob: Copy non-detected chain fully in qemuBlockJobRewriteConfigDiskSource
authorPeter Krempa <pkrempa@redhat.com>
Wed, 7 Aug 2019 14:31:19 +0000 (16:31 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 16 Aug 2019 11:26:10 +0000 (13:26 +0200)
Rather than copying just the top level image, let's copy the full user
provided backing chain.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_blockjob.c

index 8303567aed57a8980b801036cd59f7c2870dc2d4..6ac60e86d73e75c60576bd863f88897cdc411151 100644 (file)
@@ -521,6 +521,7 @@ qemuBlockJobRewriteConfigDiskSource(virDomainObjPtr vm,
 {
     virDomainDiskDefPtr persistDisk = NULL;
     VIR_AUTOUNREF(virStorageSourcePtr) copy = NULL;
+    virStorageSourcePtr n;
 
     if (!vm->newDef)
         return;
@@ -531,14 +532,24 @@ qemuBlockJobRewriteConfigDiskSource(virDomainObjPtr vm,
     if (!virStorageSourceIsSameLocation(disk->src, persistDisk->src))
         return;
 
-    if (!(copy = virStorageSourceCopy(newsrc, false)) ||
+    if (!(copy = virStorageSourceCopy(newsrc, true)) ||
         virStorageSourceInitChainElement(copy, persistDisk->src, true) < 0) {
         VIR_WARN("Unable to update persistent definition on vm %s after block job",
                  vm->def->name);
         return;
     }
 
-    qemuBlockJobCleanStorageSourceRuntime(copy);
+    for (n = copy; virStorageSourceIsBacking(n); n = n->backingStore) {
+        qemuBlockJobCleanStorageSourceRuntime(n);
+
+        /* discard any detected backing store */
+        if (virStorageSourceIsBacking(n->backingStore) &&
+            n->backingStore->detected) {
+            virObjectUnref(n->backingStore);
+            n->backingStore = NULL;
+            break;
+        }
+    }
 
     virObjectUnref(persistDisk->src);
     VIR_STEAL_PTR(persistDisk->src, copy);