[PATCH 01/35] qemu: snapshot: Extract setup of snapshot disk definition for transient disks

Peter Krempa posted 35 patches 4 years, 8 months ago
[PATCH 01/35] qemu: snapshot: Extract setup of snapshot disk definition for transient disks
Posted by Peter Krempa 4 years, 8 months ago
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>
---
 src/qemu/qemu_snapshot.c | 40 ++++++++++++++++++++++++++--------------
 1 file changed, 26 insertions(+), 14 deletions(-)

diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index fd6669433b..c3cff46bc9 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
@@ -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,15 @@ 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);
-            return NULL;
-        }
+
+        snapdisk = qemuSnapshotGetTransientDiskDef(domdisk);

         if (qemuSnapshotDiskPrepareOne(vm, cfg, domdisk, snapdisk,
                                        snapctxt->dd + snapctxt->ndd++,
-- 
2.31.1

Re: [PATCH 01/35] qemu: snapshot: Extract setup of snapshot disk definition for transient disks
Posted by Ján Tomko 4 years, 8 months ago
On a Friday in 2021, Peter Krempa wrote:
>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>
>---
> src/qemu/qemu_snapshot.c | 40 ++++++++++++++++++++++++++--------------
> 1 file changed, 26 insertions(+), 14 deletions(-)
>
>diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
>index fd6669433b..c3cff46bc9 100644
>--- a/src/qemu/qemu_snapshot.c
>+++ b/src/qemu/qemu_snapshot.c
>@@ -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,15 @@ 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);
>-            return NULL;
>-        }
>+
>+        snapdisk = qemuSnapshotGetTransientDiskDef(domdisk);
>

if (!snapdisk)
     return NULL;

To correctly propagate the error and avoid NULL dereference below

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano

>         if (qemuSnapshotDiskPrepareOne(vm, cfg, domdisk, snapdisk,
>                                        snapctxt->dd + snapctxt->ndd++,
>-- 
>2.31.1
>