c401cc
From 52badc03dfe80a80996d6dfb98ba18d65333f346 Mon Sep 17 00:00:00 2001
c401cc
Message-Id: <52badc03dfe80a80996d6dfb98ba18d65333f346@dist-git>
c401cc
From: Peter Krempa <pkrempa@redhat.com>
c401cc
Date: Wed, 26 Feb 2014 14:55:28 +0100
c401cc
Subject: [PATCH] qemu: Switch snapshot deletion to the new API functions
c401cc
c401cc
https://bugzilla.redhat.com/show_bug.cgi?id=1032370
c401cc
c401cc
Use the new storage driver APIs to delete snapshot backing files in case
c401cc
of failure instead of directly relying on "unlink". This will help us in
c401cc
the future when we will be adding network based storage without local
c401cc
representation in the host.
c401cc
c401cc
(cherry picked from commit 8f4091d6771069324e60c8708881b76de8a8ab8a)
c401cc
c401cc
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c401cc
---
c401cc
 cfg.mk                 |  1 +
c401cc
 src/qemu/qemu_driver.c | 17 ++++++++++++++---
c401cc
 2 files changed, 15 insertions(+), 3 deletions(-)
c401cc
c401cc
diff --git a/cfg.mk b/cfg.mk
c401cc
index f2cd411..cfbdc30 100644
c401cc
--- a/cfg.mk
c401cc
+++ b/cfg.mk
c401cc
@@ -749,6 +749,7 @@ sc_prohibit_cross_inclusion:
c401cc
 	    cpu/ | locking/ | network/ | rpc/ | security/)		\
c401cc
 	      safe="($$dir|util|conf)";;				\
c401cc
 	    xenapi/ | xenxs/ ) safe="($$dir|util|conf|xen)";;		\
c401cc
+	    qemu/ ) safe="($$dir|util|conf|cpu|network|locking|rpc|security|storage)";; \
c401cc
 	    *) safe="($$dir|util|conf|cpu|network|locking|rpc|security)";; \
c401cc
 	  esac;								\
c401cc
 	  in_vc_files="^src/$$dir"					\
c401cc
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
c401cc
index a1145a2..a91b06d 100644
c401cc
--- a/src/qemu/qemu_driver.c
c401cc
+++ b/src/qemu/qemu_driver.c
c401cc
@@ -94,6 +94,7 @@
c401cc
 #include "virstring.h"
c401cc
 #include "viraccessapicheck.h"
c401cc
 #include "viraccessapicheckqemu.h"
c401cc
+#include "storage/storage_driver.h"
c401cc
 
c401cc
 #define VIR_FROM_THIS VIR_FROM_QEMU
c401cc
 
c401cc
@@ -12521,6 +12522,7 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
c401cc
     int ret = -1;
c401cc
     int fd = -1;
c401cc
     bool need_unlink = false;
c401cc
+    virStorageFilePtr snapfile = NULL;
c401cc
 
c401cc
     if (snap->snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
c401cc
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
c401cc
@@ -12540,6 +12542,9 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
c401cc
     virStorageFileFreeMetadata(disk->backingChain);
c401cc
     disk->backingChain = NULL;
c401cc
 
c401cc
+    if (!(snapfile = virStorageFileInitFromSnapshotDef(snap)))
c401cc
+        goto cleanup;
c401cc
+
c401cc
     switch (snap->type) {
c401cc
     case VIR_DOMAIN_DISK_TYPE_BLOCK:
c401cc
         reuse = true;
c401cc
@@ -12615,8 +12620,9 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
c401cc
     }
c401cc
 
c401cc
 cleanup:
c401cc
-    if (need_unlink && unlink(source))
c401cc
+    if (need_unlink && virStorageFileUnlink(snapfile))
c401cc
         VIR_WARN("unable to unlink just-created %s", source);
c401cc
+    virStorageFileFree(snapfile);
c401cc
     VIR_FREE(device);
c401cc
     VIR_FREE(source);
c401cc
     VIR_FREE(persistSource);
c401cc
@@ -12636,16 +12642,20 @@ qemuDomainSnapshotUndoSingleDiskActive(virQEMUDriverPtr driver,
c401cc
 {
c401cc
     char *source = NULL;
c401cc
     char *persistSource = NULL;
c401cc
+    virStorageFilePtr diskfile = NULL;
c401cc
     struct stat st;
c401cc
 
c401cc
+    diskfile = virStorageFileInitFromDiskDef(disk);
c401cc
+
c401cc
     if (VIR_STRDUP(source, origdisk->src) < 0 ||
c401cc
         (persistDisk && VIR_STRDUP(persistSource, source) < 0))
c401cc
         goto cleanup;
c401cc
 
c401cc
     qemuDomainPrepareDiskChainElement(driver, vm, disk, disk->src,
c401cc
                                       VIR_DISK_CHAIN_NO_ACCESS);
c401cc
-    if (need_unlink && stat(disk->src, &st) == 0 &&
c401cc
-        S_ISREG(st.st_mode) && unlink(disk->src) < 0)
c401cc
+    if (need_unlink && diskfile &&
c401cc
+        virStorageFileStat(diskfile, &st) == 0 && S_ISREG(st.st_mode) &&
c401cc
+        virStorageFileUnlink(diskfile) < 0)
c401cc
         VIR_WARN("Unable to remove just-created %s", disk->src);
c401cc
 
c401cc
     /* Update vm in place to match changes.  */
c401cc
@@ -12663,6 +12673,7 @@ qemuDomainSnapshotUndoSingleDiskActive(virQEMUDriverPtr driver,
c401cc
     }
c401cc
 
c401cc
 cleanup:
c401cc
+    virStorageFileFree(diskfile);
c401cc
     VIR_FREE(source);
c401cc
     VIR_FREE(persistSource);
c401cc
 }
c401cc
-- 
c401cc
1.9.0
c401cc