mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-02 20:58:33 +03:00
snapshot: populate new XML info for qemu snapshots
Now that the XML supports listing internal snapshots, it is worth always populating the <memory> and <disks> element to match. * src/qemu/qemu_driver.c (qemuDomainSnapshotCreateXML): Always parse disk info and set memory info.
This commit is contained in:
parent
f9670bf8a4
commit
e260e401a5
@ -11192,8 +11192,10 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||
virDomainSnapshotDefPtr def = NULL;
|
||||
bool update_current = true;
|
||||
unsigned int parse_flags = 0;
|
||||
unsigned int parse_flags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
|
||||
virDomainSnapshotObjPtr other = NULL;
|
||||
int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL;
|
||||
int align_match = true;
|
||||
|
||||
virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
|
||||
VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
|
||||
@ -11217,8 +11219,6 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
update_current = false;
|
||||
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE)
|
||||
parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE;
|
||||
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY)
|
||||
parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
|
||||
|
||||
qemuDriverLock(driver);
|
||||
virUUIDFormat(domain->uuid, uuidstr);
|
||||
@ -11245,6 +11245,9 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
_("cannot halt after transient domain snapshot"));
|
||||
goto cleanup;
|
||||
}
|
||||
if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) ||
|
||||
!virDomainObjIsActive(vm))
|
||||
parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_OFFLINE;
|
||||
|
||||
if (!(def = virDomainSnapshotDefParseString(xmlDesc, driver->caps,
|
||||
QEMU_EXPECTED_VIRT_TYPES,
|
||||
@ -11285,6 +11288,15 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
}
|
||||
|
||||
/* Check that any replacement is compatible */
|
||||
if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) &&
|
||||
def->state != VIR_DOMAIN_DISK_SNAPSHOT) {
|
||||
virReportError(VIR_ERR_INVALID_ARG,
|
||||
_("disk-only flag for snapshot %s requires "
|
||||
"disk-snapshot state"),
|
||||
def->name);
|
||||
goto cleanup;
|
||||
|
||||
}
|
||||
if (def->dom &&
|
||||
memcmp(def->dom->uuid, domain->uuid, VIR_UUID_BUFLEN)) {
|
||||
virReportError(VIR_ERR_INVALID_ARG,
|
||||
@ -11334,10 +11346,13 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
other->def = NULL;
|
||||
snap = other;
|
||||
}
|
||||
if (def->state == VIR_DOMAIN_DISK_SNAPSHOT && def->dom) {
|
||||
if (virDomainSnapshotAlignDisks(def,
|
||||
VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL,
|
||||
false) < 0)
|
||||
if (def->dom) {
|
||||
if (def->state == VIR_DOMAIN_DISK_SNAPSHOT) {
|
||||
align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
|
||||
align_match = false;
|
||||
}
|
||||
if (virDomainSnapshotAlignDisks(def, align_location,
|
||||
align_match) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
} else {
|
||||
@ -11356,13 +11371,14 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
"implemented yet"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (virDomainSnapshotAlignDisks(def,
|
||||
VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL,
|
||||
false) < 0)
|
||||
goto cleanup;
|
||||
if (qemuDomainSnapshotDiskPrepare(vm, def, &flags) < 0)
|
||||
align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL;
|
||||
align_match = false;
|
||||
if (virDomainSnapshotAlignDisks(def, align_location,
|
||||
align_match) < 0 ||
|
||||
qemuDomainSnapshotDiskPrepare(vm, def, &flags) < 0)
|
||||
goto cleanup;
|
||||
def->state = VIR_DOMAIN_DISK_SNAPSHOT;
|
||||
def->memory = VIR_DOMAIN_SNAPSHOT_LOCATION_NONE;
|
||||
} else {
|
||||
/* In a perfect world, we would allow qemu to tell us this.
|
||||
* The problem is that qemu only does this check
|
||||
@ -11373,9 +11389,14 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
||||
* the boot device. This is probably a bug in qemu, but we'll
|
||||
* work around it here for now.
|
||||
*/
|
||||
if (!qemuDomainSnapshotIsAllowed(vm))
|
||||
if (!qemuDomainSnapshotIsAllowed(vm) ||
|
||||
virDomainSnapshotAlignDisks(def, align_location,
|
||||
align_match) < 0)
|
||||
goto cleanup;
|
||||
def->state = virDomainObjGetState(vm, NULL);
|
||||
def->memory = (def->state == VIR_DOMAIN_SHUTOFF ?
|
||||
VIR_DOMAIN_SNAPSHOT_LOCATION_NONE :
|
||||
VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user