From 061a395394a880db99bbab4548f2329edb83f808 Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Wed, 3 Nov 2021 10:53:12 +0100 Subject: [PATCH] qemu_snapshot: create: move XML def validation to separate function MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Pavel Hrdina Reviewed-by: Ján Tomko --- src/qemu/qemu_snapshot.c | 124 ++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 55 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 7ffebbbdf2..b4e2fe11f6 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1554,59 +1554,13 @@ qemuSnapshotCreateXMLParse(virDomainObj *vm, } -virDomainSnapshotPtr -qemuSnapshotCreateXML(virDomainPtr domain, - virDomainObj *vm, - const char *xmlDesc, - unsigned int flags) +static int +qemuSnapshotCreateXMLValidateDef(virDomainObj *vm, + virDomainSnapshotDef *def, + unsigned int flags) { - virQEMUDriver *driver = domain->conn->privateData; - g_autofree char *xml = NULL; - virDomainMomentObj *snap = NULL; - virDomainSnapshotPtr snapshot = NULL; - virDomainMomentObj *current = NULL; - bool update_current = true; bool redefine = flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE; - int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL; - bool align_match = true; - g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); - qemuDomainObjPrivate *priv = vm->privateData; virDomainSnapshotState state; - g_autoptr(virDomainSnapshotDef) def = NULL; - - virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE | - VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT | - VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA | - VIR_DOMAIN_SNAPSHOT_CREATE_HALT | - VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY | - VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT | - VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE | - VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC | - VIR_DOMAIN_SNAPSHOT_CREATE_LIVE | - VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, NULL); - - VIR_REQUIRE_FLAG_RET(VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE, - VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY, - NULL); - VIR_EXCLUSIVE_FLAGS_RET(VIR_DOMAIN_SNAPSHOT_CREATE_LIVE, - VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE, - NULL); - - if ((redefine && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT)) || - (flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) - update_current = false; - - if (qemuDomainSupportsCheckpointsBlockjobs(vm) < 0) - return NULL; - - if (!vm->persistent && (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("cannot halt after transient domain snapshot")); - return NULL; - } - - if (!(def = qemuSnapshotCreateXMLParse(vm, driver, xmlDesc, flags))) - return NULL; /* reject snapshot names containing slashes or starting with dot as * snapshot definitions are saved in files named by the snapshot name */ @@ -1616,7 +1570,7 @@ qemuSnapshotCreateXML(virDomainPtr domain, _("invalid snapshot name '%s': " "name can't contain '/'"), def->parent.name); - return NULL; + return -1; } if (def->parent.name[0] == '.') { @@ -1624,7 +1578,7 @@ qemuSnapshotCreateXML(virDomainPtr domain, _("invalid snapshot name '%s': " "name can't start with '.'"), def->parent.name); - return NULL; + return -1; } } @@ -1635,7 +1589,7 @@ qemuSnapshotCreateXML(virDomainPtr domain, virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("live snapshot creation is supported only " "during full system snapshots")); - return NULL; + return -1; } /* allow snapshots only in certain states */ @@ -1653,7 +1607,7 @@ qemuSnapshotCreateXML(virDomainPtr domain, if (!redefine) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"), virDomainSnapshotStateTypeToString(state)); - return NULL; + return -1; } break; @@ -1661,7 +1615,7 @@ qemuSnapshotCreateXML(virDomainPtr domain, virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("qemu doesn't support taking snapshots of " "PMSUSPENDED guests")); - return NULL; + return -1; /* invalid states */ case VIR_DOMAIN_SNAPSHOT_NOSTATE: @@ -1669,9 +1623,69 @@ qemuSnapshotCreateXML(virDomainPtr domain, case VIR_DOMAIN_SNAPSHOT_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"), virDomainSnapshotStateTypeToString(state)); + return -1; + } + + return 0; +} + + +virDomainSnapshotPtr +qemuSnapshotCreateXML(virDomainPtr domain, + virDomainObj *vm, + const char *xmlDesc, + unsigned int flags) +{ + virQEMUDriver *driver = domain->conn->privateData; + g_autofree char *xml = NULL; + virDomainMomentObj *snap = NULL; + virDomainSnapshotPtr snapshot = NULL; + virDomainMomentObj *current = NULL; + bool update_current = true; + bool redefine = flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE; + int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL; + bool align_match = true; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(virDomainSnapshotDef) def = NULL; + + virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE | + VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT | + VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA | + VIR_DOMAIN_SNAPSHOT_CREATE_HALT | + VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY | + VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT | + VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE | + VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC | + VIR_DOMAIN_SNAPSHOT_CREATE_LIVE | + VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, NULL); + + VIR_REQUIRE_FLAG_RET(VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE, + VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY, + NULL); + VIR_EXCLUSIVE_FLAGS_RET(VIR_DOMAIN_SNAPSHOT_CREATE_LIVE, + VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE, + NULL); + + if ((redefine && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT)) || + (flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) + update_current = false; + + if (qemuDomainSupportsCheckpointsBlockjobs(vm) < 0) + return NULL; + + if (!vm->persistent && (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot halt after transient domain snapshot")); return NULL; } + if (!(def = qemuSnapshotCreateXMLParse(vm, driver, xmlDesc, flags))) + return NULL; + + if (qemuSnapshotCreateXMLValidateDef(vm, def, flags) < 0) + return NULL; + /* We are going to modify the domain below. Internal snapshots would use * a regular job, so we need to set the job mask to disallow query as * 'savevm' blocks the monitor. External snapshot will then modify the -- 2.47.2