render / rpms / libvirt

Forked from rpms/libvirt 9 months ago
Clone
Blob Blame History Raw
From 5c6c436d14fa9f504f5889f3e60fdecc65208b26 Mon Sep 17 00:00:00 2001
Message-Id: <5c6c436d14fa9f504f5889f3e60fdecc65208b26@dist-git>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 22 Sep 2014 17:52:39 +0200
Subject: [PATCH] qemu: save image: Split out checks done only when editing the
 save img

https://bugzilla.redhat.com/show_bug.cgi?id=1142693

Move them to the single corresponding function rather than having them
in the common chunk of code.

(cherry picked from commit 3035123d65714975dcc8527289fe68c7b5d3526f)

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/qemu/qemu_driver.c | 76 +++++++++++++++++++++++++++-----------------------
 1 file changed, 41 insertions(+), 35 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 96c7dd2..580ac17 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5380,10 +5380,22 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver,
 }
 
 
-/* Return -1 on most failures after raising error, -2 if edit was specified
- * but xmlin and state (-1 for no change, 0 for paused, 1 for running) do
- * not represent any changes (no error raised), -3 if corrupt image was
- * unlinked (no error raised), and opened fd on success.  */
+/**
+ * qemuDomainSaveImageOpen:
+ * @driver: qemu driver data
+ * @path: path of the save image
+ * @ret_def: returns domain definition created from the XML stored in the image
+ * @ret_header: returns structure filled with data from the image header
+ * @xmlout: returns the XML from the image file (may be NULL)
+ * @bypass_cache: bypass cache when opening the file
+ * @wrapperFd: returns the file wrapper structure
+ * @open_write: open the file for writing (for updates)
+ * @unlink_corrupt: remove the image file if it is corrupted
+ *
+ * Returns the opened fd of the save image file and fills the apropriate fields
+ * on success. On error returns -1 on most failures, -3 if corrupt image was
+ * unlinked (no error raised).
+ */
 static int ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4)
 qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
                         const char *path,
@@ -5392,14 +5404,14 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
                         char **xmlout,
                         bool bypass_cache,
                         virFileWrapperFdPtr *wrapperFd,
-                        const char *xmlin, int state, bool edit,
+                        bool open_write,
                         bool unlink_corrupt)
 {
     int fd = -1;
     virQEMUSaveHeader header;
     char *xml = NULL;
     virDomainDefPtr def = NULL;
-    int oflags = edit ? O_RDWR : O_RDONLY;
+    int oflags = open_write ? O_RDWR : O_RDONLY;
     virCapsPtr caps = NULL;
 
     if (bypass_cache) {
@@ -5484,18 +5496,6 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
         goto error;
     }
 
-    if (edit && STREQ(xml, xmlin) &&
-        (state < 0 || state == header.was_running)) {
-        VIR_FREE(xml);
-        if (VIR_CLOSE(fd) < 0) {
-            virReportSystemError(errno, _("cannot close file: %s"), path);
-            goto error;
-        }
-        return -2;
-    }
-    if (state >= 0)
-        header.was_running = state;
-
     /* Create a domain from this XML */
     if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt,
                                         QEMU_EXPECTED_VIRT_TYPES,
@@ -5650,21 +5650,15 @@ qemuDomainRestoreFlags(virConnectPtr conn,
     int ret = -1;
     virQEMUSaveHeader header;
     virFileWrapperFdPtr wrapperFd = NULL;
-    int state = -1;
 
     virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE |
                   VIR_DOMAIN_SAVE_RUNNING |
                   VIR_DOMAIN_SAVE_PAUSED, -1);
 
 
-    if (flags & VIR_DOMAIN_SAVE_RUNNING)
-        state = 1;
-    else if (flags & VIR_DOMAIN_SAVE_PAUSED)
-        state = 0;
-
     fd = qemuDomainSaveImageOpen(driver, path, &def, &header, NULL,
                                  (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != 0,
-                                 &wrapperFd, dxml, state, false, false);
+                                 &wrapperFd, false, false);
     if (fd < 0)
         goto cleanup;
 
@@ -5687,6 +5681,11 @@ qemuDomainRestoreFlags(virConnectPtr conn,
         goto cleanup;
     def = NULL;
 
+    if (flags & VIR_DOMAIN_SAVE_RUNNING)
+        header.was_running = 1;
+    else if (flags & VIR_DOMAIN_SAVE_PAUSED)
+        header.was_running = 0;
+
     if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
         goto cleanup;
 
@@ -5732,7 +5731,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, const char *path,
     virCheckFlags(VIR_DOMAIN_XML_SECURE, NULL);
 
     fd = qemuDomainSaveImageOpen(driver, path, &def, &header, NULL,
-                                 false, NULL, NULL, -1, false, false);
+                                 false, NULL, false, false);
 
     if (fd < 0)
         goto cleanup;
@@ -5770,22 +5769,30 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, const char *path,
     else if (flags & VIR_DOMAIN_SAVE_PAUSED)
         state = 0;
 
-    fd = qemuDomainSaveImageOpen(driver, path, &def, &header, NULL,
-                                 false, NULL, dxml, state, true, false);
+    fd = qemuDomainSaveImageOpen(driver, path, &def, &header, &xml,
+                                 false, NULL, true, false);
 
-    if (fd < 0) {
-        /* Check for special case of no change needed.  */
-        if (fd == -2)
-            ret = 0;
+    if (fd < 0)
         goto cleanup;
-    }
 
     if (virDomainSaveImageDefineXMLEnsureACL(conn, def) < 0)
         goto cleanup;
 
+    if (STREQ(xml, dxml) &&
+        (state < 0 || state == header.was_running)) {
+        /* no change to the XML */
+        ret = 0;
+        goto cleanup;
+    }
+
+    if (state >= 0)
+        header.was_running = state;
+
     if (!(newdef = qemuDomainSaveImageUpdateDef(driver, def, dxml)))
         goto cleanup;
 
+    VIR_FREE(xml);
+
     xml = qemuDomainDefFormatXML(driver, newdef,
                                  VIR_DOMAIN_XML_INACTIVE |
                                  VIR_DOMAIN_XML_SECURE |
@@ -5840,8 +5847,7 @@ qemuDomainObjRestore(virConnectPtr conn,
     virFileWrapperFdPtr wrapperFd = NULL;
 
     fd = qemuDomainSaveImageOpen(driver, path, &def, &header, NULL,
-                                 bypass_cache, &wrapperFd, NULL, -1, false,
-                                 true);
+                                 bypass_cache, &wrapperFd, false, true);
     if (fd < 0) {
         if (fd == -3)
             ret = 1;
-- 
2.1.1