[PATCH v2 2/6] qemu: Block deletion and reverting on non-full internal snapshots

Or Ozeri oro at il.ibm.com
Wed Feb 15 11:28:18 UTC 2023


An upcoming commit will add support for creating a disks-only snapshot
using internal disk snapshots. Deleting or reverting to these will not be
supported, at least not for now.
This commit adds a validation for this.

Signed-off-by: Or Ozeri <oro at il.ibm.com>
---
 src/conf/snapshot_conf.c | 29 +++++++++++++++++++++++++++++
 src/conf/snapshot_conf.h |  3 +++
 src/libvirt_private.syms |  1 +
 src/qemu/qemu_snapshot.c | 12 ++++++++++++
 4 files changed, 45 insertions(+)

diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index 58a6afa26d..879fe4c7a1 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -945,6 +945,35 @@ virDomainSnapshotIsExternal(virDomainMomentObj *snap)
     return virDomainSnapshotDefIsExternal(def);
 }
 
+bool
+virDomainSnapshotDefIsNonFullInternal(virDomainSnapshotDef *def)
+{
+    bool has_internal = false;
+    bool is_full = true;
+    size_t i;
+
+    for (i = 0; i < def->ndisks; i++) {
+        if (def->disks[i].snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL) {
+            has_internal = true;
+        } else {
+            is_full = false;
+        }
+    }
+
+    if (def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL)
+        return !is_full;
+
+    return has_internal;
+}
+
+bool
+virDomainSnapshotIsNonFullInternal(virDomainMomentObj *snap)
+{
+    virDomainSnapshotDef *def = virDomainSnapshotObjGetDef(snap);
+
+    return virDomainSnapshotDefIsNonFullInternal(def);
+}
+
 int
 virDomainSnapshotRedefinePrep(virDomainObj *vm,
                               virDomainSnapshotDef *snapdef,
diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
index c133c105c7..8f40748602 100644
--- a/src/conf/snapshot_conf.h
+++ b/src/conf/snapshot_conf.h
@@ -125,6 +125,9 @@ int virDomainSnapshotAlignDisks(virDomainSnapshotDef *snapshot,
 bool virDomainSnapshotDefIsExternal(virDomainSnapshotDef *def);
 bool virDomainSnapshotIsExternal(virDomainMomentObj *snap);
 
+bool virDomainSnapshotDefIsNonFullInternal(virDomainSnapshotDef *def);
+bool virDomainSnapshotIsNonFullInternal(virDomainMomentObj *snap);
+
 int virDomainSnapshotRedefinePrep(virDomainObj *vm,
                                   virDomainSnapshotDef *snapdef,
                                   virDomainMomentObj **snap,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 576ec8f95f..0d38e86936 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1027,6 +1027,7 @@ virDomainSnapshotDiskDefFree;
 virDomainSnapshotDiskDefParseXML;
 virDomainSnapshotFormatConvertXMLFlags;
 virDomainSnapshotIsExternal;
+virDomainSnapshotIsNonFullInternal;
 virDomainSnapshotRedefinePrep;
 virDomainSnapshotStateTypeFromString;
 virDomainSnapshotStateTypeToString;
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index 1aa2f05300..c1855b3028 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
@@ -1828,6 +1828,12 @@ qemuSnapshotRevertValidate(virDomainObj *vm,
         return -1;
     }
 
+    if (virDomainSnapshotIsNonFullInternal(snap)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("revert to a non-full internal snapshot not supported yet"));
+        return -1;
+    }
+
     if (!snap->def->dom) {
         virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY,
                        _("snapshot '%s' lacks domain '%s' rollback info"),
@@ -3061,6 +3067,12 @@ qemuSnapshotDeleteValidate(virDomainObj *vm,
                            virDomainMomentObj *snap,
                            unsigned int flags)
 {
+    if (virDomainSnapshotIsNonFullInternal(snap)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("deletion of a non-full internal snapshot not supported yet"));
+        return -1;
+    }
+
     if (!virDomainSnapshotIsExternal(snap) &&
         virDomainObjIsActive(vm)) {
         ssize_t i;
-- 
2.25.1



More information about the libvir-list mailing list