]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuSnapshotCreateActiveExternalDisks: Extract actual snapshot creation to 'qemuSnaps...
authorPeter Krempa <pkrempa@redhat.com>
Mon, 21 Sep 2020 14:06:29 +0000 (16:06 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 24 Sep 2020 09:49:13 +0000 (11:49 +0200)
Extract the code which invokes the monitor and finalizes the snapshot
into a separate function for easier reuse.

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

index b9b640058cd634a8686d0fc403aa66848a54a3c1..89d391760b6d0c05ef9429f9e1205d2599732ec4 100644 (file)
@@ -1182,57 +1182,41 @@ qemuSnapshotDiskUpdateSource(virDomainObjPtr vm,
 }
 
 
-/* The domain is expected to be locked and active. */
 static int
-qemuSnapshotCreateActiveExternalDisks(virQEMUDriverPtr driver,
-                                      virDomainObjPtr vm,
-                                      virDomainMomentObjPtr snap,
-                                      virHashTablePtr blockNamedNodeData,
-                                      unsigned int flags,
-                                      virQEMUDriverConfigPtr cfg,
-                                      qemuDomainAsyncJob asyncJob)
+qemuSnapshotDiskCreate(qemuSnapshotDiskContextPtr snapctxt,
+                       virQEMUDriverConfigPtr cfg)
 {
-    qemuDomainObjPrivatePtr priv = vm->privateData;
-    int rc;
+    qemuDomainObjPrivatePtr priv = snapctxt->vm->privateData;
+    virQEMUDriverPtr driver = priv->driver;
     size_t i;
-    bool reuse = (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0;
-    g_autoptr(qemuSnapshotDiskContext) snapctxt = NULL;
-
-    if (virDomainObjCheckActive(vm) < 0)
-        return -1;
-
-    /* prepare a list of objects to use in the vm definition so that we don't
-     * have to roll back later */
-    if (!(snapctxt = qemuSnapshotDiskPrepare(vm, snap, cfg, reuse,
-                                             blockNamedNodeData, asyncJob)))
-        return -1;
+    int rc;
 
     /* check whether there's anything to do */
     if (snapctxt->ndd == 0)
         return 0;
 
-    if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+    if (qemuDomainObjEnterMonitorAsync(driver, snapctxt->vm, snapctxt->asyncJob) < 0)
         return -1;
 
     rc = qemuMonitorTransaction(priv->mon, &snapctxt->actions);
 
-    if (qemuDomainObjExitMonitor(driver, vm) < 0)
+    if (qemuDomainObjExitMonitor(driver, snapctxt->vm) < 0)
         rc = -1;
 
     for (i = 0; i < snapctxt->ndd; i++) {
         qemuSnapshotDiskDataPtr dd = snapctxt->dd + i;
 
-        virDomainAuditDisk(vm, dd->disk->src, dd->src, "snapshot", rc >= 0);
+        virDomainAuditDisk(snapctxt->vm, dd->disk->src, dd->src, "snapshot", rc >= 0);
 
         if (rc == 0)
-            qemuSnapshotDiskUpdateSource(vm, dd);
+            qemuSnapshotDiskUpdateSource(snapctxt->vm, dd);
     }
 
     if (rc < 0)
         return -1;
 
-    if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0 ||
-        (vm->newDef && virDomainDefSave(vm->newDef, driver->xmlopt,
+    if (virDomainObjSave(snapctxt->vm, driver->xmlopt, cfg->stateDir) < 0 ||
+        (snapctxt->vm->newDef && virDomainDefSave(snapctxt->vm->newDef, driver->xmlopt,
                                         cfg->configDir) < 0))
         return -1;
 
@@ -1240,6 +1224,34 @@ qemuSnapshotCreateActiveExternalDisks(virQEMUDriverPtr driver,
 }
 
 
+/* The domain is expected to be locked and active. */
+static int
+qemuSnapshotCreateActiveExternalDisks(virDomainObjPtr vm,
+                                      virDomainMomentObjPtr snap,
+                                      virHashTablePtr blockNamedNodeData,
+                                      unsigned int flags,
+                                      virQEMUDriverConfigPtr cfg,
+                                      qemuDomainAsyncJob asyncJob)
+{
+    bool reuse = (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0;
+    g_autoptr(qemuSnapshotDiskContext) snapctxt = NULL;
+
+    if (virDomainObjCheckActive(vm) < 0)
+        return -1;
+
+    /* prepare a list of objects to use in the vm definition so that we don't
+     * have to roll back later */
+    if (!(snapctxt = qemuSnapshotDiskPrepare(vm, snap, cfg, reuse,
+                                             blockNamedNodeData, asyncJob)))
+        return -1;
+
+    if (qemuSnapshotDiskCreate(snapctxt, cfg) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 static int
 qemuSnapshotCreateActiveExternal(virQEMUDriverPtr driver,
                                  virDomainObjPtr vm,
@@ -1366,7 +1378,7 @@ qemuSnapshotCreateActiveExternal(virQEMUDriverPtr driver,
 
     /* the domain is now paused if a memory snapshot was requested */
 
-    if ((ret = qemuSnapshotCreateActiveExternalDisks(driver, vm, snap,
+    if ((ret = qemuSnapshotCreateActiveExternalDisks(vm, snap,
                                                      blockNamedNodeData, flags, cfg,
                                                      QEMU_ASYNC_JOB_SNAPSHOT)) < 0)
         goto cleanup;