[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 2/4] Avoid create/unlink with block devs used for QEMU save



It is possible to use block devices with domain save/restore. Upon
failure QEMU unlinks the path being saved to. This isn't good when
it is a block device !

* src/qemu/qemu_driver.c: Don't unlink block devices if save fails
---
 src/qemu/qemu_driver.c |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 91fe963..41a516c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4787,6 +4787,8 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
     int rc;
     virDomainEventPtr event = NULL;
     qemuDomainObjPrivatePtr priv;
+    struct stat sb;
+    int is_reg = 0;
 
     memset(&header, 0, sizeof(header));
     memcpy(header.magic, QEMUD_SAVE_MAGIC, sizeof(header.magic));
@@ -4840,6 +4842,21 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
     }
     header.xml_len = strlen(xml) + 1;
 
+    /* path might be a pre-existing block dev, in which case
+     * we need to skip the create step, and also avoid unlink
+     * in the failure case */
+    if (stat(path, &sb) < 0) {
+        if (errno != ENOENT) {
+            virReportSystemError(errno, _("unable to access %s"), path);
+            goto endjob;
+        } else {
+            is_reg = 1;
+        }
+    } else {
+        is_reg = S_ISREG(sb.st_mode);
+    }
+
+
     /* Setup hook data needed by virFileOperation hook function */
     hdata.dom = dom;
     hdata.path = path;
@@ -4849,7 +4866,8 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
     /* Write header to file, followed by XML */
 
     /* First try creating the file as root */
-    if ((rc = virFileOperation(path, O_CREAT|O_TRUNC|O_WRONLY,
+    if (is_reg &&
+        (rc = virFileOperation(path, O_CREAT|O_TRUNC|O_WRONLY,
                                S_IRUSR|S_IWUSR,
                                getuid(), getgid(),
                                qemudDomainSaveFileOpHook, &hdata,
@@ -5014,7 +5032,7 @@ endjob:
 
 cleanup:
     VIR_FREE(xml);
-    if (ret != 0)
+    if (ret != 0 && is_reg)
         unlink(path);
     if (vm)
         virDomainObjUnlock(vm);
-- 
1.6.5.2


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]