76 lines
3.0 KiB
Diff
76 lines
3.0 KiB
Diff
From c9c9405687b78713b913c09113697fcadec1cdba Mon Sep 17 00:00:00 2001
|
|
Message-ID: <c9c9405687b78713b913c09113697fcadec1cdba.1741876175.git.jdenemar@redhat.com>
|
|
From: Pavel Hrdina <phrdina@redhat.com>
|
|
Date: Wed, 26 Feb 2025 11:04:52 +0100
|
|
Subject: [PATCH] qemu: snapshot: error out early when reverting snapshot for
|
|
VM with non-file disk
|
|
|
|
Before this patch the code would start the revert process by destroying
|
|
the VM and preparing to revert where it would fail with following error:
|
|
|
|
error: unsupported configuration: source for disk 'sdb' is not a regular file; refusing to generate external snapshot name
|
|
|
|
and leaving user with offline VM even if it was running.
|
|
|
|
Make the check before we start the revert process to not destroy VMs.
|
|
|
|
Resolves: https://issues.redhat.com/browse/RHEL-30971
|
|
Resolves: https://issues.redhat.com/browse/RHEL-79928
|
|
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
|
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
|
|
(cherry picked from commit 278b8334eb26aa9495f6d37e4f72471cbc8739a6)
|
|
|
|
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
|
---
|
|
src/qemu/qemu_snapshot.c | 21 +++++++++++++++++++++
|
|
1 file changed, 21 insertions(+)
|
|
|
|
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
|
|
index 3a8510c69e..16d3aaf6e7 100644
|
|
--- a/src/qemu/qemu_snapshot.c
|
|
+++ b/src/qemu/qemu_snapshot.c
|
|
@@ -2190,6 +2190,8 @@ qemuSnapshotRevertValidate(virDomainObj *vm,
|
|
virDomainSnapshotDef *snapdef,
|
|
unsigned int flags)
|
|
{
|
|
+ size_t i;
|
|
+
|
|
if (!vm->persistent &&
|
|
snapdef->state != VIR_DOMAIN_SNAPSHOT_RUNNING &&
|
|
snapdef->state != VIR_DOMAIN_SNAPSHOT_PAUSED &&
|
|
@@ -2217,6 +2219,22 @@ qemuSnapshotRevertValidate(virDomainObj *vm,
|
|
}
|
|
}
|
|
|
|
+ /* Reverting to external snapshot creates overlay files for every disk and
|
|
+ * it would fail for non-file based disks.
|
|
+ * See qemuSnapshotRevertExternalPrepare for more details. */
|
|
+ if (virDomainSnapshotIsExternal(snap)) {
|
|
+ for (i = 0; i < snap->def->dom->ndisks; i++) {
|
|
+ virDomainDiskDef *disk = snap->def->dom->disks[i];
|
|
+
|
|
+ if (disk->src->type != VIR_STORAGE_TYPE_FILE) {
|
|
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
|
+ _("source disk for '%1$s' is not a regular file, reverting to snapshot is not supported"),
|
|
+ disk->dst);
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -2368,6 +2386,9 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm,
|
|
if (virDomainMomentDefPostParse(&tmpsnapdef->parent) < 0)
|
|
return -1;
|
|
|
|
+ /* Force default location to be external in order to create overlay files
|
|
+ * for every disk. In qemuSnapshotRevertValidate we make sure that each
|
|
+ * disk is regular file otherwise this would fail. */
|
|
if (virDomainSnapshotAlignDisks(tmpsnapdef, domdef,
|
|
VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL,
|
|
false, true) < 0) {
|
|
--
|
|
2.48.1
|