From: "Daniel P. Berrange" <berrange(a)redhat.com>
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 <berrange(a)redhat.com>
---
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 | 24 ++++++++++--------------
5 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c
index 423997b..3f483b7 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, NULLSTR(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 4fee12d..fea9db8 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 8d380a1..4c506a0 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -117,7 +117,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;
@@ -359,15 +362,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 d0d25ce..1a39946 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 2fda44e..00f6b00 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -614,7 +614,6 @@ qemuStartup(bool privileged,
virStateInhibitCallback callback,
void *opaque)
{
- char *base = NULL;
char *driverConf = NULL;
int rc;
virConnectPtr conn = NULL;
@@ -657,7 +656,7 @@ 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;
if (virAsprintf(&qemu_driver->stateDir,
@@ -708,16 +707,15 @@ qemuStartup(bool privileged,
}
VIR_FREE(rundir);
- base = virGetUserConfigDirectory();
- if (!base)
+ if (!(qemu_driver->configBaseDir = virGetUserConfigDirectory()))
goto error;
- if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) ==
-1)
+ if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib",
qemu_driver->configBaseDir) == -1)
goto out_of_memory;
- if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save", base) ==
-1)
+ if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save",
qemu_driver->configBaseDir) == -1)
goto out_of_memory;
- if (virAsprintf(&qemu_driver->snapshotDir, "%s/qemu/snapshot",
base) == -1)
+ if (virAsprintf(&qemu_driver->snapshotDir, "%s/qemu/snapshot",
qemu_driver->configBaseDir) == -1)
goto out_of_memory;
- if (virAsprintf(&qemu_driver->autoDumpPath, "%s/qemu/dump",
base) == -1)
+ if (virAsprintf(&qemu_driver->autoDumpPath, "%s/qemu/dump",
qemu_driver->configBaseDir) == -1)
goto out_of_memory;
}
@@ -755,13 +753,11 @@ qemuStartup(bool privileged,
/* Configuration paths are either ~/.libvirt/qemu/... (session) or
* /etc/libvirt/qemu/... (system).
*/
- if (virAsprintf(&driverConf, "%s/qemu.conf", base) < 0 ||
- virAsprintf(&qemu_driver->configDir, "%s/qemu", base) < 0 ||
- virAsprintf(&qemu_driver->autostartDir, "%s/qemu/autostart",
base) < 0)
+ if (virAsprintf(&driverConf, "%s/qemu.conf",
qemu_driver->configBaseDir) < 0 ||
+ virAsprintf(&qemu_driver->configDir, "%s/qemu",
qemu_driver->configBaseDir) < 0 ||
+ virAsprintf(&qemu_driver->autostartDir, "%s/qemu/autostart",
qemu_driver->configBaseDir) < 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",
@@ -934,7 +930,6 @@ error:
qemuDriverUnlock(qemu_driver);
if (conn)
virConnectClose(conn);
- VIR_FREE(base);
VIR_FREE(driverConf);
VIR_FREE(membase);
VIR_FREE(mempath);
@@ -1074,6 +1069,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);
--
1.7.11.7