95 lines
3.6 KiB
Diff
95 lines
3.6 KiB
Diff
From 45fe2375b04f05ff9f9cb0f84dd3c5408718353f Mon Sep 17 00:00:00 2001
|
|
Message-ID: <45fe2375b04f05ff9f9cb0f84dd3c5408718353f.1738940191.git.jdenemar@redhat.com>
|
|
From: Peter Krempa <pkrempa@redhat.com>
|
|
Date: Mon, 3 Feb 2025 17:52:50 +0100
|
|
Subject: [PATCH] qemu: snapshot: Ensure that NVRAM image exists when taking
|
|
inactive internal snapshot
|
|
|
|
Attempting to take an internal snapshot of a freshly defined VM with
|
|
qcow2 backed NVRAM results in failure as the NVRAM image doesn't get
|
|
populated until the VM is started for the first time.
|
|
|
|
Fix this by invoking qemuPrepareNVRAM() when qcow2 nvram is defined.
|
|
|
|
Resolves: https://issues.redhat.com/browse/RHEL-73315
|
|
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
|
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
|
|
(cherry picked from commit 650e6fb7ebf905fe7dc992610ef9e932328460b7)
|
|
|
|
https://issues.redhat.com/browse/RHEL-73315
|
|
---
|
|
src/qemu/qemu_snapshot.c | 23 +++++++++++++++++++----
|
|
1 file changed, 19 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
|
|
index 7c998afe6f..b1f4ebb995 100644
|
|
--- a/src/qemu/qemu_snapshot.c
|
|
+++ b/src/qemu/qemu_snapshot.c
|
|
@@ -269,6 +269,7 @@ qemuSnapshotForEachQcow2One(virStorageSource *src,
|
|
/**
|
|
* qemuSnapshotForEachQcow2:
|
|
*
|
|
+ * @driver: qemu driver configuration
|
|
* @def: domain definition
|
|
* @snap: snapshot object
|
|
* @op: 'qemu-img snapshot' operation flag, one of "-c", "-d", "-a"
|
|
@@ -282,7 +283,8 @@ qemuSnapshotForEachQcow2One(virStorageSource *src,
|
|
* permissive modes.
|
|
*/
|
|
static int
|
|
-qemuSnapshotForEachQcow2(virDomainDef *def,
|
|
+qemuSnapshotForEachQcow2(virQEMUDriver *driver,
|
|
+ virDomainDef *def,
|
|
virDomainMomentObj *snap,
|
|
const char *op)
|
|
{
|
|
@@ -352,6 +354,16 @@ qemuSnapshotForEachQcow2(virDomainDef *def,
|
|
|
|
if (virStorageSourceIsLocalStorage(nvram) &&
|
|
nvram->format == VIR_STORAGE_FILE_QCOW2) {
|
|
+ if (create) {
|
|
+ /* Ensure that the NVRAM image exists; e.g. when snapshotting
|
|
+ * a VM directly after defining it */
|
|
+ if (qemuPrepareNVRAM(driver, def, false) < 0) {
|
|
+ nrollback = def->ndisks;
|
|
+ virErrorPreserveLast(&orig_err);
|
|
+ goto rollback;
|
|
+ }
|
|
+ }
|
|
+
|
|
if (qemuSnapshotForEachQcow2One(nvram, op, snap->def->name) < 0) {
|
|
if (create) {
|
|
nrollback = def->ndisks;
|
|
@@ -392,7 +404,8 @@ static int
|
|
qemuSnapshotCreateInactiveInternal(virDomainObj *vm,
|
|
virDomainMomentObj *snap)
|
|
{
|
|
- return qemuSnapshotForEachQcow2(vm->def, snap, "-c");
|
|
+ return qemuSnapshotForEachQcow2(QEMU_DOMAIN_PRIVATE(vm)->driver,
|
|
+ vm->def, snap, "-c");
|
|
}
|
|
|
|
|
|
@@ -2696,7 +2709,8 @@ qemuSnapshotInternalRevertInactive(virDomainObj *vm,
|
|
}
|
|
|
|
/* Try all disks, but report failure if we skipped any. */
|
|
- if (qemuSnapshotForEachQcow2(def, snap, "-a") != 0)
|
|
+ if (qemuSnapshotForEachQcow2(QEMU_DOMAIN_PRIVATE(vm)->driver,
|
|
+ def, snap, "-a") != 0)
|
|
return -1;
|
|
|
|
return 0;
|
|
@@ -4064,7 +4078,8 @@ qemuSnapshotDiscardImpl(virDomainObj *vm,
|
|
if (qemuSnapshotDiscardExternal(vm, snap, externalData) < 0)
|
|
return -1;
|
|
} else {
|
|
- if (qemuSnapshotForEachQcow2(def, snap, "-d") < 0)
|
|
+ if (qemuSnapshotForEachQcow2(QEMU_DOMAIN_PRIVATE(vm)->driver,
|
|
+ def, snap, "-d") < 0)
|
|
return -1;
|
|
}
|
|
} else {
|
|
--
|
|
2.48.1
|