virDomainObjUnref(obj);
}
+static int doStopCPUs(struct qemud_driver *driver, virDomainObjPtr vm)
+{
+ int ret;
+ int oldState = vm->state;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ vm->state = VIR_DOMAIN_PAUSED;
+ qemuDomainObjEnterMonitorWithDriver(driver, vm);
+ ret = qemuMonitorStopCPUs(priv->mon);
+ qemuDomainObjExitMonitorWithDriver(driver, vm);
+ if (ret < 0) {
+ vm->state = oldState;
+ }
+ return ret;
+}
+
void qemuDomainDefNamespaceFree(void *nsdata)
{
qemuDomainCmdlineDefPtr cmd = nsdata;
goto endjob;
}
if (vm->state != VIR_DOMAIN_PAUSED) {
- int rc;
- int state = vm->state;
-
- vm->state = VIR_DOMAIN_PAUSED;
- qemuDomainObjEnterMonitorWithDriver(driver, vm);
- rc = qemuMonitorStopCPUs(priv->mon);
- qemuDomainObjExitMonitorWithDriver(driver, vm);
- if (rc < 0) {
- vm->state = state;
+ if (doStopCPUs(driver, vm) < 0) {
goto endjob;
}
event = virDomainEventNewFromObj(vm,
qemuDomainMigrateOffline(struct qemud_driver *driver,
virDomainObjPtr vm)
{
- qemuDomainObjPrivatePtr priv = vm->privateData;
- int state = vm->state;
int ret;
- vm->state = VIR_DOMAIN_PAUSED;
- qemuDomainObjEnterMonitorWithDriver(driver, vm);
- ret = qemuMonitorStopCPUs(priv->mon);
- qemuDomainObjExitMonitorWithDriver(driver, vm);
-
+ ret = doStopCPUs(driver, vm);
if (ret == 0) {
virDomainEventPtr event;
VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED);
if (event)
qemuDomainEventQueue(driver, event);
- } else
- vm->state = state;
+ }
return ret;
}
/* Pause */
if (vm->state == VIR_DOMAIN_RUNNING) {
header.was_running = 1;
- vm->state = VIR_DOMAIN_PAUSED;
- qemuDomainObjEnterMonitorWithDriver(driver, vm);
- if (qemuMonitorStopCPUs(priv->mon) < 0) {
- qemuDomainObjExitMonitorWithDriver(driver, vm);
- vm->state = VIR_DOMAIN_RUNNING;
+ if (doStopCPUs(driver, vm) < 0)
goto endjob;
- }
- qemuDomainObjExitMonitorWithDriver(driver, vm);
if (!virDomainObjIsActive(vm)) {
qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
/* Pause domain for non-live dump */
if (!(flags & VIR_DUMP_LIVE) && vm->state == VIR_DOMAIN_RUNNING) {
- vm->state = VIR_DOMAIN_PAUSED;
- qemuDomainObjEnterMonitorWithDriver(driver, vm);
- if (qemuMonitorStopCPUs(priv->mon) < 0) {
- qemuDomainObjExitMonitorWithDriver(driver, vm);
- vm->state = VIR_DOMAIN_RUNNING;
+ if (doStopCPUs(driver, vm) < 0)
goto endjob;
- }
- qemuDomainObjExitMonitorWithDriver(driver, vm);
paused = 1;
if (!virDomainObjIsActive(vm)) {
/* qemu unconditionally starts the domain running again after
* loadvm, so let's pause it to keep consistency
*/
- int state = vm->state;
- priv = vm->privateData;
- vm->state = VIR_DOMAIN_PAUSED;
- qemuDomainObjEnterMonitorWithDriver(driver, vm);
- rc = qemuMonitorStopCPUs(priv->mon);
- qemuDomainObjExitMonitorWithDriver(driver, vm);
- if (rc < 0) {
- vm->state = state;
+ rc = doStopCPUs(driver, vm);
+ if (rc < 0)
goto endjob;
- }
}
event = virDomainEventNewFromObj(vm,