提交 f199f75e 编写于 作者: D Daniel P. Berrange

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: NDaniel P. Berrange <berrange@redhat.com>
上级 41ac222e
......@@ -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",
......
......@@ -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);
......
......@@ -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);
......
......@@ -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;
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册