summaryrefslogtreecommitdiffstats
path: root/0029-RHBZ-567219-recalculate-pgs-in-checkerloop.patch
blob: f7ec7b08420b062febf7e239bd41244377062716 (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
---
 multipathd/main.c |   34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

Index: multipath-tools/multipathd/main.c
===================================================================
--- multipath-tools.orig/multipathd/main.c
+++ multipath-tools/multipathd/main.c
@@ -48,6 +48,7 @@
 #include <configure.h>
 #include <prio.h>
 #include <finder.h>
+#include <pgpolicies.h>
 
 #include "main.h"
 #include "pidfile.h"
@@ -911,10 +912,33 @@ retry_count_tick(vector mpvec)
 	}
 }
 
+int update_path_groups(struct multipath *mpp, struct vectors *vecs)
+{
+	int i;
+	struct path * pp;
+
+	update_mpp_paths(mpp, vecs->pathvec);
+	vector_foreach_slot (mpp->paths, pp, i)
+		pathinfo(pp, conf->hwtable, DI_PRIO);
+	setup_map(mpp);
+	mpp->action = ACT_RELOAD;
+	if (domap(mpp) <= 0) {
+		condlog(0, "%s: failed to update map : %s", mpp->alias,
+			strerror(errno));
+		return 1;
+	}
+	dm_lib_release();
+	setup_multipath(vecs, mpp);
+	sync_map_state(mpp);
+
+	return 0;
+}
+
 void
 check_path (struct vectors * vecs, struct path * pp)
 {
 	int newstate;
+	int oldpriority;
 
 	if (!pp->mpp)
 		return;
@@ -1024,12 +1048,12 @@ check_path (struct vectors * vecs, struc
 	 * path prio refreshing
 	 */
 	condlog(4, "path prio refresh");
+	oldpriority = pp->priority;
 	pathinfo(pp, conf->hwtable, DI_PRIO);
-
-	/*
-	 * pathgroup failback policy
-	 */
-	if (need_switch_pathgroup(pp->mpp, 0)) {
+	if (pp->priority != oldpriority &&
+	    pp->mpp->pgpolicyfn == (pgpolicyfn *)group_by_prio)
+		update_path_groups(pp->mpp, vecs);
+	else if (need_switch_pathgroup(pp->mpp, 0)) {
 		if (pp->mpp->pgfailback > 0 &&
 		    pp->mpp->failback_tick <= 0)
 			pp->mpp->failback_tick =