From 97f5f89dbfb8a6a896a488a9e61a55f16074586e Mon Sep 17 00:00:00 2001 Message-ID: <97f5f89dbfb8a6a896a488a9e61a55f16074586e.1737462828.git.jdenemar@redhat.com> From: Pavel Hrdina Date: Thu, 9 Jan 2025 16:23:44 +0100 Subject: [PATCH] qemu: snapshot: delete disk image only if parent snapshot is external When we are deleting external snapshot that is not active we only need to delete overlay disk image of the parent snapshot. This works correctly even if parent snapshot is external and active as it will have another overlay created when user reverted to that snapshot. In case the parent snapshot is internal there are no overlay disk images created as everything is stored internally within the disk image. In this case we would delete the actual disk image storing internal snapshots and most likely the original disk image as well resulting in data loss once the VM is shutoff. Fixes: https://gitlab.com/libvirt/libvirt/-/issues/734 Signed-off-by: Pavel Hrdina Reviewed-by: Peter Krempa (cherry picked from commit d51179fa82448f4720f1645f0b7100df80508cc4) https://issues.redhat.com/browse/RHEL-75154 Signed-off-by: Pavel Hrdina --- src/qemu/qemu_snapshot.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index f5260c4a22..e42f80f2f9 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2884,6 +2884,8 @@ qemuSnapshotDeleteExternalPrepareData(virDomainObj *vm, return -1; } + data->parentSnap = qemuSnapshotFindParentSnapForDisk(snap, data->snapDisk); + if (data->merge) { virStorageSource *snapDiskSrc = NULL; @@ -2925,8 +2927,6 @@ qemuSnapshotDeleteExternalPrepareData(virDomainObj *vm, qemuSnapshotGetDisksWithBackingStore(vm, snap, data); } - data->parentSnap = qemuSnapshotFindParentSnapForDisk(snap, data->snapDisk); - if (data->parentSnap && !virDomainSnapshotIsExternal(data->parentSnap)) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("deleting external snapshot that has internal snapshot as parent not supported")); @@ -3392,10 +3392,12 @@ qemuSnapshotDiscardExternal(virDomainObj *vm, if (!data->job) goto error; } else { - if (virStorageSourceInit(data->parentDomDisk->src) < 0 || - virStorageSourceUnlink(data->parentDomDisk->src) < 0) { - VIR_WARN("Failed to remove snapshot image '%s'", - data->snapDisk->name); + if (data->parentSnap && virDomainSnapshotIsExternal(data->parentSnap)) { + if (virStorageSourceInit(data->parentDomDisk->src) < 0 || + virStorageSourceUnlink(data->parentDomDisk->src) < 0) { + VIR_WARN("Failed to remove snapshot image '%s'", + data->snapDisk->name); + } } } } -- 2.48.1