[libmultipath] allow for non-default DESTDIR in hwtable
[platform/upstream/multipath-tools.git] / libmultipath / hwtable.c
1 #include <stdio.h>
2
3 #include <checkers.h>
4
5 #include "vector.h"
6 #include "defaults.h"
7 #include "structs.h"
8 #include "config.h"
9 #include "pgpolicies.h"
10
11 /*
12  * Tuning suggestions on these parameters should go to
13  * dm-devel@redhat.com
14  * 
15  * You are welcome to claim maintainership over a controller
16  * family. Please mail the currently enlisted maintainer and
17  * the upstream package maintainer.
18  */
19 static struct hwentry default_hw[] = {
20         /*
21          * Apple controller family
22          *
23          * Maintainer : Shyam Sundar
24          * Mail : g.shyamsundar@yahoo.co.in
25          */
26         {
27                 .vendor        = "APPLE*",
28                 .product       = "Xserve RAID ",
29                 .getuid        = DEFAULT_GETUID,
30                 .getprio       = NULL,
31                 .features      = DEFAULT_FEATURES,
32                 .hwhandler     = DEFAULT_HWHANDLER,
33                 .selector      = DEFAULT_SELECTOR,
34                 .pgpolicy      = MULTIBUS,
35                 .pgfailback    = FAILBACK_UNDEF,
36                 .rr_weight     = RR_WEIGHT_NONE,
37                 .no_path_retry = NO_PATH_RETRY_UNDEF,
38                 .minio         = DEFAULT_MINIO,
39                 .checker_name  = DEFAULT_CHECKER,
40         },
41         /*
42          * StorageWorks controller family
43          *
44          * Maintainer : Christophe Varoqui
45          * Mail : christophe.varoqui@free.fr
46          */
47         {
48                 .vendor        = "3PARdata",
49                 .product       = "VV",
50                 .getuid        = DEFAULT_GETUID,
51                 .getprio       = NULL,
52                 .features      = DEFAULT_FEATURES,
53                 .hwhandler     = DEFAULT_HWHANDLER,
54                 .selector      = DEFAULT_SELECTOR,
55                 .pgpolicy      = MULTIBUS,
56                 .pgfailback    = FAILBACK_UNDEF,
57                 .rr_weight     = RR_WEIGHT_NONE,
58                 .no_path_retry = NO_PATH_RETRY_UNDEF,
59                 .minio         = DEFAULT_MINIO,
60                 .checker_name  = DEFAULT_CHECKER,
61         },
62         {
63                 .vendor        = "DEC",
64                 .product       = "HSG80",
65                 .getuid        = DEFAULT_GETUID,
66                 .getprio       = NULL,
67                 .features      = DEFAULT_FEATURES,
68                 .hwhandler     = "1 hp_sw",
69                 .selector      = DEFAULT_SELECTOR,
70                 .pgpolicy      = GROUP_BY_SERIAL,
71                 .pgfailback    = FAILBACK_UNDEF,
72                 .rr_weight     = RR_WEIGHT_NONE,
73                 .no_path_retry = NO_PATH_RETRY_UNDEF,
74                 .minio         = DEFAULT_MINIO,
75                 .checker_name  = HP_SW,
76         },
77         {
78                 .vendor        = "{COMPAQ,HP}",
79                 .product       = "{MSA,HSV}1*",
80                 .getuid        = DEFAULT_GETUID,
81                 .getprio       = NULL,
82                 .features      = DEFAULT_FEATURES,
83                 .hwhandler     = "1 hp_sw",
84                 .selector      = DEFAULT_SELECTOR,
85                 .pgpolicy      = GROUP_BY_SERIAL,
86                 .pgfailback    = FAILBACK_UNDEF,
87                 .rr_weight     = RR_WEIGHT_NONE,
88                 .no_path_retry = NO_PATH_RETRY_UNDEF,
89                 .minio         = DEFAULT_MINIO,
90                 .checker_name  = HP_SW,
91         },
92         {
93                 .vendor        = "HP",
94                 .product       = "{HSV2*,A6189A}",
95                 .getuid        = DEFAULT_GETUID,
96                 .getprio       = NULL,
97                 .features      = DEFAULT_FEATURES,
98                 .hwhandler     = DEFAULT_HWHANDLER,
99                 .selector      = DEFAULT_SELECTOR,
100                 .pgpolicy      = MULTIBUS,
101                 .pgfailback    = FAILBACK_UNDEF,
102                 .rr_weight     = RR_WEIGHT_NONE,
103                 .no_path_retry = NO_PATH_RETRY_UNDEF,
104                 .minio         = DEFAULT_MINIO,
105                 .checker_name  = READSECTOR0,
106         },
107         /*
108          * DDN controller family
109          *
110          * Maintainer : Christophe Varoqui
111          * Mail : christophe.varoqui@free.fr
112          */
113         {
114                 .vendor        = "DDN",
115                 .product       = "SAN DataDirector",
116                 .getuid        = DEFAULT_GETUID,
117                 .getprio       = NULL,
118                 .features      = DEFAULT_FEATURES,
119                 .hwhandler     = DEFAULT_HWHANDLER,
120                 .selector      = DEFAULT_SELECTOR,
121                 .pgpolicy      = MULTIBUS,
122                 .pgfailback    = FAILBACK_UNDEF,
123                 .rr_weight     = RR_WEIGHT_NONE,
124                 .no_path_retry = NO_PATH_RETRY_UNDEF,
125                 .minio         = DEFAULT_MINIO,
126                 .checker_name  = READSECTOR0,
127         },
128         /*
129          * EMC / Clariion controller family
130          *
131          * Maintainer : Edward Goggin, EMC
132          * Mail : egoggin@emc.com
133          */
134         {
135                 .vendor        = "EMC",
136                 .product       = "SYMMETRIX",
137                 .getuid        = "/sbin/scsi_id -g -u -ppre-spc3-83 -s /block/%n",
138                 .getprio       = NULL,
139                 .features      = DEFAULT_FEATURES,
140                 .hwhandler     = DEFAULT_HWHANDLER,
141                 .selector      = DEFAULT_SELECTOR,
142                 .pgpolicy      = MULTIBUS,
143                 .pgfailback    = FAILBACK_UNDEF,
144                 .rr_weight     = RR_WEIGHT_NONE,
145                 .no_path_retry = NO_PATH_RETRY_UNDEF,
146                 .minio         = DEFAULT_MINIO,
147                 .checker_name  = READSECTOR0,
148         },
149         {
150                 .vendor        = "DGC",
151                 .product       = "*",
152                 .bl_product    = "LUNZ",
153                 .getuid        = DEFAULT_GETUID,
154                 .getprio       = "mpath_prio_emc /dev/%n",
155                 .features      = "1 queue_if_no_path",
156                 .hwhandler     = "1 emc",
157                 .selector      = DEFAULT_SELECTOR,
158                 .pgpolicy      = GROUP_BY_PRIO,
159                 .pgfailback    = -FAILBACK_IMMEDIATE,
160                 .rr_weight     = RR_WEIGHT_NONE,
161                 .no_path_retry = (300 / DEFAULT_CHECKINT),
162                 .minio         = DEFAULT_MINIO,
163                 .checker_name  = EMC_CLARIION,
164         },
165         /*
166          * Fujitsu controller family
167          *
168          * Maintainer : Christophe Varoqui
169          * Mail : christophe.varoqui@free.fr
170          */
171         {
172                 .vendor        = "FSC",
173                 .product       = "CentricStor",
174                 .getuid        = DEFAULT_GETUID,
175                 .getprio       = NULL,
176                 .features      = DEFAULT_FEATURES,
177                 .hwhandler     = DEFAULT_HWHANDLER,
178                 .selector      = DEFAULT_SELECTOR,
179                 .pgpolicy      = GROUP_BY_SERIAL,
180                 .pgfailback    = FAILBACK_UNDEF,
181                 .rr_weight     = RR_WEIGHT_NONE,
182                 .no_path_retry = NO_PATH_RETRY_UNDEF,
183                 .minio         = DEFAULT_MINIO,
184                 .checker_name  = READSECTOR0,
185         },
186         /*
187          * Hitachi controller family
188          *
189          * Maintainer : Matthias Rudolph
190          * Mail : matthias.rudolph@hds.com
191          */
192         {
193                 .vendor        = "{HITACHI,HP}",
194                 .product       = "OPEN-*",
195                 .getuid        = DEFAULT_GETUID,
196                 .getprio       = NULL,
197                 .features      = DEFAULT_FEATURES,
198                 .hwhandler     = DEFAULT_HWHANDLER,
199                 .selector      = DEFAULT_SELECTOR,
200                 .pgpolicy      = MULTIBUS,
201                 .pgfailback    = FAILBACK_UNDEF,
202                 .rr_weight     = RR_WEIGHT_NONE,
203                 .no_path_retry = NO_PATH_RETRY_UNDEF,
204                 .minio         = DEFAULT_MINIO,
205                 .checker_name  = READSECTOR0,
206         },
207         {
208                 .vendor        = "HITACHI",
209                 .product       = "DF*",
210                 .getuid        = DEFAULT_GETUID,
211                 .getprio       = "/sbin/mpath_prio_hds_modular %d",
212                 .features      = DEFAULT_FEATURES,
213                 .hwhandler     = DEFAULT_HWHANDLER,
214                 .selector      = DEFAULT_SELECTOR,
215                 .pgpolicy      = GROUP_BY_PRIO,
216                 .pgfailback    = -FAILBACK_IMMEDIATE,
217                 .rr_weight     = RR_WEIGHT_NONE,
218                 .no_path_retry = NO_PATH_RETRY_UNDEF,
219                 .minio         = DEFAULT_MINIO,
220                 .checker_name  = READSECTOR0,
221         },
222         /*
223          * IBM controller family
224          *
225          * Maintainer : Hannes Reinecke, SuSE
226          * Mail : hare@suse.de
227          */
228         {
229                 .vendor        = "IBM",
230                 .product       = "ProFibre 4000R",
231                 .getuid        = DEFAULT_GETUID,
232                 .getprio       = NULL,
233                 .features      = DEFAULT_FEATURES,
234                 .hwhandler     = DEFAULT_HWHANDLER,
235                 .selector      = DEFAULT_SELECTOR,
236                 .pgpolicy      = MULTIBUS,
237                 .pgfailback    = FAILBACK_UNDEF,
238                 .rr_weight     = RR_WEIGHT_NONE,
239                 .no_path_retry = NO_PATH_RETRY_UNDEF,
240                 .minio         = DEFAULT_MINIO,
241                 .checker_name  = READSECTOR0,
242         },
243         {
244                 /* IBM DS4100 / FAStT100 */
245                 .vendor        = "IBM",
246                 .product       = "1742",
247                 .getuid        = DEFAULT_GETUID,
248                 .getprio       = "mpath_prio_tpc /dev/%n",
249                 .features      = DEFAULT_FEATURES,
250                 .hwhandler     = DEFAULT_HWHANDLER,
251                 .selector      = DEFAULT_SELECTOR,
252                 .pgpolicy      = GROUP_BY_PRIO,
253                 .pgfailback    = -FAILBACK_IMMEDIATE,
254                 .rr_weight     = RR_WEIGHT_NONE,
255                 .no_path_retry = NO_PATH_RETRY_UNDEF,
256                 .minio         = DEFAULT_MINIO,
257                 .checker_name  = TUR,
258         },
259         {
260                 /* IBM DS4200 / FAStT200 */
261                 .vendor        = "IBM",
262                 .product       = "3542",
263                 .getuid        = DEFAULT_GETUID,
264                 .getprio       = NULL,
265                 .features      = DEFAULT_FEATURES,
266                 .hwhandler     = DEFAULT_HWHANDLER,
267                 .selector      = DEFAULT_SELECTOR,
268                 .pgpolicy      = GROUP_BY_SERIAL,
269                 .pgfailback    = FAILBACK_UNDEF,
270                 .rr_weight     = RR_WEIGHT_NONE,
271                 .no_path_retry = NO_PATH_RETRY_UNDEF,
272                 .minio         = DEFAULT_MINIO,
273                 .checker_name  = TUR,
274         },
275         {
276                 /* IBM ESS F20 aka Shark */
277                 .vendor        = "IBM",
278                 .product       = "2105{800,F20}",
279                 .getuid        = DEFAULT_GETUID,
280                 .getprio       = NULL,
281                 .features      = "1 queue_if_no_path",
282                 .hwhandler     = DEFAULT_HWHANDLER,
283                 .selector      = DEFAULT_SELECTOR,
284                 .pgpolicy      = GROUP_BY_SERIAL,
285                 .pgfailback    = FAILBACK_UNDEF,
286                 .rr_weight     = RR_WEIGHT_NONE,
287                 .no_path_retry = NO_PATH_RETRY_UNDEF,
288                 .minio         = DEFAULT_MINIO,
289                 .checker_name  = TUR,
290         },
291         {
292                 /* IBM DS6000 / SAN Volume Controller */
293                 .vendor        = "IBM",
294                 .product       = "{1750500,2145}",
295                 .getuid        = DEFAULT_GETUID,
296                 .getprio       = "mpath_prio_alua /dev/%n",
297                 .features      = "1 queue_if_no_path",
298                 .hwhandler     = DEFAULT_HWHANDLER,
299                 .selector      = DEFAULT_SELECTOR,
300                 .pgpolicy      = GROUP_BY_PRIO,
301                 .pgfailback    = -FAILBACK_IMMEDIATE,
302                 .rr_weight     = RR_WEIGHT_NONE,
303                 .no_path_retry = NO_PATH_RETRY_UNDEF,
304                 .minio         = DEFAULT_MINIO,
305                 .checker_name  = TUR,
306         },
307         {
308                 /* IBM DS8000 */
309                 .vendor        = "IBM",
310                 .product       = "2107900",
311                 .getuid        = DEFAULT_GETUID,
312                 .getprio       = NULL,
313                 .features      = "1 queue_if_no_path",
314                 .hwhandler     = DEFAULT_HWHANDLER,
315                 .selector      = DEFAULT_SELECTOR,
316                 .pgpolicy      = GROUP_BY_SERIAL,
317                 .pgfailback    = FAILBACK_UNDEF,
318                 .rr_weight     = RR_WEIGHT_NONE,
319                 .no_path_retry = NO_PATH_RETRY_UNDEF,
320                 .minio         = DEFAULT_MINIO,
321                 .checker_name  = TUR,
322         },
323         {
324                 /* IBM S/390 ECKD DASD */
325                 .vendor        = "IBM",
326                 .product       = "S/390 DASD ECKD",
327                 .getuid        = "/sbin/dasd_id /dev/%n",
328                 .getprio       = NULL,
329                 .features      = DEFAULT_FEATURES,
330                 .hwhandler     = DEFAULT_HWHANDLER,
331                 .selector      = DEFAULT_SELECTOR,
332                 .pgpolicy      = MULTIBUS,
333                 .pgfailback    = FAILBACK_UNDEF,
334                 .rr_weight     = RR_WEIGHT_NONE,
335                 .no_path_retry = NO_PATH_RETRY_UNDEF,
336                 .minio         = DEFAULT_MINIO,
337                 .checker_name  = DIRECTIO,
338         },
339         /*
340          * NETAPP controller family
341          *
342          * Maintainer : Dave Wysochanski
343          * Mail : davidw@netapp.com
344          */
345         {
346                 .vendor        = "NETAPP",
347                 .product       = "LUN.*",
348                 .getuid        = DEFAULT_GETUID,
349                 .getprio       = "mpath_prio_netapp /dev/%n",
350                 .features      = "1 queue_if_no_path",
351                 .hwhandler     = DEFAULT_HWHANDLER,
352                 .selector      = DEFAULT_SELECTOR,
353                 .pgpolicy      = GROUP_BY_PRIO,
354                 .pgfailback    = -FAILBACK_IMMEDIATE,
355                 .rr_weight     = RR_WEIGHT_NONE,
356                 .no_path_retry = NO_PATH_RETRY_UNDEF,
357                 .minio         = 128,
358                 .checker_name  = READSECTOR0,
359         },
360         /*
361          * IBM NSeries (NETAPP) controller family
362          *
363          * Maintainer : Dave Wysochanski
364          * Mail : davidw@netapp.com
365          */
366         {
367                 .vendor        = "IBM",
368                 .product       = "Nseries.*",
369                 .getuid        = DEFAULT_GETUID,
370                 .getprio       = "mpath_prio_netapp /dev/%n",
371                 .features      = "1 queue_if_no_path",
372                 .hwhandler     = DEFAULT_HWHANDLER,
373                 .selector      = DEFAULT_SELECTOR,
374                 .pgpolicy      = GROUP_BY_PRIO,
375                 .pgfailback    = -FAILBACK_IMMEDIATE,
376                 .rr_weight     = RR_WEIGHT_NONE,
377                 .no_path_retry = NO_PATH_RETRY_UNDEF,
378                 .minio         = 128,
379                 .checker_name  = READSECTOR0,
380         },
381         /*
382          * Pillar Data controller family
383          *
384          * Maintainer : Christophe Varoqui
385          * Mail : christophe.varoqui@free.fr
386          */
387         {
388                 .vendor        = "Pillar",
389                 .product       = "Axiom 500",
390                 .getuid        = DEFAULT_GETUID,
391                 .getprio       = "mpath_prio_alua %d",
392                 .features      = DEFAULT_FEATURES,
393                 .hwhandler     = DEFAULT_HWHANDLER,
394                 .selector      = DEFAULT_SELECTOR,
395                 .pgpolicy      = GROUP_BY_PRIO,
396                 .pgfailback    = FAILBACK_UNDEF,
397                 .rr_weight     = RR_WEIGHT_NONE,
398                 .no_path_retry = NO_PATH_RETRY_UNDEF,
399                 .minio         = DEFAULT_MINIO,
400                 .checker_name  = TUR,
401         },
402         /*
403          * SGI arrays
404          *
405          * Maintainer : Christophe Varoqui
406          * Mail : christophe.varoqui@free.fr
407          */
408         {
409                 .vendor        = "SGI",
410                 .product       = "TP9[13]00",
411                 .getuid        = DEFAULT_GETUID,
412                 .getprio       = NULL,
413                 .features      = DEFAULT_FEATURES,
414                 .hwhandler     = DEFAULT_HWHANDLER,
415                 .selector      = DEFAULT_SELECTOR,
416                 .pgpolicy      = MULTIBUS,
417                 .pgfailback    = FAILBACK_UNDEF,
418                 .rr_weight     = RR_WEIGHT_NONE,
419                 .no_path_retry = NO_PATH_RETRY_UNDEF,
420                 .minio         = DEFAULT_MINIO,
421                 .checker_name  = READSECTOR0,
422         },
423         {
424                 .vendor        = "SGI",
425                 .product       = "TP9[45]00",
426                 .getuid        = DEFAULT_GETUID,
427                 .getprio       = "mpath_prio_tpc /dev/%n",
428                 .features      = DEFAULT_FEATURES,
429                 .hwhandler     = DEFAULT_HWHANDLER,
430                 .selector      = DEFAULT_SELECTOR,
431                 .pgpolicy      = GROUP_BY_PRIO,
432                 .pgfailback    = -FAILBACK_IMMEDIATE,
433                 .rr_weight     = RR_WEIGHT_NONE,
434                 .no_path_retry = NO_PATH_RETRY_UNDEF,
435                 .minio         = DEFAULT_MINIO,
436                 .checker_name  = TUR,
437         },
438         /*
439          * STK arrays
440          *
441          * Maintainer : Christophe Varoqui
442          * Mail : christophe.varoqui@free.fr
443          */
444         {
445                 .vendor        = "STK",
446                 .product       = "OPENstorage D280",
447                 .getuid        = DEFAULT_GETUID,
448                 .getprio       = "mpath_prio_tpc /dev/%n",
449                 .features      = DEFAULT_FEATURES,
450                 .hwhandler     = DEFAULT_HWHANDLER,
451                 .selector      = DEFAULT_SELECTOR,
452                 .pgpolicy      = GROUP_BY_PRIO,
453                 .pgfailback    = -FAILBACK_IMMEDIATE,
454                 .rr_weight     = RR_WEIGHT_NONE,
455                 .no_path_retry = NO_PATH_RETRY_UNDEF,
456                 .minio         = DEFAULT_MINIO,
457                 .checker_name  = TUR,
458         },
459         /*
460          * SUN arrays
461          *
462          * Maintainer : Christophe Varoqui
463          * Mail : christophe.varoqui@free.fr
464          */
465         {
466                 .vendor        = "SUN",
467                 .product       = "{StorEdge 3510,T4}",
468                 .getuid        = DEFAULT_GETUID,
469                 .getprio       = NULL,
470                 .features      = DEFAULT_FEATURES,
471                 .hwhandler     = DEFAULT_HWHANDLER,
472                 .selector      = DEFAULT_SELECTOR,
473                 .pgpolicy      = MULTIBUS,
474                 .pgfailback    = FAILBACK_UNDEF,
475                 .rr_weight     = RR_WEIGHT_NONE,
476                 .no_path_retry = NO_PATH_RETRY_UNDEF,
477                 .minio         = DEFAULT_MINIO,
478                 .checker_name  = READSECTOR0,
479         },
480         /*
481          * EOL
482          */
483         {
484                 .vendor        = NULL,
485                 .product       = NULL,
486                 .getuid        = NULL,
487                 .getprio       = NULL,
488                 .features      = NULL,
489                 .hwhandler     = NULL,
490                 .selector      = NULL,
491                 .pgpolicy      = 0,
492                 .pgfailback    = 0,
493                 .rr_weight     = 0,
494                 .no_path_retry = 0,
495                 .minio         = 0,
496                 .checker_name  = NULL,
497         },
498 };
499
500 extern int
501 setup_default_hwtable (vector hw)
502 {
503         int r = 0;
504         struct hwentry * hwe = default_hw;
505
506         while (hwe->vendor) {
507                 hwe->checker = checker_lookup(hwe->checker_name);
508                 r += store_hwe(hw, hwe);
509                 hwe++;
510         }
511         return r;
512 }