[dm-devel] [PATCH] Make modules directory configurable

Hannes Reinecke hare at suse.de
Wed Apr 30 09:04:59 UTC 2008


As we know have a separate directory for the various shared
libraries we should make this configurable.
And use that variable a prefix for dlopen() to make that
work correctly.

Signed-off-by: Hannes Reinecke <hare at suse.de>
---
 libmultipath/checkers.c |    5 ++++-
 libmultipath/config.c   |   27 ++++++++++++++++-----------
 libmultipath/config.h   |    1 +
 libmultipath/defaults.h |    1 +
 libmultipath/dict.c     |   24 ++++++++++++++++++++++++
 libmultipath/prio.c     |   18 ++++++++++--------
 multipath/main.c        |    6 +++---
 multipathd/main.c       |    5 +++--
 8 files changed, 62 insertions(+), 25 deletions(-)

diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c
index ff606d0..3aa1f9d 100644
--- a/libmultipath/checkers.c
+++ b/libmultipath/checkers.c
@@ -5,6 +5,8 @@
 
 #include "debug.h"
 #include "checkers.h"
+#include "vector.h"
+#include "config.h"
 
 static LIST_HEAD(checkers);
 
@@ -61,7 +63,8 @@ struct checker * add_checker (char * name)
 	c = alloc_checker();
 	if (!c)
 		return NULL;
-	snprintf(libname, LIB_CHECKER_NAMELEN, "libcheck%s.so", name);
+	snprintf(libname, LIB_CHECKER_NAMELEN, "%s/libcheck%s.so",
+		 conf->multipath_dir, name);
 	condlog(3, "loading %s checker", libname);
 	handle = dlopen(libname, RTLD_NOW);
 	errstr = dlerror();
diff --git a/libmultipath/config.c b/libmultipath/config.c
index af862b7..4548ad1 100644
--- a/libmultipath/config.c
+++ b/libmultipath/config.c
@@ -310,6 +310,9 @@ free_config (struct config * conf)
 	if (conf->udev_dir)
 		FREE(conf->udev_dir);
 
+	if (conf->multipath_dir)
+		FREE(conf->multipath_dir);
+
 	if (conf->selector)
 		FREE(conf->selector);
 
@@ -366,35 +369,37 @@ load_config (char * file)
 			goto out;
 		}
 	}
-	
+
 	/*
 	 * fill the voids left in the config file
 	 */
+	if (conf->multipath_dir == NULL)
+		conf->multipath_dir = set_default(DEFAULT_MULTIPATHDIR);
+
 	if (conf->hwtable == NULL) {
 		conf->hwtable = vector_alloc();
-		
+
 		if (!conf->hwtable)
 			goto out;
-		
 	}
 	if (setup_default_hwtable(conf->hwtable))
 		goto out;
 
 	if (conf->blist_devnode == NULL) {
 		conf->blist_devnode = vector_alloc();
-		
+
 		if (!conf->blist_devnode)
 			goto out;
 	}
 	if (conf->blist_wwid == NULL) {
 		conf->blist_wwid = vector_alloc();
-		
+
 		if (!conf->blist_wwid)
 			goto out;
 	}
 	if (conf->blist_device == NULL) {
 		conf->blist_device = vector_alloc();
-		
+
 		if (!conf->blist_device)
 			goto out;
 	}
@@ -402,21 +407,21 @@ load_config (char * file)
 		goto out;
 
 	if (conf->elist_devnode == NULL) {
-                conf->elist_devnode = vector_alloc();
+		conf->elist_devnode = vector_alloc();
 
-                if (!conf->elist_devnode)
+		if (!conf->elist_devnode)
 			goto out;
 	}
 	if (conf->elist_wwid == NULL) {
 		conf->elist_wwid = vector_alloc();
 
-                if (!conf->elist_wwid)
+		if (!conf->elist_wwid)
 			goto out;
 	}
 
 	if (conf->elist_device == NULL) {
 		conf->elist_device = vector_alloc();
-		
+
 		if (!conf->elist_device)
 			goto out;
 	}
@@ -442,7 +447,7 @@ load_config (char * file)
 	if (conf->hwhandler == NULL)
 		conf->hwhandler = set_default(DEFAULT_HWHANDLER);
 
