The 'xm' driver currently keeps all its state in a global static variables. Not cool, since we access this from all sorts of places and its hard to guarentee thread safety. So we move the state into the virConnect object. This will increase memory usage if a single process has multiple Xen connections open though. Undecided whether this is a big problem or not. If so, I'll can try and redo the next thread locking patch to use a lock over the existing global state. xen_inotify.c | 4 xen_unified.c | 1 xen_unified.h | 14 ++- xm_internal.c | 262 +++++++++++++++++++++++++++++----------------------------- xm_internal.h | 3 5 files changed, 149 insertions(+), 135 deletions(-) Daniel diff --git a/src/xen_inotify.c b/src/xen_inotify.c --- a/src/xen_inotify.c +++ b/src/xen_inotify.c @@ -383,9 +383,7 @@ xenInotifyOpen(virConnectPtr conn ATTRIB char path[PATH_MAX]; xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData; - if(priv->xendConfigVersion <= 2) { - /* /etc/xen */ - priv->configDir = xenXMGetConfigDir(); + if (priv->configDir) { priv->useXenConfigCache = 1; } else { /* /var/lib/xend/domains/<uuid>/config.sxp */ diff --git a/src/xen_unified.c b/src/xen_unified.c --- a/src/xen_unified.c +++ b/src/xen_unified.c @@ -1465,7 +1465,6 @@ xenRegister (void) { /* Ignore failures here. */ (void) xenHypervisorInit (); - (void) xenXMInit (); return virRegisterDriver (&xenUnifiedDriver); } diff --git a/src/xen_unified.h b/src/xen_unified.h --- a/src/xen_unified.h +++ b/src/xen_unified.h @@ -20,6 +20,7 @@ #include "xen_inotify.h" #endif #include "domain_event.h" +#include "hash.h" #ifndef HAVE_WINSOCK2_H #include <sys/un.h> @@ -163,15 +164,26 @@ struct _xenUnifiedPrivate { /* An list of callbacks */ virDomainEventCallbackListPtr domainEventCallbacks; + /* Location of config files, either /etc + * or /var/lib/xen */ + const char *configDir; + #if WITH_XEN_INOTIFY /* The inotify fd */ int inotifyFD; int inotifyWatch; - const char *configDir; int useXenConfigCache ; xenUnifiedDomainInfoListPtr configInfoList; #endif + + /* For the 'xm' driver */ + /* Primary config file name -> virDomainDef map */ + virHashTablePtr configCache; + /* Domain name to config file name */ + virHashTablePtr nameConfigMap; + /* So we don't refresh too often */ + time_t lastRefresh; }; typedef struct _xenUnifiedPrivate *xenUnifiedPrivatePtr; diff --git a/src/xm_internal.c b/src/xm_internal.c --- a/src/xm_internal.c +++ b/src/xm_internal.c @@ -56,15 +56,6 @@ static int xenXMConfigSetString(virConfPtr conf, const char *setting, const char *str); - -static char configDir[PATH_MAX]; -/* Config file name to config object */ -static virHashTablePtr configCache = NULL; -/* Name to config file name */ -static virHashTablePtr nameConfigMap = NULL; -static int nconnections = 0; -static time_t lastRefresh = 0; - char * xenXMAutoAssignMac(void); static int xenXMDomainAttachDevice(virDomainPtr domain, const char *xml); static int xenXMDomainDetachDevice(virDomainPtr domain, const char *xml); @@ -120,41 +111,10 @@ struct xenUnifiedDriver xenXMDriver = { NULL, /* domainSetSchedulerParameters */ }; -virHashTablePtr xenXMGetConfigCache (void) { - return configCache; -} - -char *xenXMGetConfigDir (void) { - return configDir; -} - #define xenXMError(conn, code, fmt...) \ virReportErrorHelper(conn, VIR_FROM_XENXM, code, __FILE__, \ __FUNCTION__, __LINE__, fmt) -int -xenXMInit (void) -{ - char *envConfigDir; - int safeMode = 0; - - /* Disable use of env variable if running setuid */ - if ((geteuid() != getuid()) || - (getegid() != getgid())) - safeMode = 1; - - if (!safeMode && - (envConfigDir = getenv("LIBVIRT_XM_CONFIG_DIR")) != NULL) { - strncpy(configDir, envConfigDir, PATH_MAX-1); - configDir[PATH_MAX-1] = '\0'; - } else { - strcpy(configDir, XM_CONFIG_DIR); - } - - return 0; -} - - /* Convenience method to grab a int from the config file object */ static int xenXMConfigGetBool(virConnectPtr conn, virConfPtr conf, @@ -328,19 +288,23 @@ static void xenXMConfigFree(void *payloa VIR_FREE(entry); } +struct xenXMConfigReaperData { + xenUnifiedPrivatePtr priv; + time_t now; +}; /* Remove any configs which were not refreshed recently */ static int xenXMConfigReaper(const void *payload, const char *key ATTRIBUTE_UNUSED, const void *data) { - time_t now = *(const time_t *)data; + const struct xenXMConfigReaperData *args = data; xenXMConfCachePtr entry = (xenXMConfCachePtr)payload; /* We're going to purge this config file, so check if it is currently mapped as owner of a named domain. */ - if (entry->refreshedAt != now) { + if (entry->refreshedAt != args->now) { const char *olddomname = entry->def->name; - char *nameowner = (char *)virHashLookup(nameConfigMap, olddomname); + char *nameowner = (char *)virHashLookup(args->priv->nameConfigMap, olddomname); if (nameowner && STREQ(nameowner, key)) { - virHashRemoveEntry(nameConfigMap, olddomname, NULL); + virHashRemoveEntry(args->priv->nameConfigMap, olddomname, NULL); } return (1); } @@ -376,19 +340,20 @@ xenXMConfigSaveFile(virConnectPtr conn, } int -xenXMConfigCacheRemoveFile(virConnectPtr conn ATTRIBUTE_UNUSED, +xenXMConfigCacheRemoveFile(virConnectPtr conn, const char *filename) { + xenUnifiedPrivatePtr priv = conn->privateData; xenXMConfCachePtr entry; - entry = virHashLookup(configCache, filename); + entry = virHashLookup(priv->configCache, filename); if (!entry) { DEBUG("No config entry for %s", filename); return 0; } - virHashRemoveEntry(nameConfigMap, entry->def->name, NULL); - virHashRemoveEntry(configCache, filename, xenXMConfigFree); + virHashRemoveEntry(priv->nameConfigMap, entry->def->name, NULL); + virHashRemoveEntry(priv->configCache, filename, xenXMConfigFree); DEBUG("Removed %s %s", entry->def->name, filename); return 0; } @@ -397,6 +362,7 @@ xenXMConfigCacheRemoveFile(virConnectPtr int xenXMConfigCacheAddFile(virConnectPtr conn, const char *filename) { + xenUnifiedPrivatePtr priv = conn->privateData; xenXMConfCachePtr entry; struct stat st; int newborn = 0; @@ -421,7 +387,7 @@ xenXMConfigCacheAddFile(virConnectPtr co /* If we already have a matching entry and it is not modified, then carry on to next one*/ - if ((entry = virHashLookup(configCache, filename))) { + if ((entry = virHashLookup(priv->configCache, filename))) { char *nameowner; if (entry->refreshedAt >= st.st_mtime) { @@ -432,9 +398,9 @@ xenXMConfigCacheAddFile(virConnectPtr co /* If we currently own the name, then release it and re-acquire it later - just in case it was renamed */ - nameowner = (char *)virHashLookup(nameConfigMap, entry->def->name); + nameowner = (char *)virHashLookup(priv->nameConfigMap, entry->def->name); if (nameowner && STREQ(nameowner, filename)) { - virHashRemoveEntry(nameConfigMap, entry->def->name, NULL); + virHashRemoveEntry(priv->nameConfigMap, entry->def->name, NULL); } /* Clear existing config entry which needs refresh */ @@ -453,7 +419,7 @@ xenXMConfigCacheAddFile(virConnectPtr co if (!(entry->def = xenXMConfigReadFile(conn, entry->filename))) { DEBUG("Failed to read %s", entry->filename); if (!newborn) - virHashRemoveEntry(configCache, filename, NULL); + virHashRemoveEntry(priv->configCache, filename, NULL); VIR_FREE(entry); return -1; } @@ -461,7 +427,7 @@ xenXMConfigCacheAddFile(virConnectPtr co /* If its a completely new entry, it must be stuck into the cache (refresh'd entries are already registered) */ if (newborn) { - if (virHashAddEntry(configCache, entry->filename, entry) < 0) { + if (virHashAddEntry(priv->configCache, entry->filename, entry) < 0) { virDomainDefFree(entry->def); VIR_FREE(entry); xenXMError (conn, VIR_ERR_INTERNAL_ERROR, @@ -473,9 +439,9 @@ xenXMConfigCacheAddFile(virConnectPtr co /* See if we need to map this config file in as the primary owner * of the domain in question */ - if (!virHashLookup(nameConfigMap, entry->def->name)) { - if (virHashAddEntry(nameConfigMap, entry->def->name, entry->filename) < 0) { - virHashRemoveEntry(configCache, filename, NULL); + if (!virHashLookup(priv->nameConfigMap, entry->def->name)) { + if (virHashAddEntry(priv->nameConfigMap, entry->def->name, entry->filename) < 0) { + virHashRemoveEntry(priv->configCache, filename, NULL); virDomainDefFree(entry->def); VIR_FREE(entry); } @@ -491,10 +457,12 @@ xenXMConfigCacheAddFile(virConnectPtr co has rate-limited so never rescans more frequently than once every X seconds */ int xenXMConfigCacheRefresh (virConnectPtr conn) { + xenUnifiedPrivatePtr priv = conn->privateData; DIR *dh; struct dirent *ent; time_t now = time(NULL); int ret = -1; + struct xenXMConfigReaperData args; if (now == ((time_t)-1)) { virReportSystemError(conn, errno, @@ -503,16 +471,16 @@ int xenXMConfigCacheRefresh (virConnectP } /* Rate limit re-scans */ - if ((now - lastRefresh) < XM_REFRESH_INTERVAL) + if ((now - priv->lastRefresh) < XM_REFRESH_INTERVAL) return (0); - lastRefresh = now; + priv->lastRefresh = now; /* Process the files in the config dir */ - if (!(dh = opendir(configDir))) { + if (!(dh = opendir(priv->configDir))) { virReportSystemError(conn, errno, _("cannot read directory %s"), - configDir); + priv->configDir); return (-1); } @@ -547,9 +515,9 @@ int xenXMConfigCacheRefresh (virConnectP continue; /* Build the full file path */ - if ((strlen(configDir) + 1 + strlen(ent->d_name) + 1) > PATH_MAX) + if ((strlen(priv->configDir) + 1 + strlen(ent->d_name) + 1) > PATH_MAX) continue; - strcpy(path, configDir); + strcpy(path, priv->configDir); strcat(path, "/"); strcat(path, ent->d_name); @@ -570,7 +538,9 @@ int xenXMConfigCacheRefresh (virConnectP their refresh timestamp - the timestamp should match 'now' if they were refreshed. If timestamp doesn't match then the config is no longer on disk */ - virHashRemoveSet(configCache, xenXMConfigReaper, xenXMConfigFree, (const void*) &now); + args.now = now; + args.priv = priv; + virHashRemoveSet(priv->configCache, xenXMConfigReaper, xenXMConfigFree, &args); ret = 0; if (dh) @@ -587,26 +557,27 @@ int xenXMConfigCacheRefresh (virConnectP * to open all end up using the same cache of files */ virDrvOpenStatus -xenXMOpen (virConnectPtr conn ATTRIBUTE_UNUSED, +xenXMOpen (virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED) { - if (configCache == NULL) { - configCache = virHashCreate(50); - if (!configCache) - return (-1); - nameConfigMap = virHashCreate(50); - if (!nameConfigMap) { - virHashFree(configCache, NULL); - configCache = NULL; - return (-1); - } - /* Force the cache to be reloaded next time that - * xenXMConfigCacheRefresh is called. - */ - lastRefresh = 0; + xenUnifiedPrivatePtr priv = conn->privateData; + + priv->configDir = XM_CONFIG_DIR; + + priv->configCache = virHashCreate(50); + if (!priv->configCache) + return (-1); + priv->nameConfigMap = virHashCreate(50); + if (!priv->nameConfigMap) { + virHashFree(priv->configCache, NULL); + priv->configCache = NULL; + return (-1); } - nconnections++; + /* Force the cache to be reloaded next time that + * xenXMConfigCacheRefresh is called. + */ + priv->lastRefresh = 0; return (0); } @@ -615,14 +586,12 @@ xenXMOpen (virConnectPtr conn ATTRIBUTE_ * Free the config files in the cache if this is the * last connection */ -int xenXMClose(virConnectPtr conn ATTRIBUTE_UNUSED) { - nconnections--; - if (nconnections <= 0) { - virHashFree(nameConfigMap, NULL); - nameConfigMap = NULL; - virHashFree(configCache, xenXMConfigFree); - configCache = NULL; - } +int xenXMClose(virConnectPtr conn) { + xenUnifiedPrivatePtr priv = conn->privateData; + + virHashFree(priv->nameConfigMap, NULL); + virHashFree(priv->configCache, xenXMConfigFree); + return (0); } @@ -631,6 +600,7 @@ int xenXMClose(virConnectPtr conn ATTRIB * VCPUs and memory. */ int xenXMDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { @@ -642,10 +612,12 @@ int xenXMDomainGetInfo(virDomainPtr doma if (domain->id != -1) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); memset(info, 0, sizeof(virDomainInfo)); @@ -1310,6 +1282,7 @@ no_memory: * domain, suitable for later feeding for virDomainCreateXML */ char *xenXMDomainDumpXML(virDomainPtr domain, int flags) { + xenUnifiedPrivatePtr priv = domain->conn->privateData; const char *filename; xenXMConfCachePtr entry; @@ -1321,10 +1294,12 @@ char *xenXMDomainDumpXML(virDomainPtr do if (domain->id != -1) return (NULL); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (NULL); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (NULL); return virDomainDefFormat(domain->conn, entry->def, flags); @@ -1335,6 +1310,7 @@ char *xenXMDomainDumpXML(virDomainPtr do * Update amount of memory in the config file */ int xenXMDomainSetMemory(virDomainPtr domain, unsigned long memory) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; @@ -1350,10 +1326,12 @@ int xenXMDomainSetMemory(virDomainPtr do if (memory < 1024 * MIN_XEN_GUEST_SIZE) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); entry->def->memory = memory; @@ -1373,6 +1351,7 @@ int xenXMDomainSetMemory(virDomainPtr do * Update maximum memory limit in config */ int xenXMDomainSetMaxMemory(virDomainPtr domain, unsigned long memory) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; @@ -1386,10 +1365,12 @@ int xenXMDomainSetMaxMemory(virDomainPtr if (domain->id != -1) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); entry->def->maxmem = memory; @@ -1409,6 +1390,7 @@ int xenXMDomainSetMaxMemory(virDomainPtr * Get max memory limit from config */ unsigned long xenXMDomainGetMaxMemory(virDomainPtr domain) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; @@ -1420,10 +1402,12 @@ unsigned long xenXMDomainGetMaxMemory(vi if (domain->id != -1) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); return entry->def->maxmem; @@ -1433,6 +1417,7 @@ unsigned long xenXMDomainGetMaxMemory(vi * Set the VCPU count in config */ int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; @@ -1446,10 +1431,12 @@ int xenXMDomainSetVcpus(virDomainPtr dom if (domain->id != -1) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); entry->def->vcpus = vcpus; @@ -1478,6 +1465,7 @@ int xenXMDomainPinVcpu(virDomainPtr doma unsigned int vcpu ATTRIBUTE_UNUSED, unsigned char *cpumap, int maplen) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; virBuffer mapbuf = VIR_BUFFER_INITIALIZER; @@ -1504,11 +1492,13 @@ int xenXMDomainPinVcpu(virDomainPtr doma return -1; } - if (!(filename = virHashLookup(nameConfigMap, domain->name))) { + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) { xenXMError (domain->conn, VIR_ERR_INTERNAL_ERROR, "%s", _("virHashLookup")); return -1; } - if (!(entry = virHashLookup(configCache, filename))) { + if (!(entry = virHashLookup(priv->configCache, filename))) { xenXMError (domain->conn, VIR_ERR_INTERNAL_ERROR, "%s", _("can't retrieve config file for domain")); return -1; @@ -1563,6 +1553,7 @@ int xenXMDomainPinVcpu(virDomainPtr doma * Find an inactive domain based on its name */ virDomainPtr xenXMDomainLookupByName(virConnectPtr conn, const char *domname) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; virDomainPtr ret; @@ -1576,15 +1567,17 @@ virDomainPtr xenXMDomainLookupByName(vir return (NULL); } + priv = conn->privateData; + #ifndef WITH_XEN_INOTIFY if (xenXMConfigCacheRefresh (conn) < 0) return (NULL); #endif - if (!(filename = virHashLookup(nameConfigMap, domname))) + if (!(filename = virHashLookup(priv->nameConfigMap, domname))) return (NULL); - if (!(entry = virHashLookup(configCache, filename))) { + if (!(entry = virHashLookup(priv->configCache, filename))) { return (NULL); } @@ -1618,6 +1611,7 @@ static int xenXMDomainSearchForUUID(cons */ virDomainPtr xenXMDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) { + xenUnifiedPrivatePtr priv; xenXMConfCachePtr entry; virDomainPtr ret; @@ -1630,12 +1624,14 @@ virDomainPtr xenXMDomainLookupByUUID(vir return (NULL); } + priv = conn->privateData; + #ifndef WITH_XEN_INOTIFY if (xenXMConfigCacheRefresh (conn) < 0) return (NULL); #endif - if (!(entry = virHashSearch(configCache, xenXMDomainSearchForUUID, (const void *)uuid))) { + if (!(entry = virHashSearch(priv->configCache, xenXMDomainSearchForUUID, (const void *)uuid))) { return (NULL); } @@ -1666,10 +1662,10 @@ int xenXMDomainCreate(virDomainPtr domai if (domain->id != -1) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); if (!(sexpr = xenDaemonFormatSxpr(domain->conn, entry->def, priv->xendConfigVersion))) { @@ -2294,16 +2290,16 @@ virDomainPtr xenXMDomainDefineXML(virCon VIR_DOMAIN_XML_INACTIVE))) return (NULL); - if (virHashLookup(nameConfigMap, def->name)) { + if (virHashLookup(priv->nameConfigMap, def->name)) { /* domain exists, we will overwrite it */ - if (!(oldfilename = (char *)virHashLookup(nameConfigMap, def->name))) { + if (!(oldfilename = (char *)virHashLookup(priv->nameConfigMap, def->name))) { xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("can't retrieve config filename for domain to overwrite")); goto error; } - if (!(entry = virHashLookup(configCache, oldfilename))) { + if (!(entry = virHashLookup(priv->configCache, oldfilename))) { xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("can't retrieve config entry for domain to overwrite")); goto error; @@ -2314,14 +2310,14 @@ virDomainPtr xenXMDomainDefineXML(virCon goto error; /* Remove the name -> filename mapping */ - if (virHashRemoveEntry(nameConfigMap, def->name, NULL) < 0) { + if (virHashRemoveEntry(priv->nameConfigMap, def->name, NULL) < 0) { xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("failed to remove old domain from config map")); goto error; } /* Remove the config record itself */ - if (virHashRemoveEntry(configCache, oldfilename, xenXMConfigFree) < 0) { + if (virHashRemoveEntry(priv->configCache, oldfilename, xenXMConfigFree) < 0) { xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("failed to remove old domain from config map")); goto error; @@ -2330,13 +2326,13 @@ virDomainPtr xenXMDomainDefineXML(virCon entry = NULL; } - if ((strlen(configDir) + 1 + strlen(def->name) + 1) > PATH_MAX) { + if ((strlen(priv->configDir) + 1 + strlen(def->name) + 1) > PATH_MAX) { xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("config file name is too long")); goto error; } - strcpy(filename, configDir); + strcpy(filename, priv->configDir); strcat(filename, "/"); strcat(filename, def->name); @@ -2357,14 +2353,14 @@ virDomainPtr xenXMDomainDefineXML(virCon memmove(entry->filename, filename, PATH_MAX); entry->def = def; - if (virHashAddEntry(configCache, filename, entry) < 0) { + if (virHashAddEntry(priv->configCache, filename, entry) < 0) { xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("unable to store config file handle")); goto error; } - if (virHashAddEntry(nameConfigMap, def->name, entry->filename) < 0) { - virHashRemoveEntry(configCache, filename, NULL); + if (virHashAddEntry(priv->nameConfigMap, def->name, entry->filename) < 0) { + virHashRemoveEntry(priv->configCache, filename, NULL); xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("unable to store config file handle")); goto error; @@ -2387,6 +2383,7 @@ virDomainPtr xenXMDomainDefineXML(virCon * Delete a domain from disk */ int xenXMDomainUndefine(virDomainPtr domain) { + xenUnifiedPrivatePtr priv; const char *filename; xenXMConfCachePtr entry; if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) { @@ -2400,21 +2397,23 @@ int xenXMDomainUndefine(virDomainPtr dom if (domain->conn->flags & VIR_CONNECT_RO) return (-1); - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + priv = domain->conn->privateData; + + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return (-1); - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return (-1); if (unlink(entry->filename) < 0) return (-1); /* Remove the name -> filename mapping */ - if (virHashRemoveEntry(nameConfigMap, domain->name, NULL) < 0) + if (virHashRemoveEntry(priv->nameConfigMap, domain->name, NULL) < 0) return(-1); /* Remove the config record itself */ - if (virHashRemoveEntry(configCache, entry->filename, xenXMConfigFree) < 0) + if (virHashRemoveEntry(priv->configCache, entry->filename, xenXMConfigFree) < 0) return (-1); return (0); @@ -2449,6 +2448,7 @@ static void xenXMListIterator(const void * are currently running */ int xenXMListDefinedDomains(virConnectPtr conn, char **const names, int maxnames) { + xenUnifiedPrivatePtr priv; struct xenXMListIteratorContext ctx; if (!VIR_IS_CONNECT(conn)) { @@ -2456,20 +2456,22 @@ int xenXMListDefinedDomains(virConnectPt return (-1); } + priv = conn->privateData; + #ifndef WITH_XEN_INOTIFY if (xenXMConfigCacheRefresh (conn) < 0) return (-1); #endif - if (maxnames > virHashSize(configCache)) - maxnames = virHashSize(configCache); + if (maxnames > virHashSize(priv->configCache)) + maxnames = virHashSize(priv->configCache); ctx.conn = conn; ctx.count = 0; ctx.max = maxnames; ctx.names = names; - virHashForEach(nameConfigMap, xenXMListIterator, &ctx); + virHashForEach(priv->nameConfigMap, xenXMListIterator, &ctx); return (ctx.count); } @@ -2478,17 +2480,21 @@ int xenXMListDefinedDomains(virConnectPt * based on number running */ int xenXMNumOfDefinedDomains(virConnectPtr conn) { + xenUnifiedPrivatePtr priv; + if (!VIR_IS_CONNECT(conn)) { xenXMError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); return (-1); } + priv = conn->privateData; + #ifndef WITH_XEN_INOTIFY if (xenXMConfigCacheRefresh (conn) < 0) return (-1); #endif - return virHashSize(nameConfigMap); + return virHashSize(priv->nameConfigMap); } @@ -2524,9 +2530,9 @@ xenXMDomainAttachDevice(virDomainPtr dom if (domain->id != -1) return -1; - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return -1; - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return -1; def = entry->def; @@ -2613,9 +2619,9 @@ xenXMDomainDetachDevice(virDomainPtr dom return -1; if (domain->id != -1) return -1; - if (!(filename = virHashLookup(nameConfigMap, domain->name))) + if (!(filename = virHashLookup(priv->nameConfigMap, domain->name))) return -1; - if (!(entry = virHashLookup(configCache, filename))) + if (!(entry = virHashLookup(priv->configCache, filename))) return -1; def = entry->def; diff --git a/src/xm_internal.h b/src/xm_internal.h --- a/src/xm_internal.h +++ b/src/xm_internal.h @@ -31,10 +31,9 @@ #include "domain_conf.h" extern struct xenUnifiedDriver xenXMDriver; -int xenXMInit (void); virHashTablePtr xenXMGetConfigCache(void); -char *xenXMGetConfigDir(void); + int xenXMConfigCacheRefresh (virConnectPtr conn); int xenXMConfigCacheAddFile(virConnectPtr conn, const char *filename); int xenXMConfigCacheRemoveFile(virConnectPtr conn, const char *filename); -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list