From: Martin Wilck <mwi...@suse.de>

The features queue_if_no_path and retain_attached_hw_handler are
treated separately in libmultipath. Compare these features by looking
at the respective flags, and ignore them when comparing the "features"
string. assemble_map() does the ssame thing when constructing the
features string for device mapper.

Signed-off-by: Martin Wilck <mwi...@suse.com>
---
 libmultipath/configure.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index f164801b..fb5a5a92 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -395,6 +395,7 @@ select_action (struct multipath * mpp, vector curmp, int 
force_reload)
 {
        struct multipath * cmpp;
        struct multipath * cmpp_by_name;
+       char * mpp_feat, * cmpp_feat;
 
        cmpp = find_mp_by_wwid(curmp, mpp->wwid);
        cmpp_by_name = find_mp_by_alias(curmp, mpp->alias);
@@ -455,11 +456,11 @@ select_action (struct multipath * mpp, vector curmp, int 
force_reload)
                        mpp->alias);
                return;
        }
-       if (!mpp->no_path_retry &&
-           (strlen(cmpp->features) != strlen(mpp->features) ||
-            strcmp(cmpp->features, mpp->features))) {
+
+       if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF &&
+           mpp->no_path_retry != cmpp->no_path_retry) {
                mpp->action =  ACT_RELOAD;
-               condlog(3, "%s: set ACT_RELOAD (features change)",
+               condlog(3, "%s: set ACT_RELOAD (no_path_retry change)",
                        mpp->alias);
                return;
        }
@@ -472,6 +473,31 @@ select_action (struct multipath * mpp, vector curmp, int 
force_reload)
                        mpp->alias);
                return;
        }
+
+       if (mpp->retain_hwhandler != RETAIN_HWHANDLER_UNDEF &&
+           mpp->retain_hwhandler != cmpp->retain_hwhandler) {
+               mpp->action = ACT_RELOAD;
+               condlog(3, "%s: set ACT_RELOAD (retain_hwhandler change)",
+                       mpp->alias);
+               return;
+       }
+
+       cmpp_feat = STRDUP(cmpp->features);
+       mpp_feat = STRDUP(mpp->features);
+       if (cmpp_feat && mpp_feat) {
+               remove_feature(&mpp_feat, "queue_if_no_path");
+               remove_feature(&mpp_feat, "retain_attached_hw_handler");
+               remove_feature(&cmpp_feat, "queue_if_no_path");
+               remove_feature(&cmpp_feat, "retain_attached_hw_handler");
+               if (strncmp(mpp_feat, cmpp_feat, PARAMS_SIZE)) {
+                       mpp->action =  ACT_RELOAD;
+                       condlog(3, "%s: set ACT_RELOAD (features change)",
+                               mpp->alias);
+               }
+       }
+       FREE(cmpp_feat);
+       FREE(mpp_feat);
+
        if (!cmpp->selector || strncmp(cmpp->selector, mpp->selector,
                    strlen(mpp->selector))) {
                mpp->action = ACT_RELOAD;
-- 
2.11.0

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to