]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix logic in xenUnifiedNumOfDomains to match xenUnifiedListDomains
authorJonas Eriksson <jonas.j.eriksson@ericsson.com>
Fri, 9 Oct 2009 09:23:23 +0000 (10:23 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 12 Nov 2009 11:53:54 +0000 (11:53 +0000)
The xenUnifiedNumOfDomains and xenUnifiedListDomains methods work
together as a pair, so it is critical they both apply the same
logic. With the current mis-matched logic it is possible to sometimes
get into a state when you miss certain active guests.

* src/xen/xen_driver.c: Change xenUnifiedNumOfDomains ordering to
  match xenUnifiedListDomains.

src/xen/proxy_internal.c
src/xen/proxy_internal.h
src/xen/xen_driver.c
src/xen/xend_internal.c
src/xen/xend_internal.h

index f9d2fade1f3c031e9f5e50fef5761597845dc36a..22ff172153d1a8131a91adcf014e8d21fb34eea4 100644 (file)
@@ -40,7 +40,6 @@ static virDrvOpenStatus xenProxyOpen(virConnectPtr conn, virConnectAuthPtr auth,
 static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer);
 static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
 static char *xenProxyGetCapabilities(virConnectPtr conn);
-static int xenProxyNumOfDomains(virConnectPtr conn);
 static unsigned long xenProxyDomainGetMaxMemory(virDomainPtr domain);
 static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
 static char *xenProxyDomainGetOSType(virDomainPtr domain);
@@ -607,7 +606,7 @@ xenProxyListDomains(virConnectPtr conn, int *ids, int maxids)
  *
  * Returns the number of domain found or -1 in case of error
  */
-static int
+int
 xenProxyNumOfDomains(virConnectPtr conn)
 {
     virProxyPacket req;
index 185fa674c9723702be6e70645759e086fc28c8db..19df751ff656ca9db310cf5f644b4e53387557d8 100644 (file)
@@ -96,4 +96,5 @@ extern char *       xenProxyDomainDumpXML(virDomainPtr domain,
                                           int flags);
 extern int          xenProxyListDomains(virConnectPtr conn, int *ids,
                                         int maxids);
+extern int xenProxyNumOfDomains(virConnectPtr conn);
 #endif /* __LIBVIR_PROXY_H__ */
index c131ae2aff85dcbf94cc58db2c8d4f7353ecbe66..d8c70879ac9ef6e791674c22086be2abd82d8e5c 100644 (file)
@@ -589,13 +589,31 @@ static int
 xenUnifiedNumOfDomains (virConnectPtr conn)
 {
     GET_PRIVATE(conn);
-    int i, ret;
+    int ret;
 
-    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
-        if (priv->opened[i] && drivers[i]->numOfDomains) {
-            ret = drivers[i]->numOfDomains (conn);
-            if (ret >= 0) return ret;
-        }
+    /* Try xenstore. */
+    if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
+        ret = xenStoreNumOfDomains (conn);
+        if (ret >= 0) return ret;
+    }
+
+    /* Try HV. */
+    if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
+        ret = xenHypervisorNumOfDomains (conn);
+        if (ret >= 0) return ret;
+    }
+
+    /* Try xend. */
+    if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
+        ret = xenDaemonNumOfDomains (conn);
+        if (ret >= 0) return ret;
+    }
+
+    /* Try proxy. */
+    if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
+        ret = xenProxyNumOfDomains (conn);
+        if (ret >= 0) return ret;
+    }
 
     return -1;
 }
index dad07841a6148eb56a36018055201054716bad62..6b9a1258ccda181f8e10f68e4fd866f0f721255b 100644 (file)
@@ -3696,7 +3696,7 @@ error:
  *
  * Returns the number of domain found or -1 in case of error
  */
-static int
+int
 xenDaemonNumOfDomains(virConnectPtr conn)
 {
     struct sexpr *root = NULL;
index 9d2571bd163f82faa128c55662c6ce39135a7ee1..8b00737d84e21863588e78f0db23e0d2a920b1a5 100644 (file)
@@ -187,5 +187,6 @@ int xenDaemonDomainMigratePerform (virDomainPtr domain, const char *cookie, int
 
 int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
 int xenDaemonListDomains(virConnectPtr conn, int *ids, int maxids);
+int xenDaemonNumOfDomains(virConnectPtr conn);
 
 #endif /* __XEND_INTERNAL_H_ */