summaryrefslogtreecommitdiffstats
path: root/0047-RHBZ-591608-only-switch-pgs-once.patch
blob: 001226a0072b2e917df48b049e9a2e19ce6840ba (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
---
 multipathd/main.c |   20 ++++++--------------
 1 file changed, 6 insertions(+), 14 deletions(-)

Index: multipath-tools/multipathd/main.c
===================================================================
--- multipath-tools.orig/multipathd/main.c
+++ multipath-tools/multipathd/main.c
@@ -965,6 +965,7 @@ check_path (struct vectors * vecs, struc
 {
 	int newstate;
 	int oldpriority;
+	int new_path_up = 0;
 
 	if (!pp->mpp)
 		return;
@@ -1033,16 +1034,7 @@ check_path (struct vectors * vecs, struc
 		else
 			reinstate_path(pp, 0);
 
-		/*
-		 * schedule [defered] failback
-		 */
-		if (pp->mpp->pgfailback > 0)
-			pp->mpp->failback_tick =
-				pp->mpp->pgfailback + 1;
-		else if (need_switch_pathgroup(pp->mpp, 1) &&
-			 (pp->mpp->pgfailback == -FAILBACK_IMMEDIATE ||
-			  followover_should_failback(pp)))
-			switch_pathgroup(pp->mpp);
+		new_path_up = 1;
 
 		/*
 		 * if at least one path is up in a group, and
@@ -1080,13 +1072,13 @@ check_path (struct vectors * vecs, struc
 	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)) {
+	else if (need_switch_pathgroup(pp->mpp, new_path_up)) {
 		if (pp->mpp->pgfailback > 0 &&
-		    pp->mpp->failback_tick <= 0)
+		    (new_path_up || pp->mpp->failback_tick <= 0))
 			pp->mpp->failback_tick =
 				pp->mpp->pgfailback + 1;
-		else if (pp->mpp->pgfailback ==
-				-FAILBACK_IMMEDIATE)
+		else if (pp->mpp->pgfailback == -FAILBACK_IMMEDIATE ||
+			 (new_path_up && followover_should_failback(pp)))
 			switch_pathgroup(pp->mpp);
 	}
 }