]> git.ipfire.org Git - thirdparty/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)
committerCole Robinson <crobinso@redhat.com>
Sat, 15 Nov 2014 21:02:08 +0000 (16:02 -0500)
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>
(cherry picked from commit 6ea54769ba1816b382698c4311588d7d1a9cd095)

src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index 368c1996c1de228e1e77940e069414ff1bc0401a..bb445fe70d6c155ebf9c6f91e2bb4039fa0bd6ea 100644 (file)
@@ -4034,11 +4034,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) {
@@ -4096,6 +4091,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 e527fb80ffe0f981c311bee968733b28cf123a5e..3f08ae5ac0fca70076d7c5337476f2cf3d09e212 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;
 }
 
@@ -4800,6 +4809,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
 
     virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
     priv->nbdPort = 0;
+    priv->quiesced = false;
 
     if (priv->agent) {
         qemuAgentClose(priv->agent);