[libvirt] [PATCH v1.2.[1-5]-maint] qemu: blockcopy: Don't remove existing disk mirror info

Eric Blake eblake at redhat.com
Thu Jun 26 13:51:45 UTC 2014


From: Peter Krempa <pkrempa at redhat.com>

When creating a new disk mirror the new struct is stored in a separate
variable until everything went well. The removed hunk would actually
remove existing mirror information for example when the api would be run
if a mirror still exists.

(cherry picked from commit 02b364e186d487f54ed410c01af042f23e812d42)

This fixes a regression introduced in commit ff5f30b.

Signed-off-by: Eric Blake <eblake at redhat.com>

Conflicts:
	src/qemu/qemu_driver.c - no refactoring of commit 7b7bf001
---

As Peter's patch resolves a regression, I'd like to backport it to
the maint branches; however, that means redoing the patch.

 src/qemu/qemu_driver.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 59185c6..591864f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -15203,6 +15203,7 @@ qemuDomainBlockCopy(virDomainObjPtr vm,
     struct stat st;
     bool need_unlink = false;
     char *mirror = NULL;
+    int mirrorFormat;
     virQEMUDriverConfigPtr cfg = NULL;

     /* Preliminaries: find the disk we are editing, sanity checks */
@@ -15290,10 +15291,10 @@ qemuDomainBlockCopy(virDomainObjPtr vm,
             goto endjob;
         VIR_FORCE_CLOSE(fd);
         if (!format)
-            disk->mirrorFormat = disk->src.format;
+            mirrorFormat = disk->src.format;
     } else if (format) {
-        disk->mirrorFormat = virStorageFileFormatTypeFromString(format);
-        if (disk->mirrorFormat <= 0) {
+        mirrorFormat = virStorageFileFormatTypeFromString(format);
+        if (mirrorFormat <= 0) {
             virReportError(VIR_ERR_INVALID_ARG, _("unrecognized format '%s'"),
                            format);
             goto endjob;
@@ -15303,11 +15304,11 @@ qemuDomainBlockCopy(virDomainObjPtr vm,
          * also passed the RAW flag (and format is non-NULL), or it is
          * safe for us to probe the format from the file that we will
          * be using.  */
-        disk->mirrorFormat = virStorageFileProbeFormat(dest, cfg->user,
-                                                       cfg->group);
+        mirrorFormat = virStorageFileProbeFormat(dest, cfg->user,
+                                                 cfg->group);
     }
-    if (!format && disk->mirrorFormat > 0)
-        format = virStorageFileFormatTypeToString(disk->mirrorFormat);
+    if (!format && mirrorFormat > 0)
+        format = virStorageFileFormatTypeToString(mirrorFormat);
     if (VIR_STRDUP(mirror, dest) < 0)
         goto endjob;

@@ -15333,13 +15334,12 @@ qemuDomainBlockCopy(virDomainObjPtr vm,
     /* Update vm in place to match changes.  */
     need_unlink = false;
     disk->mirror = mirror;
+    disk->mirrorFormat = mirrorFormat;
     mirror = NULL;

  endjob:
     if (need_unlink && unlink(dest))
         VIR_WARN("unable to unlink just-created %s", dest);
-    if (ret < 0 && disk)
-        disk->mirrorFormat = VIR_STORAGE_FILE_NONE;
     VIR_FREE(mirror);
     if (!qemuDomainObjEndJob(driver, vm))
         vm = NULL;
-- 
1.9.3




More information about the libvir-list mailing list