From 542f1378bfa6ef08b1aa7d1075ee24e5fb6854a4 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 15 May 2025 08:21:49 +0200 Subject: [PATCH] qemuSnapshotRevertActive: Remove transient domain on failure Code paths which deal with stopping of the qemu process need extra handling for transient definitions as they need to be removed from the domain list when we'd be leaving them inactive. In case of snapshot code it's on failure to revert a snapshot as we stop the qemu process but the failure to revert may mean that the new process will not be started. I've observed this when I was fixing the recent bug in snapshot reversion which left the domain in unusable state after failure to revert: $ virsh list foo error: Requested operation is not valid: domain is not running $ virsh undefine foo error: Requested operation is not valid: cannot undefine transient domain Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_snapshot.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index f9b18f94b6..6926d1a0e4 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2628,13 +2628,12 @@ qemuSnapshotRevertActive(virDomainObj *vm, if (virDomainSnapshotIsExternal(snap)) { if (!(tmpsnapdef = virDomainSnapshotDefNew())) - return -1; + goto error; if (qemuSnapshotRevertExternalPrepare(vm, tmpsnapdef, snap, *config, *inactiveConfig, - &memdata) < 0) { - return -1; - } + &memdata) < 0) + goto error; } else { loadSnap = snap; } @@ -2656,7 +2655,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, VIR_ASYNC_JOB_SNAPSHOT, VIR_QEMU_PROCESS_STOP_MIGRATED); } - return -1; + goto error; } detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT; @@ -2667,7 +2666,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, if (virDomainSnapshotIsExternal(snap)) { if (qemuSnapshotRevertExternalActive(vm, tmpsnapdef) < 0) - return -1; + goto error; qemuSnapshotRevertExternalFinish(vm, tmpsnapdef, snap); } @@ -2689,16 +2688,22 @@ qemuSnapshotRevertActive(virDomainObj *vm, if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("guest unexpectedly quit")); - return -1; + goto error; } rc = qemuProcessStartCPUs(driver, vm, VIR_DOMAIN_RUNNING_FROM_SNAPSHOT, VIR_ASYNC_JOB_SNAPSHOT); if (rc < 0) - return -1; + goto error; } return qemuSnapshotRevertWriteMetadata(vm, snap, driver, cfg, defined); + + error: + if (!virDomainObjIsActive(vm)) + qemuDomainRemoveInactive(driver, vm, 0, false); + + return -1; } -- 2.47.3