summaryrefslogtreecommitdiffstats
path: root/0065-RHBZ-635088-update-priority.patch
diff options
context:
space:
mode:
Diffstat (limited to '0065-RHBZ-635088-update-priority.patch')
-rw-r--r--0065-RHBZ-635088-update-priority.patch79
1 files changed, 79 insertions, 0 deletions
diff --git a/0065-RHBZ-635088-update-priority.patch b/0065-RHBZ-635088-update-priority.patch
new file mode 100644
index 0000000..7c594dc
--- /dev/null
+++ b/0065-RHBZ-635088-update-priority.patch
@@ -0,0 +1,79 @@
+---
+ multipathd/main.c | 45 +++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 35 insertions(+), 10 deletions(-)
+
+Index: multipath-tools/multipathd/main.c
+===================================================================
+--- multipath-tools.orig/multipathd/main.c
++++ multipath-tools/multipathd/main.c
+@@ -943,14 +943,41 @@ retry_count_tick(vector mpvec)
+ }
+ }
+
+-int update_path_groups(struct multipath *mpp, struct vectors *vecs)
++int update_prio(struct path *pp, int refresh_all)
++{
++ int oldpriority;
++ struct pathgroup * pgp;
++ int i, j, changed = 0;
++
++ if (refresh_all) {
++ vector_foreach_slot (pp->mpp->pg, pgp, i) {
++ vector_foreach_slot (pgp->paths, pp, j) {
++ oldpriority = pp->priority;
++ pathinfo(pp, conf->hwtable, DI_PRIO);
++ if (pp->priority != oldpriority)
++ changed = 1;
++ }
++ }
++ return changed;
++ }
++ oldpriority = pp->priority;
++ pathinfo(pp, conf->hwtable, DI_PRIO);
++
++ if (pp->priority == oldpriority)
++ return 0;
++ return 1;
++}
++
++int update_path_groups(struct multipath *mpp, struct vectors *vecs, int refresh)
+ {
+ int i;
+ struct path * pp;
+
+ update_mpp_paths(mpp, vecs->pathvec);
+- vector_foreach_slot (mpp->paths, pp, i)
+- pathinfo(pp, conf->hwtable, DI_PRIO);
++ if (!refresh) {
++ vector_foreach_slot (mpp->paths, pp, i)
++ pathinfo(pp, conf->hwtable, DI_PRIO);
++ }
+ setup_map(mpp);
+ mpp->action = ACT_RELOAD;
+ if (domap(mpp) <= 0) {
+@@ -969,7 +996,6 @@ void
+ check_path (struct vectors * vecs, struct path * pp)
+ {
+ int newstate;
+- int oldpriority;
+ int new_path_up = 0;
+
+ if (!pp->mpp)
+@@ -1072,12 +1098,11 @@ check_path (struct vectors * vecs, struc
+ * path prio refreshing
+ */
+ condlog(4, "path prio refresh");
+- oldpriority = pp->priority;
+- pathinfo(pp, conf->hwtable, DI_PRIO);
+- if (pp->priority != oldpriority &&
+- pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio)
+- update_path_groups(pp->mpp, vecs);
+- else if (need_switch_pathgroup(pp->mpp, new_path_up)) {
++ if (update_prio(pp, new_path_up) &&
++ pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio &&
++ pp->mpp->pgfailback != -FAILBACK_FOLLOWOVER)
++ update_path_groups(pp->mpp, vecs, !new_path_up);
++ else if (need_switch_pathgroup(pp->mpp, 0)) {
+ if (pp->mpp->pgfailback > 0 &&
+ (new_path_up || pp->mpp->failback_tick <= 0))
+ pp->mpp->failback_tick =