<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>