]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Refactor creation of lock manager plugins
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 11 Dec 2012 15:59:21 +0000 (15:59 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 13 Dec 2012 15:26:57 +0000 (15:26 +0000)
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>
src/locking/lock_manager.c
src/locking/lock_manager.h
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_driver.c

index 423997b5eab6a107b34a70e5452a880e6f8cc3bb..e6d930854edcf083e3ac3262aa8d4d6732e8bb8a 100644 (file)
@@ -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",
index 4fee12d6743b115173da2c0531981d70a8f817a2..fea9db8d4e681f20b4f50320484fa184d296ba2d 100644 (file)
@@ -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);
index e95609cc7feacc3b97c0cfb57fd47b1bccabd94a..a1b1d04ab3fb15bf314431b90cc66ea1477711db 100644 (file)
@@ -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);
index d0d25ceb2f7d02ebbf3a65a17b2a8cc295cfb6d4..1a39946d6004c57aeffeda78fe059a9a6e740914 100644 (file)
@@ -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;
index 1228f6ed817a1ed677ad0333305d1e17e601f695..6f0849cf4ecae7500d71e765f713f733b13153c0 100644 (file)
@@ -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);