summaryrefslogtreecommitdiffstats
path: root/0167-RHBZ-1335176-fix-show-cmds.patch
diff options
context:
space:
mode:
Diffstat (limited to '0167-RHBZ-1335176-fix-show-cmds.patch')
-rw-r--r--0167-RHBZ-1335176-fix-show-cmds.patch138
1 files changed, 138 insertions, 0 deletions
diff --git a/0167-RHBZ-1335176-fix-show-cmds.patch b/0167-RHBZ-1335176-fix-show-cmds.patch
new file mode 100644
index 0000000..55154b6
--- /dev/null
+++ b/0167-RHBZ-1335176-fix-show-cmds.patch
@@ -0,0 +1,138 @@
+---
+ libmultipath/print.c | 7 +++++++
+ libmultipath/structs.h | 1 +
+ libmultipath/structs_vec.c | 24 ++++++++++++++----------
+ multipathd/cli_handlers.c | 11 ++++++++++-
+ multipathd/main.c | 2 ++
+ 5 files changed, 34 insertions(+), 11 deletions(-)
+
+Index: multipath-tools-130222/libmultipath/print.c
+===================================================================
+--- multipath-tools-130222.orig/libmultipath/print.c
++++ multipath-tools-130222/libmultipath/print.c
+@@ -248,6 +248,12 @@ snprint_q_timeouts (char * buff, size_t
+ }
+
+ static int
++snprint_map_failures (char * buff, size_t len, struct multipath * mpp)
++{
++ return snprint_uint(buff, len, mpp->stat_map_failures);
++}
++
++static int
+ snprint_multipath_uuid (char * buff, size_t len, struct multipath * mpp)
+ {
+ return snprint_str(buff, len, mpp->wwid);
+@@ -546,6 +552,7 @@ struct multipath_data mpd[] = {
+ {'t', "dm-st", 0, snprint_dm_map_state},
+ {'S', "size", 0, snprint_multipath_size},
+ {'f', "features", 0, snprint_features},
++ {'x', "failures", 0, snprint_map_failures},
+ {'h', "hwhandler", 0, snprint_hwhandler},
+ {'A', "action", 0, snprint_action},
+ {'0', "path_faults", 0, snprint_path_faults},
+Index: multipath-tools-130222/libmultipath/structs.h
+===================================================================
+--- multipath-tools-130222.orig/libmultipath/structs.h
++++ multipath-tools-130222/libmultipath/structs.h
+@@ -270,6 +270,7 @@ struct multipath {
+ unsigned int stat_map_loads;
+ unsigned int stat_total_queueing_time;
+ unsigned int stat_queueing_timeouts;
++ unsigned int stat_map_failures;
+
+ /* checkers shared data */
+ void * mpcontext;
+Index: multipath-tools-130222/libmultipath/structs_vec.c
+===================================================================
+--- multipath-tools-130222.orig/libmultipath/structs_vec.c
++++ multipath-tools-130222/libmultipath/structs_vec.c
+@@ -579,16 +579,20 @@ int update_multipath (struct vectors *ve
+ */
+ void update_queue_mode_del_path(struct multipath *mpp)
+ {
+- if (--mpp->nr_active == 0 && mpp->no_path_retry > 0) {
+- /*
+- * Enter retry mode.
+- * meaning of +1: retry_tick may be decremented in
+- * checkerloop before starting retry.
+- */
+- mpp->stat_queueing_timeouts++;
+- mpp->retry_tick = mpp->no_path_retry * conf->checkint + 1;
+- condlog(1, "%s: Entering recovery mode: max_retries=%d",
+- mpp->alias, mpp->no_path_retry);
++ if (--mpp->nr_active == 0) {
++ if (mpp->no_path_retry > 0) {
++ /*
++ * Enter retry mode.
++ * meaning of +1: retry_tick may be decremented in
++ * checkerloop before starting retry.
++ */
++ mpp->stat_queueing_timeouts++;
++ mpp->retry_tick = mpp->no_path_retry *
++ conf->checkint + 1;
++ condlog(1, "%s: Entering recovery mode: max_retries=%d",
++ mpp->alias, mpp->no_path_retry);
++ } else if (mpp->no_path_retry != NO_PATH_RETRY_QUEUE)
++ mpp->stat_map_failures++;
+ }
+ condlog(2, "%s: remaining active paths: %d", mpp->alias, mpp->nr_active);
+ }
+Index: multipath-tools-130222/multipathd/cli_handlers.c
+===================================================================
+--- multipath-tools-130222.orig/multipathd/cli_handlers.c
++++ multipath-tools-130222/multipathd/cli_handlers.c
+@@ -319,9 +319,14 @@ show_maps (char ** r, int *len, struct v
+ c += snprint_multipath_header(c, reply + maxlen - c,
+ style);
+
+- vector_foreach_slot(vecs->mpvec, mpp, i)
++ vector_foreach_slot(vecs->mpvec, mpp, i) {
++ if (update_multipath(vecs, mpp->alias, 0)) {
++ i--;
++ continue;
++ }
+ c += snprint_multipath(c, reply + maxlen - c,
+ style, mpp, pretty);
++ }
+
+ again = ((c - reply) == (maxlen - 1));
+
+@@ -742,6 +747,8 @@ cli_disable_queueing(void *v, char **rep
+ return 1;
+ }
+
++ if (mpp->nr_active == 0)
++ mpp->stat_map_failures++;
+ mpp->retry_tick = 0;
+ dm_queue_if_no_path(mpp->alias, 0);
+ return 0;
+@@ -756,6 +763,8 @@ cli_disable_all_queueing(void *v, char *
+
+ condlog(2, "disable queueing (operator)");
+ vector_foreach_slot(vecs->mpvec, mpp, i) {
++ if (mpp->nr_active == 0)
++ mpp->stat_map_failures++;
+ mpp->retry_tick = 0;
+ dm_queue_if_no_path(mpp->alias, 0);
+ }
+Index: multipath-tools-130222/multipathd/main.c
+===================================================================
+--- multipath-tools-130222.orig/multipathd/main.c
++++ multipath-tools-130222/multipathd/main.c
+@@ -716,6 +716,7 @@ ev_remove_path (struct path *pp, struct
+ mpp->retry_tick = 0;
+ mpp->no_path_retry = NO_PATH_RETRY_FAIL;
+ mpp->flush_on_last_del = FLUSH_IN_PROGRESS;
++ mpp->stat_map_failures++;
+ dm_queue_if_no_path(mpp->alias, 0);
+ }
+ if (!flush_map(mpp, vecs, 1)) {
+@@ -1184,6 +1185,7 @@ retry_count_tick(vector mpvec)
+ mpp->stat_total_queueing_time++;
+ condlog(4, "%s: Retrying.. No active path", mpp->alias);
+ if(--mpp->retry_tick == 0) {
++ mpp->stat_map_failures++;
+ dm_queue_if_no_path(mpp->alias, 0);
+ condlog(2, "%s: Disable queueing", mpp->alias);
+ }