]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
* src/xen_internal.c: applied patch from Peter Vetere so that
authorDaniel Veillard <veillard@redhat.com>
Wed, 11 Oct 2006 16:11:59 +0000 (16:11 +0000)
committerDaniel Veillard <veillard@redhat.com>
Wed, 11 Oct 2006 16:11:59 +0000 (16:11 +0000)
  crashed domains ain't reported as shut off.
Daniel

ChangeLog
src/xen_internal.c

index 971944392d3d2e789ed2454436d7b6b998bde8fe..3098e7749bce45b967d05c4adba5aecdfa66c46c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Oct 11 17:16:44 CEST 2006 Daniel Veillard <veillard@redhat.com>
+
+       * src/xen_internal.c: applied patch from Peter Vetere so that
+         crashed domains ain't reported as shut off.
+
 Wed Oct 11 16:23:58 CEST 2006 Daniel Veillard <veillard@redhat.com>
 
        * virsh.1: fixed some typo and unclear language pointed out by 
index 44f18eafca290ae389c710382c7a55c5c65730dc..c4798d396ecc2214314c5d19992bd813bf1ccaee 100644 (file)
@@ -27,6 +27,9 @@
 #include <xen/xen.h>
 #include <xen/linux/privcmd.h>
 
+/* required for shutdown flags */
+#include <xen/sched.h>
+
 /* #define DEBUG */
 /*
  * so far there is 2 versions of the structures usable for doing
@@ -81,6 +84,17 @@ static int dom_interface_version = -1;
 #define DOMFLAGS_SHUTDOWNSHIFT 16
 #endif
 
+/*
+ * These flags explain why a system is in the state of "shutdown".  Normally,
+ * They are defined in xen/sched.h
+ */
+#ifndef SHUTDOWN_poweroff
+#define SHUTDOWN_poweroff   0  /* Domain exited normally. Clean up and kill. */
+#define SHUTDOWN_reboot     1  /* Clean up, kill, and then restart.          */
+#define SHUTDOWN_suspend    2  /* Clean up, save suspend info, kill.         */
+#define SHUTDOWN_crash      3  /* Tell controller we've crashed.             */
+#endif
+
 #define XEN_V0_OP_GETDOMAININFOLIST    38
 #define XEN_V1_OP_GETDOMAININFOLIST    38
 #define XEN_V2_OP_GETDOMAININFOLIST    6
@@ -1500,6 +1514,7 @@ xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info)
     xen_getdomaininfo dominfo;
     int ret;
     static int kb_per_pages = 0;
+    uint32_t domain_flags, domain_state, domain_shutdown_cause;
 
     if (kb_per_pages == 0) {
         kb_per_pages = sysconf(_SC_PAGESIZE) / 1024;
@@ -1518,12 +1533,22 @@ xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info)
     if ((ret < 0) || (XEN_GETDOMAININFO_DOMAIN(dominfo) != id))
         return (-1);
 
-    switch (XEN_GETDOMAININFO_FLAGS(dominfo) & 0xFF) {
+    domain_flags = XEN_GETDOMAININFO_FLAGS(dominfo);
+    domain_state = domain_flags & 0xFF;
+    switch (domain_state) {
        case DOMFLAGS_DYING:
            info->state = VIR_DOMAIN_SHUTDOWN;
            break;
        case DOMFLAGS_SHUTDOWN:
-           info->state = VIR_DOMAIN_SHUTOFF;
+            /* The domain is shutdown.  Determine the cause. */
+            domain_shutdown_cause = domain_flags >> DOMFLAGS_SHUTDOWNSHIFT;
+            switch (domain_shutdown_cause) {
+                case SHUTDOWN_crash:
+                    info->state = VIR_DOMAIN_CRASHED;
+                    break;
+                default:
+                    info->state = VIR_DOMAIN_SHUTOFF;
+            }
            break;
        case DOMFLAGS_PAUSED:
            info->state = VIR_DOMAIN_PAUSED;