[libvirt] [PATCH 02/12] qemu: Fix logic in qemuDomainBlockCopyCommonValidateUserMirrorBackingStore

Peter Krempa pkrempa at redhat.com
Thu Aug 8 16:00:32 UTC 2019


Allow reusing original backing chain when doing a shallow copy without
reuse of external image. The existing logic didn't allow it but it will
be possible. Also add a note to explain that logic.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_driver.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ff83d1c024..3e0aa1b90f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -18263,19 +18263,23 @@ qemuDomainBlockCopyCommonValidateUserMirrorBackingStore(virStorageSourcePtr mirr
 {
     /* note that if original disk does not have backing chain, shallow is cleared */
     bool shallow = flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW;
-    bool reuse = flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT;

-    if (!mirror->backingStore) {
-        /* deep copy won't need backing store so we can terminate it */
-        if (!shallow &&
+    if (!virStorageSourceHasBacking(mirror)) {
+        /* for deep copy there won't be backing chain so we can terminate it */
+        if (!mirror->backingStore &&
+            !shallow &&
             !(mirror->backingStore = virStorageSourceNew()))
             return -1;

-        return 0;
-    }
-
-    /* validate user provided backing store */
-    if (virStorageSourceHasBacking(mirror)) {
+        /* When reusing an external image we document that the user must ensure
+         * that the <mirror> image must expose data as the original image did
+         * either by providing correct chain or prepopulating the image. This
+         * means we can't validate this any more regardless of whether shallow
+         * copy is requested.
+         *
+         * For a copy when we are not reusing external image requesting shallow
+         * is okay and will inherit the original backing chain */
+    } else {
         if (!blockdev) {
             virReportError(VIR_ERR_INVALID_ARG, "%s",
                            _("backingStore of mirror target is not supported by this qemu"));
@@ -18287,13 +18291,6 @@ qemuDomainBlockCopyCommonValidateUserMirrorBackingStore(virStorageSourcePtr mirr
                            _("backingStore of mirror without VIR_DOMAIN_BLOCK_COPY_SHALLOW doesn't make sense"));
             return -1;
         }
-    } else {
-        /* shallow copy without reuse requires some kind of backing data */
-        if (!reuse && shallow) {
-            virReportError(VIR_ERR_INVALID_ARG, "%s",
-                           _("VIR_DOMAIN_BLOCK_COPY_SHALLOW implies backing chain for mirror"));
-            return -1;
-        }
     }

     return 0;
-- 
2.21.0




More information about the libvir-list mailing list