<div dir="ltr">Applied,<div><br></div><div>Valuable maintainability enhancement, again, thanks.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 2, 2014 at 2:55 AM, Benjamin Marzinski <span dir="ltr"><<a href="mailto:bmarzins@redhat.com" target="_blank">bmarzins@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Many of the functions in propsel.c are nearly identical, except for the<br>
names of the variables that they are dealing with. Also, some variables<br>
that the user configured with a keyword were just printing the variable<br>
as an integer, which isn't very helpful without looking at the code to<br>
see what the number stands for. They were using the variable names<br>
instead of the config file names as well. This patch tries to simplify<br>
the file by using macros for the repetitive work of the functions, and<br>
standardizes and clarifies the debug messages by using the print functions<br>
from dict.c<br>
<br>
Signed-off-by: Benjamin Marzinski <<a href="mailto:bmarzins@redhat.com">bmarzins@redhat.com</a>><br>
---<br>
libmultipath/dict.c | 14 +-<br>
libmultipath/dict.h | 7 +<br>
libmultipath/pgpolicies.c | 2 +-<br>
libmultipath/propsel.c | 712 +++++++++++++++++-----------------------------<br>
4 files changed, 282 insertions(+), 453 deletions(-)<br>
<br>
diff --git a/libmultipath/dict.c b/libmultipath/dict.c<br>
index e88c122..98cbe48 100644<br>
--- a/libmultipath/dict.c<br>
+++ b/libmultipath/dict.c<br>
@@ -496,7 +496,7 @@ set_fast_io_fail(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_fast_io_fail(char * buff, int len, void *ptr)<br>
{<br>
int *int_ptr = (int *)ptr;<br>
@@ -534,7 +534,7 @@ set_dev_loss(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_dev_loss(char * buff, int len, void *ptr)<br>
{<br>
unsigned int *uint_ptr = (unsigned int *)ptr;<br>
@@ -567,7 +567,7 @@ set_pgpolicy(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_pgpolicy(char * buff, int len, void *ptr)<br>
{<br>
char str[POLICY_NAME_SIZE];<br>
@@ -683,7 +683,7 @@ set_rr_weight(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_rr_weight (char * buff, int len, void *ptr)<br>
{<br>
int *int_ptr = (int *)ptr;<br>
@@ -727,7 +727,7 @@ set_pgfailback(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_pgfailback (char * buff, int len, void *ptr)<br>
{<br>
int *int_ptr = (int *)ptr;<br>
@@ -774,7 +774,7 @@ set_no_path_retry(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_no_path_retry(char * buff, int len, void *ptr)<br>
{<br>
int *int_ptr = (int *)ptr;<br>
@@ -873,7 +873,7 @@ set_reservation_key(vector strvec, void *ptr)<br>
return 0;<br>
}<br>
<br>
-static int<br>
+int<br>
print_reservation_key(char * buff, int len, void * ptr)<br>
{<br>
unsigned char **uchar_ptr = (unsigned char **)ptr;<br>
diff --git a/libmultipath/dict.h b/libmultipath/dict.h<br>
index 688eab7..84b6180 100644<br>
--- a/libmultipath/dict.h<br>
+++ b/libmultipath/dict.h<br>
@@ -7,5 +7,12 @@<br>
<br>
void init_keywords(void);<br>
int get_sys_max_fds(int *);<br>
+int print_rr_weight (char * buff, int len, void *ptr);<br>
+int print_pgfailback (char * buff, int len, void *ptr);<br>
+int print_pgpolicy(char * buff, int len, void *ptr);<br>
+int print_no_path_retry(char * buff, int len, void *ptr);<br>
+int print_fast_io_fail(char * buff, int len, void *ptr);<br>
+int print_dev_loss(char * buff, int len, void *ptr);<br>
+int print_reservation_key(char * buff, int len, void * ptr);<br>
<br>
#endif /* _DICT_H */<br>
diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c<br>
index f76ad60..2981d51 100644<br>
--- a/libmultipath/pgpolicies.c<br>
+++ b/libmultipath/pgpolicies.c<br>
@@ -27,7 +27,7 @@ get_pgpolicy_id (char * str)<br>
if (0 == strncmp(str, "group_by_node_name", 18))<br>
return GROUP_BY_NODE_NAME;<br>
<br>
- return -1;<br>
+ return IOPOLICY_UNDEF;<br>
}<br>
<br>
extern int<br>
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c<br>
index 7a966bb..f2ab7d2 100644<br>
--- a/libmultipath/propsel.c<br>
+++ b/libmultipath/propsel.c<br>
@@ -17,6 +17,7 @@<br>
#include "devmapper.h"<br>
#include "prio.h"<br>
#include "discovery.h"<br>
+#include "dict.h"<br>
#include "prioritizers/alua_rtpg.h"<br>
#include <inttypes.h><br>
<br>
@@ -29,57 +30,92 @@ pgpolicyfn *pgpolicies[] = {<br>
group_by_node_name<br>
};<br>
<br>
+#define do_set(var, src, dest, msg) \<br>
+do { \<br>
+ if (src && src->var) { \<br>
+ dest = src->var; \<br>
+ origin = msg; \<br>
+ goto out; \<br>
+ } \<br>
+} while(0)<br>
+#define do_default(dest, value) \<br>
+do { \<br>
+ dest = value; \<br>
+ origin = "(internal default)"; \<br>
+} while(0)<br>
+<br>
+#define mp_set_mpe(var) \<br>
+do_set(var, mp->mpe, mp->var, "(LUN setting)")<br>
+#define mp_set_hwe(var) \<br>
+do_set(var, mp->hwe, mp->var, "(controller setting)")<br>
+#define mp_set_conf(var) \<br>
+do_set(var, conf, mp->var, "(config file default)")<br>
+#define mp_set_default(var, value) \<br>
+do_default(mp->var, value)<br>
+<br>
+#define pp_set_mpe(var) \<br>
+do_set(var, mpe, pp->var, "(LUN setting)")<br>
+#define pp_set_hwe(var) \<br>
+do_set(var, pp->hwe, pp->var, "(controller setting)")<br>
+#define pp_set_conf(var) \<br>
+do_set(var, conf, pp->var, "(config file default)")<br>
+#define pp_set_default(var, value) \<br>
+do_default(pp->var, value)<br>
+<br>
+#define do_attr_set(var, src, shift, msg) \<br>
+do { \<br>
+ if (src && (src->attribute_flags & (1 << shift))) { \<br>
+ mp->attribute_flags |= (1 << shift); \<br>
+ mp->var = src->var; \<br>
+ origin = msg; \<br>
+ goto out; \<br>
+ } \<br>
+} while(0)<br>
+<br>
+#define set_attr_mpe(var, shift) \<br>
+do_attr_set(var, mp->mpe, shift, "(LUN setting)")<br>
+#define set_attr_conf(var, shift) \<br>
+do_attr_set(var, conf, shift, "(config file default)")<br>
+<br>
extern int<br>
select_mode (struct multipath *mp)<br>
{<br>
- if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_MODE))) {<br>
- mp->attribute_flags |= (1 << ATTR_MODE);<br>
- mp->mode = mp->mpe->mode;<br>
- condlog(3, "mode = 0%o (LUN setting)", mp->mode);<br>
- }<br>
- else if (conf->attribute_flags & (1 << ATTR_MODE)) {<br>
- mp->attribute_flags |= (1 << ATTR_MODE);<br>
- mp->mode = conf->mode;<br>
- condlog(3, "mode = 0%o (config file default)", mp->mode);<br>
- }<br>
- else<br>
- mp->attribute_flags &= ~(1 << ATTR_MODE);<br>
+ char *origin;<br>
+<br>
+ set_attr_mpe(mode, ATTR_MODE);<br>
+ set_attr_conf(mode, ATTR_MODE);<br>
+ mp->attribute_flags &= ~(1 << ATTR_MODE);<br>
+ return 0;<br>
+out:<br>
+ condlog(3, "%s: mode = 0%o %s", mp->alias, mp->mode, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_uid (struct multipath *mp)<br>
{<br>
- if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_UID))) {<br>
- mp->attribute_flags |= (1 << ATTR_UID);<br>
- mp->uid = mp->mpe->uid;<br>
- condlog(3, "uid = %u (LUN setting)", mp->uid);<br>
- }<br>
- else if (conf->attribute_flags & (1 << ATTR_UID)) {<br>
- mp->attribute_flags |= (1 << ATTR_UID);<br>
- mp->uid = conf->uid;<br>
- condlog(3, "uid = %u (config file default)", mp->uid);<br>
- }<br>
- else<br>
- mp->attribute_flags &= ~(1 << ATTR_UID);<br>
+ char *origin;<br>
+<br>
+ set_attr_mpe(uid, ATTR_UID);<br>
+ set_attr_conf(uid, ATTR_UID);<br>
+ mp->attribute_flags &= ~(1 << ATTR_UID);<br>
+ return 0;<br>
+out:<br>
+ condlog(3, "%s: uid = 0%o %s", mp->alias, mp->uid, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_gid (struct multipath *mp)<br>
{<br>
- if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_GID))) {<br>
- mp->attribute_flags |= (1 << ATTR_GID);<br>
- mp->gid = mp->mpe->gid;<br>
- condlog(3, "gid = %u (LUN setting)", mp->gid);<br>
- }<br>
- else if (conf->attribute_flags & (1 << ATTR_GID)) {<br>
- mp->attribute_flags |= (1 << ATTR_GID);<br>
- mp->gid = conf->gid;<br>
- condlog(3, "gid = %u (config file default)", mp->gid);<br>
- }<br>
- else<br>
- mp->attribute_flags &= ~(1 << ATTR_GID);<br>
+ char *origin;<br>
+<br>
+ set_attr_mpe(gid, ATTR_GID);<br>
+ set_attr_conf(gid, ATTR_GID);<br>
+ mp->attribute_flags &= ~(1 << ATTR_GID);<br>
+ return 0;<br>
+out:<br>
+ condlog(3, "%s: gid = 0%o %s", mp->alias, mp->gid, origin);<br>
return 0;<br>
}<br>
<br>
@@ -91,151 +127,80 @@ select_gid (struct multipath *mp)<br>
extern int<br>
select_rr_weight (struct multipath * mp)<br>
{<br>
- if (mp->mpe && mp->mpe->rr_weight) {<br>
- mp->rr_weight = mp->mpe->rr_weight;<br>
- condlog(3, "%s: rr_weight = %i (LUN setting)",<br>
- mp->alias, mp->rr_weight);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->rr_weight) {<br>
- mp->rr_weight = mp->hwe->rr_weight;<br>
- condlog(3, "%s: rr_weight = %i (controller setting)",<br>
- mp->alias, mp->rr_weight);<br>
- return 0;<br>
- }<br>
- if (conf->rr_weight) {<br>
- mp->rr_weight = conf->rr_weight;<br>
- condlog(3, "%s: rr_weight = %i (config file default)",<br>
- mp->alias, mp->rr_weight);<br>
- return 0;<br>
- }<br>
- mp->rr_weight = RR_WEIGHT_NONE;<br>
- condlog(3, "%s: rr_weight = %i (internal default)",<br>
- mp->alias, mp->rr_weight);<br>
+ char *origin, buff[13];<br>
+<br>
+ mp_set_mpe(rr_weight);<br>
+ mp_set_hwe(rr_weight);<br>
+ mp_set_conf(rr_weight);<br>
+ mp_set_default(rr_weight, RR_WEIGHT_NONE);<br>
+out:<br>
+ print_rr_weight(buff, 13, &mp->rr_weight);<br>
+ condlog(3, "%s: rr_weight = %s %s", mp->alias, buff, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_pgfailback (struct multipath * mp)<br>
{<br>
- if (mp->mpe && mp->mpe->pgfailback != FAILBACK_UNDEF) {<br>
- mp->pgfailback = mp->mpe->pgfailback;<br>
- condlog(3, "%s: pgfailback = %i (LUN setting)",<br>
- mp->alias, mp->pgfailback);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->pgfailback != FAILBACK_UNDEF) {<br>
- mp->pgfailback = mp->hwe->pgfailback;<br>
- condlog(3, "%s: pgfailback = %i (controller setting)",<br>
- mp->alias, mp->pgfailback);<br>
- return 0;<br>
- }<br>
- if (conf->pgfailback != FAILBACK_UNDEF) {<br>
- mp->pgfailback = conf->pgfailback;<br>
- condlog(3, "%s: pgfailback = %i (config file default)",<br>
- mp->alias, mp->pgfailback);<br>
- return 0;<br>
- }<br>
- mp->pgfailback = DEFAULT_FAILBACK;<br>
- condlog(3, "%s: pgfailover = %i (internal default)",<br>
- mp->alias, mp->pgfailback);<br>
+ char *origin, buff[13];<br>
+<br>
+ mp_set_mpe(pgfailback);<br>
+ mp_set_hwe(pgfailback);<br>
+ mp_set_conf(pgfailback);<br>
+ mp_set_default(pgfailback, DEFAULT_FAILBACK);<br>
+out:<br>
+ print_pgfailback(buff, 13, &mp->pgfailback);<br>
+ condlog(3, "%s: failback = %s %s", mp->alias, buff, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_pgpolicy (struct multipath * mp)<br>
{<br>
- char pgpolicy_name[POLICY_NAME_SIZE];<br>
+ char *origin, buff[POLICY_NAME_SIZE];<br>
<br>
if (conf->pgpolicy_flag > 0) {<br>
mp->pgpolicy = conf->pgpolicy_flag;<br>
- mp->pgpolicyfn = pgpolicies[mp->pgpolicy];<br>
- get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,<br>
- mp->pgpolicy);<br>
- condlog(3, "%s: pgpolicy = %s (cmd line flag)",<br>
- mp->alias, pgpolicy_name);<br>
- return 0;<br>
- }<br>
- if (mp->mpe && mp->mpe->pgpolicy > 0) {<br>
- mp->pgpolicy = mp->mpe->pgpolicy;<br>
- mp->pgpolicyfn = pgpolicies[mp->pgpolicy];<br>
- get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,<br>
- mp->pgpolicy);<br>
- condlog(3, "%s: pgpolicy = %s (LUN setting)",<br>
- mp->alias, pgpolicy_name);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->pgpolicy > 0) {<br>
- mp->pgpolicy = mp->hwe->pgpolicy;<br>
- mp->pgpolicyfn = pgpolicies[mp->pgpolicy];<br>
- get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,<br>
- mp->pgpolicy);<br>
- condlog(3, "%s: pgpolicy = %s (controller setting)",<br>
- mp->alias, pgpolicy_name);<br>
- return 0;<br>
- }<br>
- if (conf->pgpolicy > 0) {<br>
- mp->pgpolicy = conf->pgpolicy;<br>
- mp->pgpolicyfn = pgpolicies[mp->pgpolicy];<br>
- get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,<br>
- mp->pgpolicy);<br>
- condlog(3, "%s: pgpolicy = %s (config file default)",<br>
- mp->alias, pgpolicy_name);<br>
- return 0;<br>
+ origin = "(cmd line flag)";<br>
+ goto out;<br>
}<br>
- mp->pgpolicy = DEFAULT_PGPOLICY;<br>
+ mp_set_mpe(pgpolicy);<br>
+ mp_set_hwe(pgpolicy);<br>
+ mp_set_conf(pgpolicy);<br>
+ mp_set_default(pgpolicy, DEFAULT_PGPOLICY);<br>
+out:<br>
mp->pgpolicyfn = pgpolicies[mp->pgpolicy];<br>
- get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE, mp->pgpolicy);<br>
- condlog(3, "%s: pgpolicy = %s (internal default)",<br>
- mp->alias, pgpolicy_name);<br>
+ get_pgpolicy_name(buff, POLICY_NAME_SIZE, mp->pgpolicy);<br>
+ condlog(3, "%s: path_grouping_policy = %s %s", mp->alias, buff, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_selector (struct multipath * mp)<br>
{<br>
- if (mp->mpe && mp->mpe->selector) {<br>
- mp->selector = mp->mpe->selector;<br>
- condlog(3, "%s: selector = %s (LUN setting)",<br>
- mp->alias, mp->selector);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->selector) {<br>
- mp->selector = mp->hwe->selector;<br>
- condlog(3, "%s: selector = %s (controller setting)",<br>
- mp->alias, mp->selector);<br>
- return 0;<br>
- }<br>
- if (conf->selector) {<br>
- mp->selector = conf->selector;<br>
- condlog(3, "%s: selector = %s (config file default)",<br>
- mp->alias, mp->selector);<br>
- return 0;<br>
- }<br>
- mp->selector = set_default(DEFAULT_SELECTOR);<br>
- condlog(3, "%s: selector = %s (internal default)",<br>
- mp->alias, mp->selector);<br>
+ char *origin;<br>
+<br>
+ mp_set_mpe(selector);<br>
+ mp_set_hwe(selector);<br>
+ mp_set_conf(selector);<br>
+ mp_set_default(selector, set_default(DEFAULT_SELECTOR));<br>
+out:<br>
+ condlog(3, "%s: path_selector = \"%s\" %s", mp->alias, mp->selector,<br>
+ origin);<br>
return 0;<br>
}<br>
<br>
static void<br>
select_alias_prefix (struct multipath * mp)<br>
{<br>
- if (mp->hwe && mp->hwe->alias_prefix) {<br>
- mp->alias_prefix = mp->hwe->alias_prefix;<br>
- condlog(3, "%s: alias_prefix = %s (controller setting)",<br>
- mp->wwid, mp->alias_prefix);<br>
- return;<br>
- }<br>
- if (conf->alias_prefix) {<br>
- mp->alias_prefix = conf->alias_prefix;<br>
- condlog(3, "%s: alias_prefix = %s (config file default)",<br>
- mp->wwid, mp->alias_prefix);<br>
- return;<br>
- }<br>
- mp->alias_prefix = set_default(DEFAULT_ALIAS_PREFIX);<br>
- condlog(3, "%s: alias_prefix = %s (internal default)",<br>
- mp->wwid, mp->alias_prefix);<br>
+ char *origin;<br>
+<br>
+ mp_set_hwe(alias_prefix);<br>
+ mp_set_conf(alias_prefix);<br>
+ mp_set_default(alias_prefix, DEFAULT_ALIAS_PREFIX);<br>
+out:<br>
+ condlog(3, "%s: alias_prefix = %s %s", mp->wwid, mp->alias_prefix,<br>
+ origin);<br>
}<br>
<br>
static int<br>
@@ -253,8 +218,11 @@ want_user_friendly_names(struct multipath * mp)<br>
extern int<br>
select_alias (struct multipath * mp)<br>
{<br>
+ char *origin;<br>
+<br>
if (mp->mpe && mp->mpe->alias) {<br>
mp->alias = STRDUP(mp->mpe->alias);<br>
+ origin = "(LUN setting)";<br>
goto out;<br>
}<br>
<br>
@@ -269,39 +237,37 @@ select_alias (struct multipath * mp)<br>
mp->alias_old, mp->alias_prefix,<br>
conf->bindings_read_only);<br>
memset (mp->alias_old, 0, WWID_SIZE);<br>
+ origin = "(using existing alias)";<br>
}<br>
<br>
- if (mp->alias == NULL)<br>
+ if (mp->alias == NULL) {<br>
mp->alias = get_user_friendly_alias(mp->wwid,<br>
conf->bindings_file, mp->alias_prefix, conf->bindings_read_only);<br>
+ origin = "(user_friendly_name)";<br>
+ }<br>
out:<br>
- if (mp->alias == NULL)<br>
+ if (mp->alias == NULL) {<br>
mp->alias = STRDUP(mp->wwid);<br>
-<br>
+ origin = "(default to wwid)";<br>
+ }<br>
+ if (mp->alias)<br>
+ condlog(3, "%s: alias = %s %s", mp->wwid, mp->alias, origin);<br>
return mp->alias ? 0 : 1;<br>
}<br>
<br>
extern int<br>
select_features (struct multipath * mp)<br>
{<br>
- struct mpentry * mpe;<br>
char *origin;<br>
<br>
- if ((mpe = find_mpe(mp->wwid)) && mpe->features) {<br>
- mp->features = STRDUP(mpe->features);<br>
- origin = "LUN setting";<br>
- } else if (mp->hwe && mp->hwe->features) {<br>
- mp->features = STRDUP(mp->hwe->features);<br>
- origin = "controller setting";<br>
- } else if (conf->features) {<br>
- mp->features = STRDUP(conf->features);<br>
- origin = "config file default";<br>
- } else {<br>
- mp->features = set_default(DEFAULT_FEATURES);<br>
- origin = "internal default";<br>
- }<br>
- condlog(3, "%s: features = %s (%s)",<br>
- mp->alias, mp->features, origin);<br>
+ mp_set_mpe(features);<br>
+ mp_set_hwe(features);<br>
+ mp_set_conf(features);<br>
+ mp_set_default(features, DEFAULT_FEATURES);<br>
+out:<br>
+ mp->features = STRDUP(mp->features);<br>
+ condlog(3, "%s: features = \"%s\" %s", mp->alias, mp->features, origin);<br>
+<br>
if (strstr(mp->features, "queue_if_no_path")) {<br>
if (mp->no_path_retry == NO_PATH_RETRY_UNDEF)<br>
mp->no_path_retry = NO_PATH_RETRY_QUEUE;<br>
@@ -317,45 +283,29 @@ select_features (struct multipath * mp)<br>
extern int<br>
select_hwhandler (struct multipath * mp)<br>
{<br>
- if (mp->hwe && mp->hwe->hwhandler) {<br>
- mp->hwhandler = mp->hwe->hwhandler;<br>
- condlog(3, "%s: hwhandler = %s (controller setting)",<br>
- mp->alias, mp->hwhandler);<br>
- return 0;<br>
- }<br>
- if (conf->hwhandler) {<br>
- mp->hwhandler = conf->hwhandler;<br>
- condlog(3, "%s: hwhandler = %s (config file default)",<br>
- mp->alias, mp->hwhandler);<br>
- return 0;<br>
- }<br>
- mp->hwhandler = set_default(DEFAULT_HWHANDLER);<br>
- condlog(3, "%s: hwhandler = %s (internal default)",<br>
- mp->alias, mp->hwhandler);<br>
+ char *origin;<br>
+<br>
+ mp_set_hwe(hwhandler);<br>
+ mp_set_conf(hwhandler);<br>
+ mp_set_default(hwhandler, set_default(DEFAULT_HWHANDLER));<br>
+out:<br>
+ condlog(3, "%s: hardware_handler = \"%s\" %s", mp->alias, mp->hwhandler,<br>
+ origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_checker(struct path *pp)<br>
{<br>
+ char *origin, *checker_name;<br>
struct checker * c = &pp->checker;<br>
<br>
- if (pp->hwe && pp->hwe->checker_name) {<br>
- checker_get(c, pp->hwe->checker_name);<br>
- condlog(3, "%s: path checker = %s (controller setting)",<br>
- pp->dev, checker_name(c));<br>
- goto out;<br>
- }<br>
- if (conf->checker_name) {<br>
- checker_get(c, conf->checker_name);<br>
- condlog(3, "%s: path checker = %s (config file default)",<br>
- pp->dev, checker_name(c));<br>
- goto out;<br>
- }<br>
- checker_get(c, DEFAULT_CHECKER);<br>
- condlog(3, "%s: path checker = %s (internal default)",<br>
- pp->dev, checker_name(c));<br>
+ do_set(checker_name, pp->hwe, checker_name, "(controller setting)");<br>
+ do_set(checker_name, conf, checker_name, "(config file setting)");<br>
+ do_default(checker_name, DEFAULT_CHECKER);<br>
out:<br>
+ checker_get(c, checker_name);<br>
+ condlog(3, "%s: path_checker = %s %s", pp->dev, c->name, origin);<br>
if (conf->checker_timeout) {<br>
c->timeout = conf->checker_timeout;<br>
condlog(3, "%s: checker timeout = %u s (config file default)",<br>
@@ -375,33 +325,20 @@ out:<br>
extern int<br>
select_getuid (struct path * pp)<br>
{<br>
- if (pp->hwe && pp->hwe->uid_attribute) {<br>
- pp->uid_attribute = pp->hwe->uid_attribute;<br>
- condlog(3, "%s: uid_attribute = %s (controller setting)",<br>
- pp->dev, pp->uid_attribute);<br>
- return 0;<br>
- }<br>
- if (pp->hwe && pp->hwe->getuid) {<br>
- pp->getuid = pp->hwe->getuid;<br>
- condlog(3, "%s: getuid = %s (deprecated) (controller setting)",<br>
- pp->dev, pp->getuid);<br>
- return 0;<br>
- }<br>
- if (conf->uid_attribute) {<br>
- pp->uid_attribute = conf->uid_attribute;<br>
- condlog(3, "%s: uid_attribute = %s (config file default)",<br>
- pp->dev, pp->uid_attribute);<br>
- return 0;<br>
- }<br>
- if (conf->getuid) {<br>
- pp->getuid = conf->getuid;<br>
- condlog(3, "%s: getuid = %s (deprecated) (config file default)",<br>
- pp->dev, pp->getuid);<br>
- return 0;<br>
- }<br>
- pp->uid_attribute = STRDUP(DEFAULT_UID_ATTRIBUTE);<br>
- condlog(3, "%s: uid_attribute = %s (internal default)",<br>
- pp->dev, pp->uid_attribute);<br>
+ char *origin;<br>
+<br>
+ pp_set_hwe(uid_attribute);<br>
+ pp_set_hwe(getuid);<br>
+ pp_set_conf(uid_attribute);<br>
+ pp_set_conf(getuid);<br>
+ pp_set_default(uid_attribute, DEFAULT_UID_ATTRIBUTE);<br>
+out:<br>
+ if (pp->uid_attribute)<br>
+ condlog(3, "%s: uid_attribute = %s %s", pp->dev,<br>
+ pp->uid_attribute, origin);<br>
+ else if (pp->getuid)<br>
+ condlog(3, "%s: getuid = \"%s\" %s", pp->dev, pp->getuid,<br>
+ origin);<br>
return 0;<br>
}<br>
<br>
@@ -421,140 +358,94 @@ detect_prio(struct path * pp)<br>
prio_get(p, PRIO_ALUA, DEFAULT_PRIO_ARGS);<br>
}<br>
<br>
+#define set_prio(src, msg) \<br>
+do { \<br>
+ if (src && src->prio_name) { \<br>
+ prio_get(p, src->prio_name, src->prio_args); \<br>
+ origin = msg; \<br>
+ goto out; \<br>
+ } \<br>
+} while(0)<br>
+<br>
extern int<br>
select_prio (struct path * pp)<br>
{<br>
+ char *origin;<br>
struct mpentry * mpe;<br>
struct prio * p = &pp->prio;<br>
<br>
if (pp->detect_prio == DETECT_PRIO_ON) {<br>
detect_prio(pp);<br>
if (prio_selected(p)) {<br>
- condlog(3, "%s: prio = %s (detected setting)",<br>
- pp->dev, prio_name(p));<br>
- return 0;<br>
- }<br>
- }<br>
-<br>
- if ((mpe = find_mpe(pp->wwid))) {<br>
- if (mpe->prio_name) {<br>
- prio_get(p, mpe->prio_name, mpe->prio_args);<br>
- condlog(3, "%s: prio = %s (LUN setting)",<br>
- pp->dev, prio_name(p));<br>
- return 0;<br>
+ origin = "(detected setting)";<br>
+ goto out;<br>
}<br>
}<br>
-<br>
- if (pp->hwe && pp->hwe->prio_name) {<br>
- prio_get(p, pp->hwe->prio_name, pp->hwe->prio_args);<br>
- condlog(3, "%s: prio = %s (controller setting)",<br>
- pp->dev, pp->hwe->prio_name);<br>
- condlog(3, "%s: prio args = %s (controller setting)",<br>
- pp->dev, pp->hwe->prio_args);<br>
- return 0;<br>
- }<br>
- if (conf->prio_name) {<br>
- prio_get(p, conf->prio_name, conf->prio_args);<br>
- condlog(3, "%s: prio = %s (config file default)",<br>
- pp->dev, conf->prio_name);<br>
- condlog(3, "%s: prio args = %s (config file default)",<br>
- pp->dev, conf->prio_args);<br>
- return 0;<br>
- }<br>
+ mpe = find_mpe(pp->wwid);<br>
+ set_prio(mpe, "(LUN setting)");<br>
+ set_prio(pp->hwe, "controller setting)");<br>
+ set_prio(conf, "(config file default)");<br>
prio_get(p, DEFAULT_PRIO, DEFAULT_PRIO_ARGS);<br>
- condlog(3, "%s: prio = %s (internal default)",<br>
- pp->dev, DEFAULT_PRIO);<br>
- condlog(3, "%s: prio args = %s (internal default)",<br>
- pp->dev, DEFAULT_PRIO_ARGS);<br>
+ origin = "(internal default)";<br>
+out:<br>
+ condlog(3, "%s: prio = %s %s", pp->dev, prio_name(p), origin);<br>
+ condlog(3, "%s: prio args = \"%s\" %s", pp->dev, prio_args(p), origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_no_path_retry(struct multipath *mp)<br>
{<br>
+ char *origin = NULL;<br>
+ char buff[12];<br>
+<br>
if (mp->flush_on_last_del == FLUSH_IN_PROGRESS) {<br>
condlog(0, "flush_on_last_del in progress");<br>
mp->no_path_retry = NO_PATH_RETRY_FAIL;<br>
return 0;<br>
}<br>
- if (mp->mpe && mp->mpe->no_path_retry != NO_PATH_RETRY_UNDEF) {<br>
- mp->no_path_retry = mp->mpe->no_path_retry;<br>
- condlog(3, "%s: no_path_retry = %i (multipath setting)",<br>
- mp->alias, mp->no_path_retry);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->no_path_retry != NO_PATH_RETRY_UNDEF) {<br>
- mp->no_path_retry = mp->hwe->no_path_retry;<br>
- condlog(3, "%s: no_path_retry = %i (controller setting)",<br>
- mp->alias, mp->no_path_retry);<br>
- return 0;<br>
- }<br>
- if (conf->no_path_retry != NO_PATH_RETRY_UNDEF) {<br>
- mp->no_path_retry = conf->no_path_retry;<br>
- condlog(3, "%s: no_path_retry = %i (config file default)",<br>
- mp->alias, mp->no_path_retry);<br>
- return 0;<br>
- }<br>
- if (mp->no_path_retry != NO_PATH_RETRY_UNDEF)<br>
- condlog(3, "%s: no_path_retry = %i (inherited setting)",<br>
- mp->alias, mp->no_path_retry);<br>
+ mp_set_mpe(no_path_retry);<br>
+ mp_set_hwe(no_path_retry);<br>
+ mp_set_conf(no_path_retry);<br>
+out:<br>
+ print_no_path_retry(buff, 12, &mp->no_path_retry);<br>
+ if (origin)<br>
+ condlog(3, "%s: no_path_retry = %s %s", mp->alias, buff,<br>
+ origin);<br>
+ else if (mp->no_path_retry != NO_PATH_RETRY_UNDEF)<br>
+ condlog(3, "%s: no_path_retry = %s (inheritied setting)",<br>
+ mp->alias, buff);<br>
else<br>
- condlog(3, "%s: no_path_retry = %i (internal default)",<br>
- mp->alias, mp->no_path_retry);<br>
+ condlog(3, "%s: no_path_retry = undef (internal default)",<br>
+ mp->alias);<br>
return 0;<br>
}<br>
<br>
int<br>
select_minio_rq (struct multipath * mp)<br>
{<br>
- if (mp->mpe && mp->mpe->minio_rq) {<br>
- mp->minio = mp->mpe->minio_rq;<br>
- condlog(3, "%s: minio = %i rq (LUN setting)",<br>
- mp->alias, mp->minio);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->minio_rq) {<br>
- mp->minio = mp->hwe->minio_rq;<br>
- condlog(3, "%s: minio = %i rq (controller setting)",<br>
- mp->alias, mp->minio);<br>
- return 0;<br>
- }<br>
- if (conf->minio) {<br>
- mp->minio = conf->minio_rq;<br>
- condlog(3, "%s: minio = %i rq (config file default)",<br>
- mp->alias, mp->minio);<br>
- return 0;<br>
- }<br>
- mp->minio = DEFAULT_MINIO_RQ;<br>
- condlog(3, "%s: minio = %i rq (internal default)",<br>
- mp->alias, mp->minio);<br>
+ char *origin;<br>
+<br>
+ do_set(minio_rq, mp->mpe, mp->minio, "(LUN setting)");<br>
+ do_set(minio_rq, mp->hwe, mp->minio, "(controller setting)");<br>
+ do_set(minio_rq, conf, mp->minio, "(config file setting)");<br>
+ do_default(mp->minio, DEFAULT_MINIO_RQ);<br>
+out:<br>
+ condlog(3, "%s: minio = %i %s", mp->alias, mp->minio, origin);<br>
return 0;<br>
}<br>
<br>
int<br>
select_minio_bio (struct multipath * mp)<br>
{<br>
- if (mp->mpe && mp->mpe->minio) {<br>
- mp->minio = mp->mpe->minio;<br>
- condlog(3, "%s: minio = %i (LUN setting)",<br>
- mp->alias, mp->minio);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->minio) {<br>
- mp->minio = mp->hwe->minio;<br>
- condlog(3, "%s: minio = %i (controller setting)",<br>
- mp->alias, mp->minio);<br>
- return 0;<br>
- }<br>
- if (conf->minio) {<br>
- mp->minio = conf->minio;<br>
- condlog(3, "%s: minio = %i (config file default)",<br>
- mp->alias, mp->minio);<br>
- return 0;<br>
- }<br>
- mp->minio = DEFAULT_MINIO;<br>
- condlog(3, "%s: minio = %i (internal default)",<br>
- mp->alias, mp->minio);<br>
+ char *origin;<br>
+<br>
+ mp_set_mpe(minio);<br>
+ mp_set_hwe(minio);<br>
+ mp_set_conf(minio);<br>
+ mp_set_default(minio, DEFAULT_MINIO);<br>
+out:<br>
+ condlog(3, "%s: minio = %i %s", mp->alias, mp->minio, origin);<br>
return 0;<br>
}<br>
<br>
@@ -572,164 +463,95 @@ select_minio (struct multipath * mp)<br>
extern int<br>
select_fast_io_fail(struct multipath *mp)<br>
{<br>
- if (mp->hwe && mp->hwe->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {<br>
- mp->fast_io_fail = mp->hwe->fast_io_fail;<br>
- if (mp->fast_io_fail == MP_FAST_IO_FAIL_OFF)<br>
- condlog(3, "%s: fast_io_fail_tmo = off "<br>
- "(controller setting)", mp->alias);<br>
- else<br>
- condlog(3, "%s: fast_io_fail_tmo = %d "<br>
- "(controller setting)", mp->alias,<br>
- mp->fast_io_fail == MP_FAST_IO_FAIL_ZERO ? 0 : mp->fast_io_fail);<br>
- return 0;<br>
- }<br>
- if (conf->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {<br>
- mp->fast_io_fail = conf->fast_io_fail;<br>
- if (mp->fast_io_fail == MP_FAST_IO_FAIL_OFF)<br>
- condlog(3, "%s: fast_io_fail_tmo = off "<br>
- "(config file default)", mp->alias);<br>
- else<br>
- condlog(3, "%s: fast_io_fail_tmo = %d "<br>
- "(config file default)", mp->alias,<br>
- mp->fast_io_fail == MP_FAST_IO_FAIL_ZERO ? 0 : mp->fast_io_fail);<br>
- return 0;<br>
- }<br>
- mp->fast_io_fail = MP_FAST_IO_FAIL_UNSET;<br>
+ char *origin, buff[12];<br>
+<br>
+ mp_set_hwe(fast_io_fail);<br>
+ mp_set_conf(fast_io_fail);<br>
+ mp_set_default(fast_io_fail, DEFAULT_FAST_IO_FAIL);<br>
+out:<br>
+ print_fast_io_fail(buff, 12, &mp->fast_io_fail);<br>
+ condlog(3, "%s: fast_io_fail_tmo = %s %s", mp->alias, buff, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_dev_loss(struct multipath *mp)<br>
{<br>
- if (mp->hwe && mp->hwe->dev_loss) {<br>
- mp->dev_loss = mp->hwe->dev_loss;<br>
- condlog(3, "%s: dev_loss_tmo = %u (controller default)",<br>
- mp->alias, mp->dev_loss);<br>
- return 0;<br>
- }<br>
- if (conf->dev_loss) {<br>
- mp->dev_loss = conf->dev_loss;<br>
- condlog(3, "%s: dev_loss_tmo = %u (config file default)",<br>
- mp->alias, mp->dev_loss);<br>
- return 0;<br>
- }<br>
+ char *origin, buff[12];<br>
+<br>
+ mp_set_hwe(dev_loss);<br>
+ mp_set_conf(dev_loss);<br>
mp->dev_loss = 0;<br>
return 0;<br>
+out:<br>
+ print_dev_loss(buff, 12, &mp->dev_loss);<br>
+ condlog(3, "%s: dev_loss_tmo = %s %s", mp->alias, buff, origin);<br>
+ return 0;<br>
}<br>
<br>
extern int<br>
select_flush_on_last_del(struct multipath *mp)<br>
{<br>
+ char *origin;<br>
+<br>
if (mp->flush_on_last_del == FLUSH_IN_PROGRESS)<br>
return 0;<br>
- if (mp->mpe && mp->mpe->flush_on_last_del != FLUSH_UNDEF) {<br>
- mp->flush_on_last_del = mp->mpe->flush_on_last_del;<br>
- condlog(3, "%s: flush_on_last_del = %i (multipath setting)",<br>
- mp->alias, mp->flush_on_last_del);<br>
- return 0;<br>
- }<br>
- if (mp->hwe && mp->hwe->flush_on_last_del != FLUSH_UNDEF) {<br>
- mp->flush_on_last_del = mp->hwe->flush_on_last_del;<br>
- condlog(3, "%s: flush_on_last_del = %i (controller setting)",<br>
- mp->alias, mp->flush_on_last_del);<br>
- return 0;<br>
- }<br>
- if (conf->flush_on_last_del != FLUSH_UNDEF) {<br>
- mp->flush_on_last_del = conf->flush_on_last_del;<br>
- condlog(3, "%s: flush_on_last_del = %i (config file default)",<br>
- mp->alias, mp->flush_on_last_del);<br>
- return 0;<br>
- }<br>
- mp->flush_on_last_del = FLUSH_UNDEF;<br>
- condlog(3, "%s: flush_on_last_del = DISABLED (internal default)",<br>
- mp->alias);<br>
+ mp_set_mpe(flush_on_last_del);<br>
+ mp_set_hwe(flush_on_last_del);<br>
+ mp_set_conf(flush_on_last_del);<br>
+ mp_set_default(flush_on_last_del, FLUSH_DISABLED);<br>
+out:<br>
+ condlog(3, "%s: flush_on_last_del = %s %s", mp->alias,<br>
+ (mp->flush_on_last_del == FLUSH_ENABLED)? "yes" : "no", origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_reservation_key (struct multipath * mp)<br>
{<br>
- int j;<br>
- unsigned char *keyp;<br>
- uint64_t prkey = 0;<br>
+ char *origin, buff[12];<br>
<br>
+ mp_set_mpe(reservation_key);<br>
+ mp_set_conf(reservation_key);<br>
mp->reservation_key = NULL;<br>
-<br>
- if (mp->mpe && mp->mpe->reservation_key) {<br>
- keyp = mp->mpe->reservation_key;<br>
- for (j = 0; j < 8; ++j) {<br>
- if (j > 0)<br>
- prkey <<= 8;<br>
- prkey |= *keyp;<br>
- ++keyp;<br>
- }<br>
-<br>
- condlog(3, "%s: reservation_key = 0x%" PRIx64 " "<br>
- "(multipath setting)", mp->alias, prkey);<br>
-<br>
- mp->reservation_key = mp->mpe->reservation_key;<br>
- return 0;<br>
- }<br>
-<br>
- if (conf->reservation_key) {<br>
- keyp = conf->reservation_key;<br>
- for (j = 0; j < 8; ++j) {<br>
- if (j > 0)<br>
- prkey <<= 8;<br>
- prkey |= *keyp;<br>
- ++keyp;<br>
- }<br>
-<br>
- condlog(3, "%s: reservation_key = 0x%" PRIx64<br>
- " (config file default)", mp->alias, prkey);<br>
-<br>
- mp->reservation_key = conf->reservation_key;<br>
- return 0;<br>
- }<br>
-<br>
+ return 0;<br>
+out:<br>
+ print_reservation_key(buff, 12, &mp->reservation_key);<br>
+ condlog(3, "%s: reservation_key = %s %s", mp->alias, buff, origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_retain_hwhandler (struct multipath * mp)<br>
{<br>
+ char *origin;<br>
unsigned int minv_dm_retain[3] = {1, 5, 0};<br>
<br>
if (!VERSION_GE(conf->version, minv_dm_retain)) {<br>
mp->retain_hwhandler = RETAIN_HWHANDLER_OFF;<br>
- condlog(3, "%s: retain_attached_hw_handler disabled (requires kernel version >= 1.5.0)", mp->alias);<br>
- return 0;<br>
- }<br>
-<br>
- if (mp->hwe && mp->hwe->retain_hwhandler) {<br>
- mp->retain_hwhandler = mp->hwe->retain_hwhandler;<br>
- condlog(3, "%s: retain_attached_hw_handler = %d (controller default)", mp->alias, mp->retain_hwhandler);<br>
- return 0;<br>
- }<br>
- if (conf->retain_hwhandler) {<br>
- mp->retain_hwhandler = conf->retain_hwhandler;<br>
- condlog(3, "%s: retain_attached_hw_handler = %d (config file default)", mp->alias, mp->retain_hwhandler);<br>
- return 0;<br>
+ origin = "(requires kernel version >= 1.5.0)";<br>
+ goto out;<br>
}<br>
- mp->retain_hwhandler = 0;<br>
- condlog(3, "%s: retain_attached_hw_handler = %d (compiled in default)", mp->alias, mp->retain_hwhandler);<br>
+ mp_set_hwe(retain_hwhandler);<br>
+ mp_set_conf(retain_hwhandler);<br>
+ mp_set_default(retain_hwhandler, DEFAULT_RETAIN_HWHANDLER);<br>
+out:<br>
+ condlog(3, "%s: retain_attached_hw_handler = %s %s", mp->alias,<br>
+ (mp->retain_hwhandler == RETAIN_HWHANDLER_ON)? "yes" : "no",<br>
+ origin);<br>
return 0;<br>
}<br>
<br>
extern int<br>
select_detect_prio (struct path * pp)<br>
{<br>
- if (pp->hwe && pp->hwe->detect_prio) {<br>
- pp->detect_prio = pp->hwe->detect_prio;<br>
- condlog(3, "%s: detect_prio = %d (controller default)", pp->dev, pp->detect_prio);<br>
- return 0;<br>
- }<br>
- if (conf->detect_prio) {<br>
- pp->detect_prio = conf->detect_prio;<br>
- condlog(3, "%s: detect_prio = %d (config file default)", pp->dev, pp->detect_prio);<br>
- return 0;<br>
- }<br>
- pp->detect_prio = 0;<br>
- condlog(3, "%s: detect_prio = %d (compiled in default)", pp->dev, pp->detect_prio);<br>
+ char *origin;<br>
+<br>
+ pp_set_hwe(detect_prio);<br>
+ pp_set_conf(detect_prio);<br>
+ pp_set_default(detect_prio, DEFAULT_DETECT_PRIO);<br>
+out:<br>
+ condlog(3, "%s: detect_prio = %s %s", pp->dev,<br>
+ (pp->detect_prio == DETECT_PRIO_ON)? "yes" : "no", origin);<br>
return 0;<br>
}<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
</font></span></blockquote></div><br></div>