]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Fix reboot with guest agent
authorJiri Denemark <jdenemar@redhat.com>
Tue, 4 Sep 2012 10:01:43 +0000 (12:01 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 4 Sep 2012 12:09:54 +0000 (14:09 +0200)
When reboot using qemu guest agent was requested, qemu driver kept
waiting for SHUTDOWN event from qemu. However, such event is never
emitted during guest reboot and qemu driver would keep waiting forever.

src/qemu/qemu_agent.c
src/qemu/qemu_agent.h
src/qemu/qemu_process.c

index 51e60d21e383e0c3926541eee1fae71aaa2a34e9..804c424ca0d4ec2cb0ba5e29125180f2908643e9 100644 (file)
@@ -1294,7 +1294,10 @@ int qemuAgentShutdown(qemuAgentPtr mon,
     if (!cmd)
         return -1;
 
-    mon->await_event = QEMU_AGENT_EVENT_SHUTDOWN;
+    if (mode == QEMU_AGENT_SHUTDOWN_REBOOT)
+        mon->await_event = QEMU_AGENT_EVENT_RESET;
+    else
+        mon->await_event = QEMU_AGENT_EVENT_SHUTDOWN;
     ret = qemuAgentCommand(mon, cmd, &reply,
                            VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK);
 
index 528fee12e413bfffbd88bfa7bcd15752e2657f2f..18740ba6a59f1927367ca1ba177cb49e6c4dcc99 100644 (file)
@@ -55,7 +55,8 @@ void qemuAgentClose(qemuAgentPtr mon);
 typedef enum {
     QEMU_AGENT_EVENT_NONE = 0,
     QEMU_AGENT_EVENT_SHUTDOWN,
-    QEMU_AGENT_EVENT_SUSPEND
+    QEMU_AGENT_EVENT_SUSPEND,
+    QEMU_AGENT_EVENT_RESET,
 } qemuAgentEvent;
 
 void qemuAgentNotifyEvent(qemuAgentPtr mon,
index 5c3b89ebe234ba5638838ab283b97a81e81d629d..93653c6da8c1ecdaf4887d9a138428d8f977a9ed 100644 (file)
@@ -511,9 +511,15 @@ qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
 {
     struct qemud_driver *driver = qemu_driver;
     virDomainEventPtr event;
+    qemuDomainObjPrivatePtr priv;
 
     virDomainObjLock(vm);
+
     event = virDomainEventRebootNewFromObj(vm);
+    priv = vm->privateData;
+    if (priv->agent)
+        qemuAgentNotifyEvent(priv->agent, QEMU_AGENT_EVENT_RESET);
+
     virDomainObjUnlock(vm);
 
     if (event) {