[libvirt] [PATCH] qemu: snapshot: split out preparation of a snapshot with blockdev

Peter Krempa posted 1 patch 4 years, 5 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/f912fda829833f931bfa9d88add86638f9760413.1573488131.git.pkrempa@redhat.com
src/qemu/qemu_driver.c | 96 ++++++++++++++++++++++++------------------
1 file changed, 56 insertions(+), 40 deletions(-)
[libvirt] [PATCH] qemu: snapshot: split out preparation of a snapshot with blockdev
Posted by Peter Krempa 4 years, 5 months ago
Separate the blockdev code since it makes the original function lenghty.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
 src/qemu/qemu_driver.c | 96 ++++++++++++++++++++++++------------------
 1 file changed, 56 insertions(+), 40 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index abfb540d80..45363b0d6d 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -15228,6 +15228,58 @@ qemuDomainSnapshotDiskCleanup(qemuDomainSnapshotDiskDataPtr data,
 }


+static int
+qemuDomainSnapshotDiskPrepareOneBlockdev(virQEMUDriverPtr driver,
+                                         virDomainObjPtr vm,
+                                         qemuDomainSnapshotDiskDataPtr dd,
+                                         virQEMUDriverConfigPtr cfg,
+                                         bool reuse,
+                                         virHashTablePtr blockNamedNodeData,
+                                         qemuDomainAsyncJob asyncJob)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    g_autoptr(virStorageSource) terminator = NULL;
+    int rc;
+
+    /* create a terminator for the snapshot disks so that qemu does not try
+     * to open them at first */
+    if (!(terminator = virStorageSourceNew()))
+        return -1;
+
+    if (qemuDomainPrepareStorageSourceBlockdev(dd->disk, dd->src,
+                                               priv, cfg) < 0)
+        return -1;
+
+    if (!(dd->crdata = qemuBuildStorageSourceChainAttachPrepareBlockdevTop(dd->src,
+                                                                           terminator,
+                                                                           priv->qemuCaps)))
+        return -1;
+
+    if (reuse) {
+        if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+            return -1;
+
+        rc = qemuBlockStorageSourceAttachApply(qemuDomainGetMonitor(vm),
+                                               dd->crdata->srcdata[0]);
+
+        if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
+            return -1;
+    } else {
+        if (qemuBlockStorageSourceCreateDetectSize(blockNamedNodeData,
+                                                   dd->src, dd->disk->src) < 0)
+            return -1;
+
+        if (qemuBlockStorageSourceCreate(vm, dd->src, dd->disk->src,
+                                         NULL, dd->crdata->srcdata[0],
+                                         asyncJob) < 0)
+            return -1;
+    }
+
+    dd->blockdevadded = true;
+    return 0;
+}
+
+
 static int
 qemuDomainSnapshotDiskPrepareOne(virQEMUDriverPtr driver,
                                  virDomainObjPtr vm,
@@ -15240,12 +15292,9 @@ qemuDomainSnapshotDiskPrepareOne(virQEMUDriverPtr driver,
                                  bool blockdev,
                                  qemuDomainAsyncJob asyncJob)
 {
-    qemuDomainObjPrivatePtr priv = vm->privateData;
     virDomainDiskDefPtr persistdisk;
-    g_autoptr(virStorageSource) terminator = NULL;
     bool supportsCreate;
     bool supportsBacking;
-    int rc;

     dd->disk = disk;

@@ -15314,43 +15363,10 @@ qemuDomainSnapshotDiskPrepareOne(virQEMUDriverPtr driver,

     dd->prepared = true;

-    if (blockdev) {
-        /* create a terminator for the snapshot disks so that qemu does not try
-         * to open them at first */
-        if (!(terminator = virStorageSourceNew()))
-            return -1;
-
-        if (qemuDomainPrepareStorageSourceBlockdev(dd->disk, dd->src,
-                                                   priv, cfg) < 0)
-            return -1;
-
-        if (!(dd->crdata = qemuBuildStorageSourceChainAttachPrepareBlockdevTop(dd->src,
-                                                                               terminator,
-                                                                               priv->qemuCaps)))
-            return -1;
-
-        if (reuse) {
-            if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
-                return -1;
-
-            rc = qemuBlockStorageSourceAttachApply(qemuDomainGetMonitor(vm),
-                                                   dd->crdata->srcdata[0]);
-
-            if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
-                return -1;
-        } else {
-            if (qemuBlockStorageSourceCreateDetectSize(blockNamedNodeData,
-                                                       dd->src, dd->disk->src) < 0)
-                return -1;
-
-            if (qemuBlockStorageSourceCreate(vm, dd->src, dd->disk->src,
-                                             NULL, dd->crdata->srcdata[0],
-                                             asyncJob) < 0)
-                return -1;
-        }
-
-        dd->blockdevadded = true;
-    }
+    if (blockdev &&
+        qemuDomainSnapshotDiskPrepareOneBlockdev(driver, vm, dd, cfg, reuse,
+                                                 blockNamedNodeData, asyncJob) < 0)
+        return -1;

     return 0;
 }
-- 
2.23.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [libvirt] [PATCH] qemu: snapshot: split out preparation of a snapshot with blockdev
Posted by Eric Blake 4 years, 5 months ago
On 11/11/19 10:02 AM, Peter Krempa wrote:
> Separate the blockdev code since it makes the original function lenghty.

lengthy

> 
> Signed-off-by: Peter Krempa <pkrempa@redhat.com>
> ---
>   src/qemu/qemu_driver.c | 96 ++++++++++++++++++++++++------------------
>   1 file changed, 56 insertions(+), 40 deletions(-)
> 

ACK

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list