qemu: Fix snapshot redefine vs. domain state bug
The existing qemu snapshot code has a slight bug: if the domain is currently pmsuspended, you can't use the _REDEFINE flag even though the current domain state should have no bearing on being able to recreate metadata state; and conversely, you can use the _REDEFINE flag to create snapshot metadata claiming to be pmsuspended as a bypass to the normal restrictions that you can't create an original qemu snapshot in that state (the restriction against pmsuspend is specific to qemu, rather than part of the driver-agnostic snapshot_conf code). Fix this by checking the snapshot state (when redefining) instead of the domain state (which is a subset of snapshot states). Fixes the second problem mentioned in https://bugzilla.redhat.com/1680304 Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
5de5432e34
commit
3926d0aa49
@ -15693,6 +15693,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
|||||||
virQEMUDriverConfigPtr cfg = NULL;
|
virQEMUDriverConfigPtr cfg = NULL;
|
||||||
virCapsPtr caps = NULL;
|
virCapsPtr caps = NULL;
|
||||||
qemuDomainObjPrivatePtr priv;
|
qemuDomainObjPrivatePtr priv;
|
||||||
|
virDomainState state;
|
||||||
|
|
||||||
virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
|
virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
|
||||||
VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
|
VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
|
||||||
@ -15776,7 +15777,11 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* allow snapshots only in certain states */
|
/* allow snapshots only in certain states */
|
||||||
switch ((virDomainState) vm->state.state) {
|
state = vm->state.state;
|
||||||
|
if (redefine)
|
||||||
|
state = def->state == VIR_DOMAIN_DISK_SNAPSHOT ? VIR_DOMAIN_SHUTOFF :
|
||||||
|
def->state;
|
||||||
|
switch (state) {
|
||||||
/* valid states */
|
/* valid states */
|
||||||
case VIR_DOMAIN_RUNNING:
|
case VIR_DOMAIN_RUNNING:
|
||||||
case VIR_DOMAIN_PAUSED:
|
case VIR_DOMAIN_PAUSED:
|
||||||
@ -15796,7 +15801,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain,
|
|||||||
case VIR_DOMAIN_BLOCKED: /* invalid state, unused in qemu */
|
case VIR_DOMAIN_BLOCKED: /* invalid state, unused in qemu */
|
||||||
case VIR_DOMAIN_LAST:
|
case VIR_DOMAIN_LAST:
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"),
|
virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"),
|
||||||
virDomainStateTypeToString(vm->state.state));
|
virDomainStateTypeToString(state));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user