]> git.ipfire.org Git - people/amarx/ipfire-3.x.git/blob - multipath-tools/patches/0002-RH-path-checker.patch
Change file layout of the makefiles.
[people/amarx/ipfire-3.x.git] / multipath-tools / patches / 0002-RH-path-checker.patch
1 From f9ddbc18b7580f75c15bf6f3e10f08d6f016caca Mon Sep 17 00:00:00 2001
2 From: Fabio M. Di Nitto <fdinitto@redhat.com>
3 Date: Tue, 13 Oct 2009 08:18:00 +0200
4 Subject: [PATCH 02/12] RH: path checker
5
6 Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
7 ---
8 :100644 100644 e06dc52... 47107a2... M libmultipath/checkers/tur.c
9 :100644 100644 98d1618... 00aa5ea... M libmultipath/discovery.c
10 :100644 100644 7283f36... 17cd4af... M libmultipath/discovery.h
11 :100644 100644 90de6df... 5d3625a... M multipathd/main.c
12 libmultipath/checkers/tur.c | 1 -
13 libmultipath/discovery.c | 62 +++++++++++++++++++++++++++++++++---------
14 libmultipath/discovery.h | 2 +
15 multipathd/main.c | 21 +-------------
16 4 files changed, 52 insertions(+), 34 deletions(-)
17
18 Index: multipath-tools/libmultipath/checkers/tur.c
19 ===================================================================
20 --- multipath-tools.orig/libmultipath/checkers/tur.c
21 +++ multipath-tools/libmultipath/checkers/tur.c
22 @@ -69,7 +69,6 @@ libcheck_check (struct checker * c)
23 case DID_NO_CONNECT:
24 case DID_BAD_TARGET:
25 case DID_ABORT:
26 - case DID_TRANSPORT_DISRUPTED:
27 case DID_TRANSPORT_FAILFAST:
28 break;
29 default:
30 Index: multipath-tools/libmultipath/discovery.c
31 ===================================================================
32 --- multipath-tools.orig/libmultipath/discovery.c
33 +++ multipath-tools/libmultipath/discovery.c
34 @@ -616,10 +616,9 @@ struct sysfs_device *sysfs_device_from_p
35 }
36
37 int
38 -path_offline (struct path * pp)
39 +path_state (struct path * pp, char * buff)
40 {
41 struct sysfs_device * parent;
42 - char buff[SCSI_STATE_SIZE];
43
44 pp->sysdev = sysfs_device_from_path(pp);
45 if (!pp->sysdev) {
46 @@ -641,6 +640,16 @@ path_offline (struct path * pp)
47 return 1;
48
49 condlog(3, "%s: state = %s", pp->dev, buff);
50 + return 0;
51 +}
52 +
53 +int
54 +path_offline (struct path * pp)
55 +{
56 + char buff[SCSI_STATE_SIZE];
57 +
58 + if (path_state(pp, buff))
59 + return 1;
60
61 if (!strncmp(buff, "offline", 7)) {
62 pp->offline = 1;
63 @@ -650,6 +659,21 @@ path_offline (struct path * pp)
64 return 0;
65 }
66
67 +int
68 +path_blocked (struct path * pp)
69 +{
70 + char buff[SCSI_STATE_SIZE];
71 +
72 + if (pp->bus != SYSFS_BUS_SCSI)
73 + return 0;
74 + if (path_state(pp, buff))
75 + return 0;
76 + if (!strncmp(buff, "blocked", 7)) {
77 + return 1;
78 + }
79 + return 0;
80 +}
81 +
82 extern int
83 sysfs_pathinfo(struct path * pp)
84 {
85 @@ -736,36 +760,43 @@ cciss_ioctl_pathinfo (struct path * pp,
86 return 0;
87 }
88
89 -static int
90 -get_state (struct path * pp)
91 +int
92 +get_state (struct path * pp, int daemon)
93 {
94 struct checker * c = &pp->checker;
95 + int state;
96
97 condlog(3, "%s: get_state", pp->dev);
98
99 if (!checker_selected(c)) {
100 + if (daemon)
101 + pathinfo(pp, conf->hwtable, DI_SYSFS);
102 select_checker(pp);
103 if (!checker_selected(c)) {
104 condlog(3, "%s: No checker selected", pp->dev);
105 - return 1;
106 + return PATH_UNCHECKED;
107 }
108 checker_set_fd(c, pp->fd);
109 if (checker_init(c, pp->mpp?&pp->mpp->mpcontext:NULL)) {
110 condlog(3, "%s: checker init failed", pp->dev);
111 - return 1;
112 + return PATH_UNCHECKED;
113 }
114 }
115 if (path_offline(pp)) {
116 condlog(3, "%s: path offline", pp->dev);
117 - pp->state = PATH_DOWN;
118 - return 0;
119 + return PATH_DOWN;
120 }
121 - pp->state = checker_check(c);
122 - condlog(3, "%s: state = %i", pp->dev, pp->state);
123 - if (pp->state == PATH_DOWN && strlen(checker_message(c)))
124 + if (daemon) {
125 + if (path_blocked(pp))
126 + return PATH_PENDING;
127 + checker_set_async(c);
128 + }
129 + state = checker_check(c);
130 + condlog(3, "%s: state = %i", pp->dev, state);
131 + if (state == PATH_DOWN && strlen(checker_message(c)))
132 condlog(3, "%s: checker msg is \"%s\"",
133 pp->dev, checker_message(c));
134 - return 0;
135 + return state;
136 }
137
138 static int
139 @@ -850,8 +881,11 @@ pathinfo (struct path *pp, vector hwtabl
140 cciss_ioctl_pathinfo(pp, mask))
141 goto blank;
142
143 - if (mask & DI_CHECKER && get_state(pp))
144 - goto blank;
145 + if (mask & DI_CHECKER) {
146 + pp->state = get_state(pp, 0);
147 + if (pp->state == PATH_UNCHECKED || pp->state == PATH_WILD)
148 + goto blank;
149 + }
150
151 /*
152 * Retrieve path priority, even for PATH_DOWN paths if it has never
153 Index: multipath-tools/libmultipath/discovery.h
154 ===================================================================
155 --- multipath-tools.orig/libmultipath/discovery.h
156 +++ multipath-tools/libmultipath/discovery.h
157 @@ -30,6 +30,8 @@ int path_discovery (vector pathvec, stru
158 int do_tur (char *);
159 int devt2devname (char *, char *);
160 int path_offline (struct path *);
161 +int get_state (struct path * pp, int daemon);
162 +int path_blocked (struct path *);
163 int pathinfo (struct path *, vector hwtable, int mask);
164 struct path * store_pathinfo (vector pathvec, vector hwtable,
165 char * devname, int flag);
166 Index: multipath-tools/multipathd/main.c
167 ===================================================================
168 --- multipath-tools.orig/multipathd/main.c
169 +++ multipath-tools/multipathd/main.c
170 @@ -908,26 +908,9 @@ check_path (struct vectors * vecs, struc
171 */
172 pp->tick = conf->checkint;
173
174 - if (!checker_selected(&pp->checker)) {
175 - pathinfo(pp, conf->hwtable, DI_SYSFS);
176 - select_checker(pp);
177 - }
178 - if (!checker_selected(&pp->checker)) {
179 - condlog(0, "%s: checker is not set", pp->dev);
180 - return;
181 - }
182 - /*
183 - * Set checker in async mode.
184 - * Honored only by checker implementing the said mode.
185 - */
186 - checker_set_async(&pp->checker);
187 -
188 - if (path_offline(pp))
189 - newstate = PATH_DOWN;
190 - else
191 - newstate = checker_check(&pp->checker);
192 + newstate = get_state(pp, 1);
193
194 - if (newstate < 0) {
195 + if (newstate == PATH_WILD || newstate == PATH_UNCHECKED) {
196 condlog(2, "%s: unusable path", pp->dev);
197 pathinfo(pp, conf->hwtable, 0);
198 return;