vector_free(mptable);
}
+struct mpentry *
+alloc_mpe (void)
+{
+ struct mpentry * mpe = MALLOC(sizeof(struct mpentry));
+
+ return mpe;
+}
+
static struct hwentry *
alloc_hwe (void)
{
- return (struct hwentry *)MALLOC(sizeof(struct hwentry));
+ struct hwentry * hwe = MALLOC(sizeof(struct hwentry));
+
+ return hwe;
}
static char *
int selector_args;
int pgpolicy;
int checker_index;
+ int pgfailback;
char * vendor;
char * product;
struct mpentry {
int selector_args;
int pgpolicy;
+ int pgfailback;
char * wwid;
char * selector;
int minio;
int checkint;
int max_checkint;
+ int pgfailback;
char * dev;
char * multipath;
struct mpentry * find_mpe (char * wwid);
char * get_mpe_wwid (char * alias);
+struct mpentry * alloc_mpe (void);
+
void free_hwe (struct hwentry * hwe);
void free_hwtable (vector hwtable);
void free_mpe (struct mpentry * mpe);
return 0;
}
+static int
+default_failback_handler(vector strvec)
+{
+ char * buff;
+
+ buff = set_value(strvec);
+
+ if (!strncmp(buff, "manual", 6))
+ conf->pgfailback = FAILBACK_MANUAL;
+ else if (!strncmp(buff, "immediate", 9))
+ conf->pgfailback = FAILBACK_IMMEDIATE;
+ else
+ conf->pgfailback = atoi(buff);
+
+ FREE(buff);
+
+ return 0;
+}
+
/*
* blacklist block handlers
*/
return push_callout(hwe->getprio);
}
+static int
+hw_failback_handler(vector strvec)
+{
+ struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
+ char * buff;
+
+ if (!hwe)
+ return 1;
+
+ buff = set_value(strvec);
+
+ if (!strncmp(buff, "manual", 6))
+ hwe->pgfailback = FAILBACK_MANUAL;
+ else if (!strncmp(buff, "immediate", 9))
+ hwe->pgfailback = FAILBACK_IMMEDIATE;
+ else
+ hwe->pgfailback = atoi(buff);
+
+ FREE(buff);
+
+ return 0;
+}
+
/*
* multipaths block handlers
*/
return 0;
}
+static int
+mp_failback_handler(vector strvec)
+{
+ struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable);
+ char * buff;
+
+ if (!mpe)
+ return 1;
+
+ buff = set_value(strvec);
+
+ if (!strncmp(buff, "manual", 6))
+ mpe->pgfailback = FAILBACK_MANUAL;
+ else if (!strncmp(buff, "immediate", 9))
+ mpe->pgfailback = FAILBACK_IMMEDIATE;
+ else
+ mpe->pgfailback = atoi(buff);
+
+ FREE(buff);
+
+ return 0;
+}
+
vector
init_keywords(void)
{
install_keyword("default_getuid_callout", &def_getuid_callout_handler);
install_keyword("default_prio_callout", &def_prio_callout_handler);
install_keyword("default_features", &def_features_handler);
+ install_keyword("failback", &default_failback_handler);
install_keyword("rr_min_io", &def_minio_handler);
install_keyword_root("devnode_blacklist", &blacklist_handler);
install_keyword("features", &hw_features_handler);
install_keyword("hardware_handler", &hw_handler_handler);
install_keyword("prio_callout", &prio_callout_handler);
+ install_keyword("failback", &hw_failback_handler);
install_sublevel_end();
install_keyword_root("multipaths", &multipaths_handler);
install_keyword("alias", &alias_handler);
install_keyword("path_grouping_policy", &mp_pgpolicy_handler);
install_keyword("path_selector", &mp_selector_handler);
+ install_keyword("failback", &mp_failback_handler);
install_sublevel_end();
return keywords;
* stop at first explicit setting found
*/
extern int
+select_pgfailback (struct multipath * mp)
+{
+condlog(3, "mpe = %i", mp->mpe->pgfailback);
+ if (mp->mpe && mp->mpe->pgfailback != FAILBACK_UNDEF) {
+ mp->pgfailback = mp->mpe->pgfailback;
+ condlog(3, "pgfailback = %i (LUN setting)", mp->pgfailback);
+ return 0;
+ }
+ if (mp->hwe && mp->hwe->pgfailback != FAILBACK_UNDEF) {
+ mp->pgfailback = mp->hwe->pgfailback;
+ condlog(3, "pgfailback = %i (controler setting)", mp->pgfailback);
+ return 0;
+ }
+ if (conf->pgfailback != FAILBACK_UNDEF) {
+ mp->pgfailback = conf->pgfailback;
+ condlog(3, "pgfailback = %i (config file default)", mp->pgfailback);
+ return 0;
+ }
+ mp->pgpolicy = FAILBACK_MANUAL;
+ condlog(3, "pgfailover = %s (internal default)", mp->pgfailback);
+ return 0;
+}
+
+extern int
select_pgpolicy (struct multipath * mp)
{
struct path * pp;
+int select_pgfailback (struct multipath * mp);
int select_pgpolicy (struct multipath * mp);
int select_selector (struct multipath * mp);
int select_alias (struct multipath * mp);
mpp = (struct multipath *)MALLOC(sizeof(struct multipath));
if (mpp) {
- mpp->pgfailback = FAILBACK_IMMEDIATE;
mpp->nextpg = 1;
}
return mpp;
#define KEEP_PATHS 0
#define FREE_PATHS 1
+#define FAILBACK_UNDEF 0
#define FAILBACK_MANUAL -1
-#define FAILBACK_IMMEDIATE 0
+#define FAILBACK_IMMEDIATE -2
enum pathstates {
PSTATE_RESERVED,
# # default : 1000
# #
# r_min_io 100
+#
+# #
+# # name : failback
+# # scope : multipathd
+# # desc : tell the daemon to manage path group failback, or not to.
+# # 0 means immediate failback, values >0 means deffered failback
+# # expressed in seconds.
+# # values : manual|immediate|n > 0
+# # default : immediate
+# #
+# failback manual
#}
#
##
# # default : "round-robin 0"
# #
# path_selector "round-robin 0"
+#
+# #
+# # name : failback
+# # scope : multipathd
+# # desc : tell the daemon to manage path group failback, or not to.
+# # 0 means immediate failback, values >0 means deffered failback
+# # expressed in seconds.
+# # values : manual|immediate|n > 0
+# # default : immediate
+# #
+# failback manual
# }
# multipath {
# wwid 1DEC_____321816758474
# # default : "round-robin 0"
# #
# path_selector "round-robin 0"
+#
+# #
+# # name : failback
+# # scope : multipathd
+# # desc : tell the daemon to manage path group failback, or not to.
+# # 0 means immediate failback, values >0 means deffered failback
+# # expressed in seconds.
+# # values : manual|immediate|n > 0
+# # default : immediate
+# #
+# failback 15
# }
# device {
# vendor "COMPAQ "
# default_prio_callout "/bin/true"
# default_features "0"
# rr_wmin_io 100
+# failback immediate
#}
#devnode_blacklist {
# wwid 26353900f02796769
# path_grouping_policy multibus
# path_checker readsector0
# path_selector "round-robin 0"
+# failback manual
# }
# multipath {
# wwid 1DEC_____321816758474
# path_selector "round-robin 0"
# features "1 queue_if_no_path"
# hardware_handler "0"
+# failback 15
# }
# device {
# vendor "COMPAQ "
goto out;
set_paths_owner(allpaths, mpp);
+ mpp->mpe = find_mpe(mpp->wwid);
+ select_pgfailback(mpp);
+
return 0;
out:
free_multipath(mpp, KEEP_PATHS);