summaryrefslogtreecommitdiffstats
path: root/0065-RHBZ-635088-update-priority.patch
blob: 7c594dc49af97a100d032e78ce3e9167de4333c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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 =