From 97e4fb3c106fe38c1440e762014390a9821a4d69 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 2 Jul 2021 16:00:05 +0200 Subject: [PATCH] qemu: snapshot: Translate 'volume' disks before attempting offline snapshot manipulation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the VM is inactive the 'virStorageSource' struct doesn't have the necessary data pointing to the actual storage. This is a problem for inactive snapshot operations on VMs which use disk type='volume'. Add the translation steps for reversion and deletion of snapshots. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1977155 Resolves: https://gitlab.com/libvirt/libvirt/-/issues/202 Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_domain.c | 6 ++++++ src/qemu/qemu_snapshot.c | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 65c3394d99..25b7f03204 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7088,6 +7088,7 @@ qemuDomainSnapshotDiscard(virQEMUDriver *driver, if (!metadata_only) { if (!virDomainObjIsActive(vm)) { + size_t i; /* Ignore any skipped disks */ /* Prefer action on the disks in use at the time the snapshot was @@ -7098,6 +7099,11 @@ qemuDomainSnapshotDiscard(virQEMUDriver *driver, if (!def) def = vm->def; + for (i = 0; i < def->ndisks; i++) { + if (virDomainDiskTranslateSourcePool(def->disks[i]) < 0) + return -1; + } + if (qemuDomainSnapshotForEachQcow2(driver, def, snap, "-d", true) < 0) return -1; } else { diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 4e74ddd7f8..fa1f9ce973 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1813,6 +1813,8 @@ qemuSnapshotRevertInactive(virQEMUDriver *driver, virDomainObj *vm, virDomainMomentObj *snap) { + size_t i; + /* Prefer action on the disks in use at the time the snapshot was * created; but fall back to current definition if dealing with a * snapshot created prior to libvirt 0.9.5. */ @@ -1821,6 +1823,11 @@ qemuSnapshotRevertInactive(virQEMUDriver *driver, if (!def) def = vm->def; + for (i = 0; i < def->ndisks; i++) { + if (virDomainDiskTranslateSourcePool(def->disks[i]) < 0) + return -1; + } + /* Try all disks, but report failure if we skipped any. */ if (qemuDomainSnapshotForEachQcow2(driver, def, snap, "-a", true) != 0) return -1;