-	if (!conf->selector  || !conf->udev_dir         ||
+	if (!conf->selector  || !conf->udev_dir || !conf->multipath_dir ||
 	    !conf->getuid    || !conf->features ||
 	    !conf->hwhandler)
 		goto out;
diff --git a/libmultipath/config.h b/libmultipath/config.h
index 7568d7b..8a97799 100644
--- a/libmultipath/config.h
+++ b/libmultipath/config.h
@@ -71,6 +71,7 @@ struct config {
 	char * dev;
 	char * sysfs_dir;
 	char * udev_dir;
+	char * multipath_dir;
 	char * selector;
 	char * getuid;
 	char * features;
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
index 97a3dd7..e8060a2 100644
--- a/libmultipath/defaults.h
+++ b/libmultipath/defaults.h
@@ -1,5 +1,6 @@
 #define DEFAULT_GETUID		"/lib/udev/scsi_id -g -u -s /block/%n"
 #define DEFAULT_UDEVDIR		"/dev"
+#define DEFAULT_MULTIPATHDIR	"/lib/multipath"
 #define DEFAULT_SELECTOR	"round-robin 0"
 #define DEFAULT_FEATURES	"0"
 #define DEFAULT_HWHANDLER	"0"
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
index 76571d7..b6f7845 100644
--- a/libmultipath/dict.c
+++ b/libmultipath/dict.c
@@ -44,6 +44,17 @@ udev_dir_handler(vector strvec)
 }
 
 static int
+multipath_dir_handler(vector strvec)
+{
+	conf->multipath_dir = set_value(strvec);
+
+	if (!conf->multipath_dir)
+		return 1;
+
+	return 0;
+}
+
+static int
 def_selector_handler(vector strvec)
 {
 	conf->selector = set_value(strvec);
@@ -1332,6 +1343,18 @@ snprint_def_udev_dir (char * buff, int len, void * data)
 }
 
 static int
+snprint_def_multipath_dir (char * buff, int len, void * data)
+{
+	if (!conf->udev_dir)
+		return 0;
+	if (strlen(DEFAULT_MULTIPATHDIR) == strlen(conf->multipath_dir) &&
+	    !strcmp(conf->multipath_dir, DEFAULT_MULTIPATHDIR))
+		return 0;
+
+	return snprintf(buff, len, "%s", conf->multipath_dir);
+}
+
+static int
 snprint_def_selector (char * buff, int len, void * data)
 {
 	if (!conf->selector)
@@ -1538,6 +1561,7 @@ init_keywords(void)
 	install_keyword_root("defaults", NULL);
 	install_keyword("polling_interval", &polling_interval_handler, &snprint_def_polling_interval);
 	install_keyword("udev_dir", &udev_dir_handler, &snprint_def_udev_dir);
+	install_keyword("multipath_dir", &multipath_dir_handler, &snprint_def_multipath_dir);
 	install_keyword("selector", &def_selector_handler, &snprint_def_selector);
 	install_keyword("path_grouping_policy", &def_pgpolicy_handler, &snprint_def_path_grouping_policy);
 	install_keyword("getuid_callout", &def_getuid_callout_handler, &snprint_def_getuid_callout);
diff --git a/libmultipath/prio.c b/libmultipath/prio.c
index 617fc19..54393f2 100644
--- a/libmultipath/prio.c
+++ b/libmultipath/prio.c
@@ -5,6 +5,7 @@
 
 #include "debug.h"
 #include "prio.h"
+#include "config.h"
 
 static LIST_HEAD(prioritizers);
 
@@ -28,18 +29,18 @@ void free_prio (struct prio * p)
 
 void cleanup_prio(void)
 {
-        struct prio * prio_loop;
-        struct prio * prio_temp;
+	struct prio * prio_loop;
+	struct prio * prio_temp;
 
-        list_for_each_entry_safe(prio_loop, prio_temp, &prioritizers, node) {
-                list_del(&prio_loop->node);
-                free(prio_loop);
-        }
+	list_for_each_entry_safe(prio_loop, prio_temp, &prioritizers, node) {
+		list_del(&prio_loop->node);
+		free(prio_loop);
+	}
 }
 
 struct prio * prio_lookup (char * name)
 {
-        struct prio * p;
+	struct prio * p;
 
 	list_for_each_entry(p, &prioritizers, node) {
 		if (!strncmp(name, p->name, PRIO_NAME_LEN))
@@ -61,7 +62,8 @@ struct prio * add_prio (char * name)
 	p = alloc_prio();
 	if (!p)
 		return NULL;
-	snprintf(libname, LIB_PRIO_NAMELEN, "libprio%s.so", name);
+	snprintf(libname, LIB_PRIO_NAMELEN, "%s/libprio%s.so",
+		 conf->multipath_dir, name);
 	condlog(3, "loading %s prioritizer", libname);
 	handle = dlopen(libname, RTLD_NOW);
 	errstr = dlerror();
diff --git a/multipath/main.c b/multipath/main.c
index c071cac..f1ac256 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -326,6 +326,9 @@ main (int argc, char *argv[])
 	if (dm_prereq(DEFAULT_TARGET))
 		exit(1);
 
+	if (load_config(DEFAULT_CONFIGFILE))
+		exit(1);
+
 	if (init_checkers()) {
 		condlog(0, "failed to initialize checkers");
 		exit(1);
@@ -334,9 +337,6 @@ main (int argc, char *argv[])
 		condlog(0, "failed to initialize prioritizers");
 		exit(1);
 	}
-	if (load_config(DEFAULT_CONFIGFILE))
-		exit(1);
-
 	if (sysfs_init(conf->sysfs_dir, FILE_NAME_SIZE)) {
 		condlog(0, "multipath tools need sysfs mounted");
 		exit(1);
diff --git a/multipathd/main.c b/multipathd/main.c
index 2b1fd86..ac9cd36 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1274,6 +1274,9 @@ child (void * param)
 	condlog(2, "--------start up--------");
 	condlog(2, "read " DEFAULT_CONFIGFILE);
 
+	if (load_config(DEFAULT_CONFIGFILE))
+		exit(1);
+
 	if (init_checkers()) {
 		condlog(0, "failed to initialize checkers");
 		exit(1);
@@ -1282,8 +1285,6 @@ child (void * param)
 		condlog(0, "failed to initialize prioritizers");
 		exit(1);
 	}
-	if (load_config(DEFAULT_CONFIGFILE))
-		exit(1);
 
 	setlogmask(LOG_UPTO(conf->verbosity + 3));
 
-- 
1.5.2.4




More information about the dm-devel mailing list