mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
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:
parent
7c402396ec
commit
a68b849c51
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user