[libvirt] [PATCH 03/14] Refactor creation of lock manager plugins

Daniel P. Berrange berrange at redhat.com
Tue Dec 11 20:41:37 UTC 2012


From: "Daniel P. Berrange" <berrange at 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 at 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




More information about the libvir-list mailing list