From f199f75e9b0b080cda158ec607c63a7c3dae0f29 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 11 Dec 2012 15:59:21 +0000 Subject: [PATCH] Refactor creation of lock manager plugins Refactor virLockManagerPluginNew() so that the caller does not need to pass in the config file path itself - just the config directory and driver name. Fix QEMU to actually pass in a config file when creating the default lock manager plugin, rather than NULL. Signed-off-by: Daniel P. Berrange --- src/locking/lock_manager.c | 20 +++++++++++++++++--- src/locking/lock_manager.h | 3 ++- src/qemu/qemu_conf.c | 12 +++++------- src/qemu/qemu_conf.h | 3 ++- src/qemu/qemu_driver.c | 13 ++++++------- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c index 423997b5ea..e6d930854e 100644 --- a/src/locking/lock_manager.c +++ b/src/locking/lock_manager.c @@ -128,7 +128,8 @@ static void virLockManagerLogParams(size_t nparams, */ #if HAVE_DLFCN_H virLockManagerPluginPtr virLockManagerPluginNew(const char *name, - const char *configFile, + const char *driverName, + const char *configDir, unsigned int flags) { void *handle = NULL; @@ -136,6 +137,16 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name, virLockManagerPluginPtr plugin = NULL; const char *moddir = getenv("LIBVIRT_LOCK_MANAGER_PLUGIN_DIR"); char *modfile = NULL; + char *configFile = NULL; + + VIR_DEBUG("name=%s driverName=%s configDir=%s flags=%x", + name, driverName, configDir, flags); + + if (virAsprintf(&configFile, "%s/%s-%s.conf", + configDir, driverName, name) < 0) { + virReportOOMError(); + return NULL; + } if (STREQ(name, "nop")) { driver = &virLockDriverNop; @@ -147,7 +158,7 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name, if (virAsprintf(&modfile, "%s/%s.so", moddir, name) < 0) { virReportOOMError(); - return NULL; + goto cleanup; } if (access(modfile, R_OK) < 0) { @@ -188,10 +199,12 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name, goto cleanup; } + VIR_FREE(configFile); VIR_FREE(modfile); return plugin; cleanup: + VIR_FREE(configFile); VIR_FREE(plugin); VIR_FREE(modfile); if (handle) @@ -201,7 +214,8 @@ cleanup: #else /* !HAVE_DLFCN_H */ virLockManagerPluginPtr virLockManagerPluginNew(const char *name ATTRIBUTE_UNUSED, - const char *configFile ATTRIBUTE_UNUSED, + const char *driverName ATTRIBUTE_UNUSED, + const char *configDir ATTRIBUTE_UNUSED, unsigned int flags_unused ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/src/locking/lock_manager.h b/src/locking/lock_manager.h index 4fee12d674..fea9db8d4e 100644 --- a/src/locking/lock_manager.h +++ b/src/locking/lock_manager.h @@ -30,7 +30,8 @@ typedef virLockManagerPlugin *virLockManagerPluginPtr; void virLockManagerSetPluginDir(const char *dir); virLockManagerPluginPtr virLockManagerPluginNew(const char *name, - const char *configFile, + const char *driverName, + const char *configDir, unsigned int flags); void virLockManagerPluginRef(virLockManagerPluginPtr plugin); void virLockManagerPluginUnref(virLockManagerPluginPtr plugin); diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index e95609cc7f..a1b1d04ab3 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -116,7 +116,10 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, } #endif - if (!(driver->lockManager = virLockManagerPluginNew("nop", NULL, 0))) + if (!(driver->lockManager = virLockManagerPluginNew("nop", + "qemu", + driver->configBaseDir, + 0))) goto cleanup; driver->keepAliveInterval = 5; @@ -358,15 +361,10 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, p = virConfGetValue(conf, "lock_manager"); CHECK_TYPE("lock_manager", VIR_CONF_STRING); if (p && p->str) { - char *lockConf; virLockManagerPluginUnref(driver->lockManager); - if (virAsprintf(&lockConf, "%s/libvirt/qemu-%s.conf", SYSCONFDIR, p->str) < 0) - goto no_memory; - if (!(driver->lockManager = - virLockManagerPluginNew(p->str, lockConf, 0))) + virLockManagerPluginNew(p->str, "qemu", driver->configBaseDir, 0))) VIR_ERROR(_("Failed to load lock manager %s"), p->str); - VIR_FREE(lockConf); } GET_VALUE_LONG("max_queued", driver->max_queued); diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index d0d25ceb2f..1a39946d60 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -79,8 +79,9 @@ struct _virQEMUDriver { virDomainObjList domains; - /* These four directories are ones libvirtd uses (so must be root:root + /* These five directories are ones libvirtd uses (so must be root:root * to avoid security risk from QEMU processes */ + char *configBaseDir; char *configDir; char *autostartDir; char *logDir; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1228f6ed81..6f0849cf4e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -649,7 +649,7 @@ qemuStartup(bool privileged, virStateInhibitCallback callback, void *opaque) { - char *base = NULL; + char *base; char *driverConf = NULL; int rc; virConnectPtr conn = NULL; @@ -692,8 +692,9 @@ qemuStartup(bool privileged, "%s/log/libvirt/qemu", LOCALSTATEDIR) == -1) goto out_of_memory; - if ((base = strdup(SYSCONFDIR "/libvirt")) == NULL) + if ((qemu_driver->configBaseDir = strdup(SYSCONFDIR "/libvirt")) == NULL) goto out_of_memory; + base = qemu_driver->configBaseDir; if (virAsprintf(&qemu_driver->stateDir, "%s/run/libvirt/qemu", LOCALSTATEDIR) == -1) @@ -743,9 +744,9 @@ qemuStartup(bool privileged, } VIR_FREE(rundir); - base = virGetUserConfigDirectory(); - if (!base) + if (!(qemu_driver->configBaseDir = virGetUserConfigDirectory())) goto error; + base = qemu_driver->configBaseDir; if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) == -1) goto out_of_memory; if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save", base) == -1) @@ -795,8 +796,6 @@ qemuStartup(bool privileged, virAsprintf(&qemu_driver->autostartDir, "%s/qemu/autostart", base) < 0) goto out_of_memory; - VIR_FREE(base); - rc = virCgroupForDriver("qemu", &qemu_driver->cgroup, privileged, 1); if (rc < 0) { VIR_INFO("Unable to create cgroup for driver: %s", @@ -969,7 +968,6 @@ error: qemuDriverUnlock(qemu_driver); if (conn) virConnectClose(conn); - VIR_FREE(base); VIR_FREE(driverConf); VIR_FREE(membase); VIR_FREE(mempath); @@ -1109,6 +1107,7 @@ qemuShutdown(void) { qemuDriverCloseCallbackShutdown(qemu_driver); + VIR_FREE(qemu_driver->configBaseDir); VIR_FREE(qemu_driver->configDir); VIR_FREE(qemu_driver->autostartDir); VIR_FREE(qemu_driver->logDir); -- GitLab