]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Update fsfreeze status on domain state transitions
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 3 Nov 2014 11:57:44 +0000 (12:57 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 6 Nov 2014 14:20:01 +0000 (15:20 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1160084

As of b6d4dad1 (1.2.5) libvirt keeps track if domain disks have been
frozen. However, this falls into that set of information which don't
survive domain restart. Therefore, we need to clear the flag upon some
state transitions. Moreover, once we clear the flag we must update the
status file too.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index b70961f779f0ccdec1cfd5b783dd7fbec50e5836..6e47c8af127c9ea71acdcb289d973f1fd9f33988 100644 (file)
@@ -4040,11 +4040,6 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
         VIR_WARN("Unable to release lease on %s", vm->def->name);
     VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
 
-    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) {
-        VIR_WARN("Unable to save status on vm %s after state change",
-                 vm->def->name);
-     }
-
     switch (action) {
     case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY:
         if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0) {
@@ -4102,6 +4097,11 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
     }
 
  cleanup:
+    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) {
+        VIR_WARN("Unable to save status on vm %s after state change",
+                 vm->def->name);
+     }
+
     virObjectUnref(cfg);
 }
 
index 002bd3239de63fdcdaa5cb7c912f7de8bb6e7561..24e5f0fded5b99a6a02915b5258ae5b0a53c7a54 100644 (file)
@@ -529,6 +529,7 @@ qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
     virQEMUDriverPtr driver = opaque;
     virObjectEventPtr event;
     qemuDomainObjPrivatePtr priv;
+    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
 
     virObjectLock(vm);
 
@@ -536,12 +537,20 @@ qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
     priv = vm->privateData;
     if (priv->agent)
         qemuAgentNotifyEvent(priv->agent, QEMU_AGENT_EVENT_RESET);
+    /* Clear some domain runtime information. For instance,
+     * fsfreeze won't survive domain reset. This, however,
+     * required the domain status file to be rewritten onto disk. */
+    priv->quiesced = false;
+
+    if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
+        VIR_WARN("Failed to save status on vm %s", vm->def->name);
 
     virObjectUnlock(vm);
 
     if (event)
         qemuDomainEventQueue(driver, event);
 
+    virObjectUnref(cfg);
     return 0;
 }
 
@@ -4849,6 +4858,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
 
     virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
     priv->nbdPort = 0;
+    priv->quiesced = false;
 
     if (priv->agent) {
         qemuAgentClose(priv->agent);