mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 19:32:19 +00:00
qemu: snapshot: Don't modify persistent XML if disk source is different
While the VM is running the persistent source of a disk might differ e.g. as the 'newDef' was redefined. Our snapshot code would blindly rewrite the source of such disk if it shared the 'target'. Fix this by checking whether the source is the same in the first place. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
6ff9241058
commit
280aa77eaf
@ -15318,6 +15318,7 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
|
|||||||
qemuDomainSnapshotDiskDataPtr dd;
|
qemuDomainSnapshotDiskDataPtr dd;
|
||||||
char *backingStoreStr;
|
char *backingStoreStr;
|
||||||
virDomainSnapshotDefPtr snapdef = virDomainSnapshotObjGetDef(snap);
|
virDomainSnapshotDefPtr snapdef = virDomainSnapshotObjGetDef(snap);
|
||||||
|
virDomainDiskDefPtr persistdisk;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (VIR_ALLOC_N(data, snapdef->ndisks) < 0)
|
if (VIR_ALLOC_N(data, snapdef->ndisks) < 0)
|
||||||
@ -15338,13 +15339,12 @@ qemuDomainSnapshotDiskDataCollect(virQEMUDriverPtr driver,
|
|||||||
if (virStorageSourceInitChainElement(dd->src, dd->disk->src, false) < 0)
|
if (virStorageSourceInitChainElement(dd->src, dd->disk->src, false) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Note that it's unsafe to assume that the disks in the persistent
|
/* modify disk in persistent definition only when the source is the same */
|
||||||
* definition match up with the disks in the live definition just by
|
|
||||||
* checking that the target name is the same. We've done that
|
|
||||||
* historically this way though. */
|
|
||||||
if (vm->newDef &&
|
if (vm->newDef &&
|
||||||
(dd->persistdisk = virDomainDiskByName(vm->newDef, dd->disk->dst,
|
(persistdisk = virDomainDiskByName(vm->newDef, dd->disk->dst, false)) &&
|
||||||
false))) {
|
virStorageSourceIsSameLocation(dd->disk->src, persistdisk->src)) {
|
||||||
|
|
||||||
|
dd->persistdisk = persistdisk;
|
||||||
|
|
||||||
if (!(dd->persistsrc = virStorageSourceCopy(dd->src, false)))
|
if (!(dd->persistsrc = virStorageSourceCopy(dd->src, false)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user