qemu_snapshot: delete: properly update parent snapshot with revert data

When deleting external snapshot and parent snapshot is the currently
active snapshot as user reverted to it we need to properly update the
parent snapshot metadata.

After the delete is done the new overlay files will be the currently
used files created when snapshot revert was done, replacing the original
overlay files.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Pavel Hrdina 2023-02-22 11:43:45 +01:00
parent 7c402396ec
commit a68b849c51

View File

@ -3229,6 +3229,41 @@ qemuSnapshotDiscardExternal(virDomainObj *vm,
}
static int
qemuSnapshotDeleteUpdateParent(virDomainObj *vm,
virDomainMomentObj *parent)
{
size_t i;
virQEMUDriver *driver = QEMU_DOMAIN_PRIVATE(vm)->driver;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
virDomainSnapshotDef *parentDef = virDomainSnapshotObjGetDef(parent);
if (!parentDef)
return 0;
if (!parentDef->revertdisks)
return 0;
for (i = 0; i < parentDef->ndisks; i++) {
virDomainSnapshotDiskDefClear(&parentDef->disks[i]);
}
g_free(parentDef->disks);
parentDef->disks = g_steal_pointer(&parentDef->revertdisks);
parentDef->ndisks = parentDef->nrevertdisks;
parentDef->nrevertdisks = 0;
if (qemuDomainSnapshotWriteMetadata(vm,
parent,
driver->xmlopt,
cfg->snapshotDir) < 0) {
return -1;
}
return 0;
}
static int
qemuSnapshotDiscardMetadata(virDomainObj *vm,
virDomainMomentObj *snap,
@ -3268,6 +3303,11 @@ qemuSnapshotDiscardMetadata(virDomainObj *vm,
virDomainMomentMoveChildren(snap, snap->parent);
}
if (update_parent && snap->parent) {
if (qemuSnapshotDeleteUpdateParent(vm, snap->parent) < 0)
ret = -1;
}
snapFile = g_strdup_printf("%s/%s/%s.xml", cfg->snapshotDir, vm->def->name,
snap->def->name);