]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: snapshot: Extract setup of snapshot disk definition for transient disks
authorPeter Krempa <pkrempa@redhat.com>
Wed, 28 Apr 2021 08:17:18 +0000 (10:17 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 24 May 2021 18:38:07 +0000 (20:38 +0200)
The code will be later reused when adding support for sharing the
backing image of the snapshot.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_snapshot.c

index fd6669433b55ef573e193c44fcd7c3c35bdf2c39..9f7c3222e520078a4dfe19546272db7bd7522ed5 100644 (file)
@@ -1168,6 +1168,29 @@ qemuSnapshotDiskPrepareActiveExternal(virDomainObj *vm,
 }
 
 
+static virDomainSnapshotDiskDef *
+qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk)
+{
+    g_autoptr(virDomainSnapshotDiskDef) snapdisk = g_new0(virDomainSnapshotDiskDef, 1);
+
+    snapdisk->name = g_strdup(domdisk->dst);
+    snapdisk->snapshot = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
+    snapdisk->src = virStorageSourceNew();
+    snapdisk->src->type = VIR_STORAGE_TYPE_FILE;
+    snapdisk->src->format = VIR_STORAGE_FILE_QCOW2;
+    snapdisk->src->path = g_strdup_printf("%s.TRANSIENT", domdisk->src->path);
+
+    if (virFileExists(snapdisk->src->path)) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+                       _("Overlay file '%s' for transient disk '%s' already exists"),
+                       snapdisk->src->path, domdisk->dst);
+        return NULL;
+    }
+
+    return g_steal_pointer(&snapdisk);
+}
+
+
 static qemuSnapshotDiskContext *
 qemuSnapshotDiskPrepareDisksTransient(virDomainObj *vm,
                                       virQEMUDriverConfig *cfg,
@@ -1181,26 +1204,16 @@ qemuSnapshotDiskPrepareDisksTransient(virDomainObj *vm,
 
     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDef *domdisk = vm->def->disks[i];
-        g_autoptr(virDomainSnapshotDiskDef) snapdisk = g_new0(virDomainSnapshotDiskDef, 1);
+        g_autoptr(virDomainSnapshotDiskDef) snapdisk = NULL;
 
         if (!domdisk->transient)
             continue;
 
         /* validation code makes sure that we do this only for local disks
          * with a file source */
-        snapdisk->name = g_strdup(domdisk->dst);
-        snapdisk->snapshot = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
-        snapdisk->src = virStorageSourceNew();
-        snapdisk->src->type = VIR_STORAGE_TYPE_FILE;
-        snapdisk->src->format = VIR_STORAGE_FILE_QCOW2;
-        snapdisk->src->path = g_strdup_printf("%s.TRANSIENT", domdisk->src->path);
-
-        if (virFileExists(snapdisk->src->path)) {
-            virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
-                           _("Overlay file '%s' for transient disk '%s' already exists"),
-                           snapdisk->src->path, domdisk->dst);
+
+        if (!(snapdisk = qemuSnapshotGetTransientDiskDef(domdisk)))
             return NULL;
-        }
 
         if (qemuSnapshotDiskPrepareOne(vm, cfg, domdisk, snapdisk,
                                        snapctxt->dd + snapctxt->ndd++,