1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

hyperv: fix domainSuspend and domainResume on Hyper-V V2

Signed-off-by: Matt Coleman <matt@datto.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Matt Coleman 2020-10-21 04:46:11 -04:00 committed by Michal Privoznik
parent d4f09baa6b
commit a9f1a798fd
2 changed files with 26 additions and 9 deletions

View File

@ -896,19 +896,26 @@ hypervDomainSuspend(virDomainPtr domain)
int result = -1; int result = -1;
hypervPrivate *priv = domain->conn->privateData; hypervPrivate *priv = domain->conn->privateData;
Msvm_ComputerSystem *computerSystem = NULL; Msvm_ComputerSystem *computerSystem = NULL;
int requestedState = -1;
switch (priv->wmiVersion) {
case HYPERV_WMI_VERSION_V1:
requestedState = MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED;
break;
case HYPERV_WMI_VERSION_V2:
requestedState = MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE;
break;
}
if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0) if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
goto cleanup; goto cleanup;
if (computerSystem->data.common->EnabledState != if (computerSystem->data.common->EnabledState != MSVM_COMPUTERSYSTEM_ENABLEDSTATE_ENABLED) {
MSVM_COMPUTERSYSTEM_ENABLEDSTATE_ENABLED) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not active"));
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("Domain is not active"));
goto cleanup; goto cleanup;
} }
result = hypervInvokeMsvmComputerSystemRequestStateChange result = hypervInvokeMsvmComputerSystemRequestStateChange(domain, requestedState);
(domain, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED);
cleanup: cleanup:
hypervFreeObject(priv, (hypervObject *)computerSystem); hypervFreeObject(priv, (hypervObject *)computerSystem);
@ -924,12 +931,21 @@ hypervDomainResume(virDomainPtr domain)
int result = -1; int result = -1;
hypervPrivate *priv = domain->conn->privateData; hypervPrivate *priv = domain->conn->privateData;
Msvm_ComputerSystem *computerSystem = NULL; Msvm_ComputerSystem *computerSystem = NULL;
int expectedState = -1;
switch (priv->wmiVersion) {
case HYPERV_WMI_VERSION_V1:
expectedState = MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSED;
break;
case HYPERV_WMI_VERSION_V2:
expectedState = MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE;
break;
}
if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0) if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
goto cleanup; return -1;
if (computerSystem->data.common->EnabledState != if (computerSystem->data.common->EnabledState != expectedState) {
MSVM_COMPUTERSYSTEM_ENABLEDSTATE_PAUSED) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s", virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("Domain is not paused")); _("Domain is not paused"));
goto cleanup; goto cleanup;

View File

@ -73,6 +73,7 @@ enum _Msvm_ComputerSystem_EnabledState {
enum _Msvm_ComputerSystem_RequestedState { enum _Msvm_ComputerSystem_RequestedState {
MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_ENABLED = 2, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_ENABLED = 2,
MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_DISABLED = 3, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_DISABLED = 3,
MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE = 9,
MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_REBOOT = 10, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_REBOOT = 10,
MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_RESET = 11, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_RESET = 11,
MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED = 32768, MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_PAUSED = 32768,