- build: Bump minimum glib2 version to 2.66.0 (RHEL-77884) - qemuProcessHandleIOError: Refactor to extract 'priv' instead of 'driver' (RHEL-77884) - qemu: Handle quirks of 'device' field of BLOCK_IO_ERROR event in monitor code (RHEL-77884) - qemu: Rename 'diskAlias' to 'device' in qemu IO error event handling (RHEL-77884) - qemuProcessHandleIOError: Rename local variables (RHEL-77884) - qemuMonitorJSONHandleIOError: Do not munge 'reason' field of IO error event (RHEL-77884) - qemuProcessHandleIOError: Prefer lookup by node name (RHEL-77884) - qemuMonitorJSONHandleIOError: Propagate new 'qom-path' field (RHEL-77884) - virStorageSource: Add fields for storing last I/O error message (RHEL-77884) - qemuProcessHandleIOError: Populate I/O error reason to virStorageSource (RHEL-77884) - qemuProcessHandleIOError: Log IO errors in the VM log file (RHEL-77884) - libxlDomainGetMessages: Add existing flags to 'virCheckFlags' (RHEL-77884) - virDomainObjGetMessages: Refactor using GPtrArray (RHEL-77884) - virDomainGetMessages: Introduce VIR_DOMAIN_MESSAGE_IOERRORS (RHEL-77884) - include: libvirt-domain: Reword documentation for @reason of VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON (RHEL-77884) - include: libvirt-domain: Add 'message' @reason of VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON (RHEL-77884) - qemuSnapshotForEachQcow2: Don't initialize 'nrollback' (RHEL-73315) - qemu: process: Export qemuPrepareNVRAM for use in snapshot code (RHEL-73315) - qemu: snapshot: Ensure that NVRAM image exists when taking inactive internal snapshot (RHEL-73315) - qemuxmlconftest: Allow testing of the 'writable' flag for passed FDs for disks (RHEL-37519) - qemuxmlconftest: Add testing of FDs with 'writable' flag in 'disk-source-fd' (RHEL-37519) - qemu: domain: Initialize FD passthrough for a virStorageSource before using it (RHEL-37519) Resolves: RHEL-37519, RHEL-73315, RHEL-77884
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
|