On Mon, Mar 13, 2023 at 16:42:15 +0100, Pavel Hrdina wrote:
When block commit is not needed we can just simply unlink the
disk files.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/qemu/qemu_snapshot.c | 55 +++++++++++++++++++++++++---------------
1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c
index be2e5c8cc4..dbcdf56758 100644
--- a/src/qemu/qemu_snapshot.c
+++ b/src/qemu/qemu_snapshot.c
[...]
@@ -2949,31 +2951,41 @@ qemuSnapshotDiscardExternal(virDomainObj
*vm,
virTristateBool autofinalize = VIR_TRISTATE_BOOL_NO;
unsigned int commitFlags = VIR_DOMAIN_BLOCK_COMMIT_DELETE;
- if (data->domDisk->src == data->diskSrc) {
- commitFlags |= VIR_DOMAIN_BLOCK_COMMIT_ACTIVE;
- autofinalize = VIR_TRISTATE_BOOL_YES;
+ if (data->blockCommit) {
+ if (data->domDisk->src == data->diskSrc) {
+ commitFlags |= VIR_DOMAIN_BLOCK_COMMIT_ACTIVE;
+ autofinalize = VIR_TRISTATE_BOOL_YES;
+ }
+
+ if (qemuSnapshotSetInvalid(vm, data->parentSnap, data->snapDisk, true)
< 0)
+ goto error;
+
+ data->job = qemuBlockCommit(vm,
+ data->domDisk,
+ data->parentDiskSrc,
+ data->diskSrc,
+ data->prevDiskSrc,
+ 0,
+ VIR_ASYNC_JOB_SNAPSHOT,
+ autofinalize,
+ commitFlags);
+
+ if (!data->job)
+ goto error;
+ } else {
+ if (unlink(data->snapDisk->src->path) < 0) {
This can be done only when the 'src' object is "local storage"
(virStorageSourceIsLocalStorage)
+ VIR_WARN("Failed to remove snapshot image
'%s'",
+ data->snapDisk->name);
+ }
Reviewed-by: Peter Krempa <pkrempa(a)redhat.com>