From 18035eddd366a0756558af5799f23f0f509df51e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Wed, 15 Nov 2006 21:03:34 +0000 Subject: [PATCH] Don't process inactive domains in regular Xen driver backends --- ChangeLog | 14 +++++++++++--- src/proxy_internal.c | 26 ++++++++++++++++---------- src/xen_internal.c | 24 ++++++++++++++---------- src/xend_internal.c | 35 +++++++++++++++++++++++++++++++++-- src/xend_internal.h | 1 + src/xs_internal.c | 10 ++++++++++ 6 files changed, 85 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5a45484e74..b03ea386d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,16 +1,24 @@ -Wed Nov 15 15:59:13 EST 2006 Daniel Berrange +Wed Nov 15 15:08:13 EST 2006 Daniel Berrange + + * src/xen_internal.c, src/xs_internal.c, src/xend_internal.c, + src/proxy.c: Don't try to invoke APIs if domain is is < 0, letting + these inactive domains be handled by other driver backend. + * src/xend_internal.h: make xend_config_version() api available + to other drivers + +Wed Nov 15 14:59:13 EST 2006 Daniel Berrange * src/hash.c, src/hash.h: Added three new methods for iterating over hashtable entries, virHashForEach, virHashRemoveSet & virHashSearch. -Wed Nov 15 15:52:01 EST 2006 Daniel Berrange +Wed Nov 15 14:52:01 EST 2006 Daniel Berrange * src/conf.c, src/conf.h: Add two new APIs virConfNew() and virConfSetValue() for creating & populating new config objects in memory instead of from a file -Wed Nov 15 15:42:01 EST 2006 Daniel Berrange +Wed Nov 15 14:42:01 EST 2006 Daniel Berrange * python/libvir.c, python/libvirt_wrap.h, python/types.h: Ensure that unsigned longs are marshalled to python Long type instead diff --git a/src/proxy_internal.c b/src/proxy_internal.c index 0a9d418bf7..b945e00234 100644 --- a/src/proxy_internal.c +++ b/src/proxy_internal.c @@ -663,7 +663,7 @@ xenProxyDomainGetDomMaxMemory(virConnectPtr conn, int id) if (!VIR_IS_CONNECT(conn)) { virProxyError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); - return (-1); + return (0); } memset(&req, 0, sizeof(req)); req.command = VIR_PROXY_MAX_MEMORY; @@ -672,7 +672,7 @@ xenProxyDomainGetDomMaxMemory(virConnectPtr conn, int id) ret = xenProxyCommand(conn, &req, NULL, 0); if (ret < 0) { xenProxyClose(conn); - return(-1); + return(0); } return(req.data.larg); } @@ -695,6 +695,8 @@ xenProxyDomainGetMaxMemory(virDomainPtr domain) virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); return (0); } + if (domain->handle < 0) + return (0); return(xenProxyDomainGetDomMaxMemory(domain->conn, domain->handle)); } @@ -716,15 +718,17 @@ xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) int ret; if (!VIR_IS_CONNECTED_DOMAIN(domain)) { - if (domain == NULL) - virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); - else - virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); - return (0); + if (domain == NULL) + virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + else + virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + return (-1); } + if (domain->handle < 0) + return (-1); if (info == NULL) { virProxyError(domain->conn, VIR_ERR_INVALID_ARG, __FUNCTION__); - return (-1); + return (-1); } memset(&req, 0, sizeof(req)); req.command = VIR_PROXY_DOMAIN_INFO; @@ -733,11 +737,11 @@ xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) ret = xenProxyCommand(domain->conn, &req, &ans, 0); if (ret < 0) { xenProxyClose(domain->conn); - return(-1); + return(-1); } if (ans.len != sizeof(virProxyPacket) + sizeof(virDomainInfo)) { virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__); - return (-1); + return (-1); } memmove(info, &ans.extra.dinfo, sizeof(virDomainInfo)); @@ -960,6 +964,8 @@ xenProxyDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED) virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); return (NULL); } + if (domain->handle < 0) + return (NULL); memset(&req, 0, sizeof(req)); req.command = VIR_PROXY_DOMAIN_XML; req.data.arg = domain->handle; diff --git a/src/xen_internal.c b/src/xen_internal.c index eee0133bf7..908f695d43 100644 --- a/src/xen_internal.c +++ b/src/xen_internal.c @@ -1498,7 +1498,7 @@ static unsigned long xenHypervisorGetMaxMemory(virDomainPtr domain) { if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0)) + (domain->conn->handle < 0) || (domain->handle < 0)) return (0); return(xenHypervisorGetDomMaxMemory(domain->conn, domain->handle)); @@ -1597,6 +1597,7 @@ xenHypervisorGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info) (domain->conn->handle < 0) || (info == NULL) || (domain->handle < 0)) return (-1); + return(xenHypervisorGetDomInfo(domain->conn, domain->handle, info)); } @@ -1616,7 +1617,7 @@ xenHypervisorPauseDomain(virDomainPtr domain) int ret; if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0)) + (domain->conn->handle < 0) || (domain->handle < 0)) return (-1); ret = virXen_pausedomain(domain->conn->handle, domain->handle); @@ -1639,7 +1640,7 @@ xenHypervisorResumeDomain(virDomainPtr domain) int ret; if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0)) + (domain->conn->handle < 0) || (domain->handle < 0)) return (-1); ret = virXen_unpausedomain(domain->conn->handle, domain->handle); @@ -1662,7 +1663,7 @@ xenHypervisorDestroyDomain(virDomainPtr domain) int ret; if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0)) + (domain->conn->handle < 0) || (domain->handle < 0)) return (-1); ret = virXen_destroydomain(domain->conn->handle, domain->handle); @@ -1686,7 +1687,7 @@ xenHypervisorSetMaxMemory(virDomainPtr domain, unsigned long memory) int ret; if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0)) + (domain->conn->handle < 0) || (domain->handle < 0)) return (-1); ret = virXen_setmaxmem(domain->conn->handle, domain->handle, memory); @@ -1713,7 +1714,8 @@ xenHypervisorSetVcpus(virDomainPtr domain, unsigned int nvcpus) int ret; if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0) || (nvcpus < 1)) + (domain->conn->handle < 0) || (domain->handle < 0) || + (nvcpus < 1)) return (-1); ret = virXen_setmaxvcpus(domain->conn->handle, domain->handle, nvcpus); @@ -1741,7 +1743,8 @@ xenHypervisorPinVcpu(virDomainPtr domain, unsigned int vcpu, int ret; if ((domain == NULL) || (domain->conn == NULL) || - (domain->conn->handle < 0) || (cpumap == NULL) || (maplen < 1)) + (domain->conn->handle < 0) || (domain->handle < 0) || + (cpumap == NULL) || (maplen < 1)) return (-1); ret = virXen_setvcpumap(domain->conn->handle, domain->handle, vcpu, @@ -1782,9 +1785,10 @@ xenHypervisorGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo, virVcpuInfoPtr ipt; int nbinfo, i; - if ((domain == NULL) || (domain->conn == NULL) || (domain->conn->handle < 0) - || (info == NULL) || (maxinfo < 1) - || (sizeof(cpumap_t) & 7)) + if ((domain == NULL) || (domain->conn == NULL) || + (domain->conn->handle < 0) || (domain->handle < 0) || + (info == NULL) || (maxinfo < 1) || + (sizeof(cpumap_t) & 7)) return (-1); if ((cpumaps != NULL) && (maplen < 1)) return -1; diff --git a/src/xend_internal.c b/src/xend_internal.c index 95444c555a..d58ac0dd4a 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -1266,7 +1266,7 @@ xend_get_node(virConnectPtr xend) return node; } -static int +int xend_get_config_version(virConnectPtr conn) { struct sexpr *root; const char *value; @@ -2075,6 +2075,8 @@ xenDaemonDomainSuspend(virDomainPtr domain) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); return xend_op(domain->conn, domain->name, "op", "pause", NULL); } @@ -2095,6 +2097,8 @@ xenDaemonDomainResume(virDomainPtr domain) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); return xend_op(domain->conn, domain->name, "op", "unpause", NULL); } @@ -2116,6 +2120,8 @@ xenDaemonDomainShutdown(virDomainPtr domain) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); return xend_op(domain->conn, domain->name, "op", "shutdown", "reason", "halt", NULL); } @@ -2138,6 +2144,8 @@ xenDaemonDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); return xend_op(domain->conn, domain->name, "op", "shutdown", "reason", "reboot", NULL); } @@ -2162,6 +2170,8 @@ xenDaemonDomainDestroy(virDomainPtr domain) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); return xend_op(domain->conn, domain->name, "op", "destroy", NULL); } @@ -2187,6 +2197,8 @@ xenDaemonDomainSave(virDomainPtr domain, const char *filename) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); return xend_op(domain->conn, domain->name, "op", "save", "file", filename, NULL); } @@ -2232,6 +2244,8 @@ xenDaemonDomainGetMaxMemory(virDomainPtr domain) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); /* can we ask for a subset ? worth it ? */ root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name); @@ -2266,6 +2280,9 @@ xenDaemonDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); + snprintf(buf, sizeof(buf), "%lu", memory >> 10); return xend_op(domain->conn, domain->name, "op", "maxmem_set", "memory", buf, NULL); @@ -2297,6 +2314,9 @@ xenDaemonDomainSetMemory(virDomainPtr domain, unsigned long memory) __FUNCTION__); return(-1); } + if (domain->handle < 0) + return(-1); + snprintf(buf, sizeof(buf), "%lu", memory >> 10); return xend_op(domain->conn, domain->name, "op", "mem_target_set", "target", buf, NULL); @@ -2345,6 +2365,8 @@ xenDaemonDomainDumpXML(virDomainPtr domain, int flags ATTRIBUTE_UNUSED) __FUNCTION__); return(NULL); } + if (domain->handle < 0) + return(NULL); return xenDaemonDomainDumpXMLByID(domain->conn, domain->handle); } @@ -2372,7 +2394,8 @@ xenDaemonDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) __FUNCTION__); return(-1); } - + if (domain->handle < 0) + return(-1); root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1", domain->name); if (root == NULL) @@ -2652,6 +2675,9 @@ xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) __FUNCTION__); return (-1); } + if (domain->handle < 0) + return(-1); + snprintf(buf, sizeof(buf), "%d", vcpus); return(xend_op(domain->conn, domain->name, "op", "set_vcpus", "vcpus", buf, NULL)); @@ -2681,6 +2707,8 @@ xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu, __FUNCTION__); return (-1); } + if (domain->handle < 0) + return(-1); /* from bit map, build character string of mapped CPU numbers */ for (i = 0; i < maplen; i++) for (j = 0; j < 8; j++) @@ -2734,6 +2762,9 @@ xenDaemonDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo, __FUNCTION__); return (-1); } + if (domain->handle < 0) + return(-1); + root = sexpr_get(domain->conn, "/xend/domain/%s?op=vcpuinfo", domain->name); if (root == NULL) return (-1); diff --git a/src/xend_internal.h b/src/xend_internal.h index 11c54136da..8f2197754f 100644 --- a/src/xend_internal.h +++ b/src/xend_internal.h @@ -613,6 +613,7 @@ char *xenDaemonDomainDumpXMLByID(virConnectPtr xend, */ int xend_log(virConnectPtr xend, char *buffer, size_t n_buffer); + int xend_get_config_version(virConnectPtr conn); char *xend_parse_domain_sexp(virConnectPtr conn, char *root, int xendConfigVersion); /* refactored ones */ diff --git a/src/xs_internal.c b/src/xs_internal.c index db2b9dfe4e..8630426e3b 100644 --- a/src/xs_internal.c +++ b/src/xs_internal.c @@ -372,6 +372,8 @@ xenStoreGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info) } if (domain->conn->xshandle == NULL) return(-1); + if (domain->handle == -1) + return(-1); tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "running"); if (tmp != NULL) { @@ -430,6 +432,8 @@ xenStoreDomainSetMemory(virDomainPtr domain, unsigned long memory) __FUNCTION__); return(-1); } + if (domain->handle == -1) + return(-1); snprintf(value, 19, "%lu", memory); value[19] = 0; ret = virDomainDoStoreWrite(domain, "memory/target", &value[0]); @@ -454,6 +458,8 @@ xenStoreDomainGetMaxMemory(virDomainPtr domain) if (!VIR_IS_CONNECTED_DOMAIN(domain)) return (ret); + if (domain->handle == -1) + return(-1); tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "memory/target"); if (tmp != NULL) { @@ -626,6 +632,8 @@ xenStoreDomainShutdown(virDomainPtr domain) __FUNCTION__); return(-1); } + if (domain->handle == -1) + return(-1); /* * this is very hackish, the domU kernel probes for a special * node in the xenstore and launch the shutdown command if found. @@ -652,6 +660,8 @@ xenStoreDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED) __FUNCTION__); return(-1); } + if (domain->handle == -1) + return(-1); /* * this is very hackish, the domU kernel probes for a special * node in the xenstore and launch the shutdown command if found.