mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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 <berrange@redhat.com>
This commit is contained in:
parent
41ac222e52
commit
f199f75e9b
@ -128,7 +128,8 @@ static void virLockManagerLogParams(size_t nparams,
|
|||||||
*/
|
*/
|
||||||
#if HAVE_DLFCN_H
|
#if HAVE_DLFCN_H
|
||||||
virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
||||||
const char *configFile,
|
const char *driverName,
|
||||||
|
const char *configDir,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
void *handle = NULL;
|
void *handle = NULL;
|
||||||
@ -136,6 +137,16 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
|||||||
virLockManagerPluginPtr plugin = NULL;
|
virLockManagerPluginPtr plugin = NULL;
|
||||||
const char *moddir = getenv("LIBVIRT_LOCK_MANAGER_PLUGIN_DIR");
|
const char *moddir = getenv("LIBVIRT_LOCK_MANAGER_PLUGIN_DIR");
|
||||||
char *modfile = NULL;
|
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")) {
|
if (STREQ(name, "nop")) {
|
||||||
driver = &virLockDriverNop;
|
driver = &virLockDriverNop;
|
||||||
@ -147,7 +158,7 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
|||||||
|
|
||||||
if (virAsprintf(&modfile, "%s/%s.so", moddir, name) < 0) {
|
if (virAsprintf(&modfile, "%s/%s.so", moddir, name) < 0) {
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
return NULL;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (access(modfile, R_OK) < 0) {
|
if (access(modfile, R_OK) < 0) {
|
||||||
@ -188,10 +199,12 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VIR_FREE(configFile);
|
||||||
VIR_FREE(modfile);
|
VIR_FREE(modfile);
|
||||||
return plugin;
|
return plugin;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
VIR_FREE(configFile);
|
||||||
VIR_FREE(plugin);
|
VIR_FREE(plugin);
|
||||||
VIR_FREE(modfile);
|
VIR_FREE(modfile);
|
||||||
if (handle)
|
if (handle)
|
||||||
@ -201,7 +214,8 @@ cleanup:
|
|||||||
#else /* !HAVE_DLFCN_H */
|
#else /* !HAVE_DLFCN_H */
|
||||||
virLockManagerPluginPtr
|
virLockManagerPluginPtr
|
||||||
virLockManagerPluginNew(const char *name ATTRIBUTE_UNUSED,
|
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)
|
unsigned int flags_unused ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
@ -30,7 +30,8 @@ typedef virLockManagerPlugin *virLockManagerPluginPtr;
|
|||||||
|
|
||||||
void virLockManagerSetPluginDir(const char *dir);
|
void virLockManagerSetPluginDir(const char *dir);
|
||||||
virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
|
||||||
const char *configFile,
|
const char *driverName,
|
||||||
|
const char *configDir,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
void virLockManagerPluginRef(virLockManagerPluginPtr plugin);
|
void virLockManagerPluginRef(virLockManagerPluginPtr plugin);
|
||||||
void virLockManagerPluginUnref(virLockManagerPluginPtr plugin);
|
void virLockManagerPluginUnref(virLockManagerPluginPtr plugin);
|
||||||
|
@ -116,7 +116,10 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!(driver->lockManager = virLockManagerPluginNew("nop", NULL, 0)))
|
if (!(driver->lockManager = virLockManagerPluginNew("nop",
|
||||||
|
"qemu",
|
||||||
|
driver->configBaseDir,
|
||||||
|
0)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
driver->keepAliveInterval = 5;
|
driver->keepAliveInterval = 5;
|
||||||
@ -358,15 +361,10 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
|
|||||||
p = virConfGetValue(conf, "lock_manager");
|
p = virConfGetValue(conf, "lock_manager");
|
||||||
CHECK_TYPE("lock_manager", VIR_CONF_STRING);
|
CHECK_TYPE("lock_manager", VIR_CONF_STRING);
|
||||||
if (p && p->str) {
|
if (p && p->str) {
|
||||||
char *lockConf;
|
|
||||||
virLockManagerPluginUnref(driver->lockManager);
|
virLockManagerPluginUnref(driver->lockManager);
|
||||||
if (virAsprintf(&lockConf, "%s/libvirt/qemu-%s.conf", SYSCONFDIR, p->str) < 0)
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
if (!(driver->lockManager =
|
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_ERROR(_("Failed to load lock manager %s"), p->str);
|
||||||
VIR_FREE(lockConf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_VALUE_LONG("max_queued", driver->max_queued);
|
GET_VALUE_LONG("max_queued", driver->max_queued);
|
||||||
|
@ -79,8 +79,9 @@ struct _virQEMUDriver {
|
|||||||
|
|
||||||
virDomainObjList domains;
|
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 */
|
* to avoid security risk from QEMU processes */
|
||||||
|
char *configBaseDir;
|
||||||
char *configDir;
|
char *configDir;
|
||||||
char *autostartDir;
|
char *autostartDir;
|
||||||
char *logDir;
|
char *logDir;
|
||||||
|
@ -649,7 +649,7 @@ qemuStartup(bool privileged,
|
|||||||
virStateInhibitCallback callback,
|
virStateInhibitCallback callback,
|
||||||
void *opaque)
|
void *opaque)
|
||||||
{
|
{
|
||||||
char *base = NULL;
|
char *base;
|
||||||
char *driverConf = NULL;
|
char *driverConf = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
virConnectPtr conn = NULL;
|
virConnectPtr conn = NULL;
|
||||||
@ -692,8 +692,9 @@ qemuStartup(bool privileged,
|
|||||||
"%s/log/libvirt/qemu", LOCALSTATEDIR) == -1)
|
"%s/log/libvirt/qemu", LOCALSTATEDIR) == -1)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
|
||||||
if ((base = strdup(SYSCONFDIR "/libvirt")) == NULL)
|
if ((qemu_driver->configBaseDir = strdup(SYSCONFDIR "/libvirt")) == NULL)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
base = qemu_driver->configBaseDir;
|
||||||
|
|
||||||
if (virAsprintf(&qemu_driver->stateDir,
|
if (virAsprintf(&qemu_driver->stateDir,
|
||||||
"%s/run/libvirt/qemu", LOCALSTATEDIR) == -1)
|
"%s/run/libvirt/qemu", LOCALSTATEDIR) == -1)
|
||||||
@ -743,9 +744,9 @@ qemuStartup(bool privileged,
|
|||||||
}
|
}
|
||||||
VIR_FREE(rundir);
|
VIR_FREE(rundir);
|
||||||
|
|
||||||
base = virGetUserConfigDirectory();
|
if (!(qemu_driver->configBaseDir = virGetUserConfigDirectory()))
|
||||||
if (!base)
|
|
||||||
goto error;
|
goto error;
|
||||||
|
base = qemu_driver->configBaseDir;
|
||||||
if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) == -1)
|
if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) == -1)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save", base) == -1)
|
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)
|
virAsprintf(&qemu_driver->autostartDir, "%s/qemu/autostart", base) < 0)
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
|
||||||
VIR_FREE(base);
|
|
||||||
|
|
||||||
rc = virCgroupForDriver("qemu", &qemu_driver->cgroup, privileged, 1);
|
rc = virCgroupForDriver("qemu", &qemu_driver->cgroup, privileged, 1);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
VIR_INFO("Unable to create cgroup for driver: %s",
|
VIR_INFO("Unable to create cgroup for driver: %s",
|
||||||
@ -969,7 +968,6 @@ error:
|
|||||||
qemuDriverUnlock(qemu_driver);
|
qemuDriverUnlock(qemu_driver);
|
||||||
if (conn)
|
if (conn)
|
||||||
virConnectClose(conn);
|
virConnectClose(conn);
|
||||||
VIR_FREE(base);
|
|
||||||
VIR_FREE(driverConf);
|
VIR_FREE(driverConf);
|
||||||
VIR_FREE(membase);
|
VIR_FREE(membase);
|
||||||
VIR_FREE(mempath);
|
VIR_FREE(mempath);
|
||||||
@ -1109,6 +1107,7 @@ qemuShutdown(void) {
|
|||||||
|
|
||||||
qemuDriverCloseCallbackShutdown(qemu_driver);
|
qemuDriverCloseCallbackShutdown(qemu_driver);
|
||||||
|
|
||||||
|
VIR_FREE(qemu_driver->configBaseDir);
|
||||||
VIR_FREE(qemu_driver->configDir);
|
VIR_FREE(qemu_driver->configDir);
|
||||||
VIR_FREE(qemu_driver->autostartDir);
|
VIR_FREE(qemu_driver->autostartDir);
|
||||||
VIR_FREE(qemu_driver->logDir);
|
VIR_FREE(qemu_driver->logDir);
|
||||||
|
Loading…
Reference in New Issue
Block a user