#include "debug.h"
#include "checkers.h"
+#include "vector.h"
+#include "config.h"
static LIST_HEAD(checkers);
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();
if (conf->udev_dir)
FREE(conf->udev_dir);
+ if (conf->multipath_dir)
+ FREE(conf->multipath_dir);
+
if (conf->selector)
FREE(conf->selector);
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;
}
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;
}
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;
char * dev;
char * sysfs_dir;
char * udev_dir;
+ char * multipath_dir;
char * selector;
char * getuid;
char * features;
#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"
}
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);
}
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)
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);
#include "debug.h"
#include "prio.h"
+#include "config.h"
static LIST_HEAD(prioritizers);
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))
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();
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);
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);
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);
condlog(0, "failed to initialize prioritizers");
exit(1);
}
- if (load_config(DEFAULT_CONFIGFILE))
- exit(1);
setlogmask(LOG_UPTO(conf->verbosity + 3));