]>
Commit | Line | Data |
---|---|---|
dc01aad8 SS |
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; |