[libmultipath] Fixup hwtable regexp
[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      = MULTIBUS,
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       = "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 Netfinity Fibre Channel RAID Controller Unit */
261                 .vendor        = "IBM",
262                 .product       = "3526",
263                 .getuid        = DEFAULT_GETUID,
264                 .getprio       = "/sbin/mpath_prio_tpc /dev/%n",
265                 .features      = DEFAULT_FEATURES,
266                 .hwhandler     = DEFAULT_HWHANDLER,
267                 .selector      = DEFAULT_SELECTOR,
268                 .pgpolicy      = GROUP_BY_PRIO,
269                 .pgfailback    = -FAILBACK_IMMEDIATE,
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 DS4200 / FAStT200 */
277                 .vendor        = "IBM",
278                 .product       = "3542",
279                 .getuid        = DEFAULT_GETUID,
280                 .getprio       = NULL,
281                 .features      = DEFAULT_FEATURES,
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 ESS F20 aka Shark */
293                 .vendor        = "IBM",
294                 .product       = "2105(800|F20)",
295                 .getuid        = DEFAULT_GETUID,
296                 .getprio       = NULL,
297                 .features      = "1 queue_if_no_path",
298                 .hwhandler     = DEFAULT_HWHANDLER,
299                 .selector      = DEFAULT_SELECTOR,
300                 .pgpolicy      = GROUP_BY_SERIAL,
301                 .pgfailback    = FAILBACK_UNDEF,
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 DS6000 */
309                 .vendor        = "IBM",
310                 .product       = "1750500",
311                 .getuid        = DEFAULT_GETUID,
312                 .getprio       = "mpath_prio_alua /dev/%n",
313                 .features      = "1 queue_if_no_path",
314                 .hwhandler     = DEFAULT_HWHANDLER,
315                 .selector      = DEFAULT_SELECTOR,
316                 .pgpolicy      = GROUP_BY_PRIO,
317                 .pgfailback    = -FAILBACK_IMMEDIATE,
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 DS8000 */
325                 .vendor        = "IBM",
326                 .product       = "2107900",
327                 .getuid        = DEFAULT_GETUID,
328                 .getprio       = NULL,
329                 .features      = "1 queue_if_no_path",
330                 .hwhandler     = DEFAULT_HWHANDLER,
331                 .selector      = DEFAULT_SELECTOR,
332                 .pgpolicy      = GROUP_BY_SERIAL,
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  = TUR,
338         },
339         {
340                 /* IBM SAN Volume Controller */
341                 .vendor        = "IBM",
342                 .product       = "2145",
343                 .getuid        = DEFAULT_GETUID,
344                 .getprio       = "mpath_prio_alua /dev/%n",
345                 .features      = "1 queue_if_no_path",
346                 .hwhandler     = DEFAULT_HWHANDLER,
347                 .selector      = DEFAULT_SELECTOR,
348                 .pgpolicy      = GROUP_BY_PRIO,
349                 .pgfailback    = -FAILBACK_IMMEDIATE,
350                 .rr_weight     = RR_WEIGHT_NONE,
351                 .no_path_retry = NO_PATH_RETRY_UNDEF,
352                 .minio         = DEFAULT_MINIO,
353                 .checker_name  = TUR,
354         },
355         {
356                 /* IBM S/390 ECKD DASD */
357                 .vendor        = "IBM",
358                 .product       = "S/390 DASD ECKD",
359                 .bl_product       = "S/390.*",
360                 .getuid        = "/sbin/dasd_id /dev/%n",
361                 .getprio       = NULL,
362                 .features      = DEFAULT_FEATURES,
363                 .hwhandler     = DEFAULT_HWHANDLER,
364                 .selector      = DEFAULT_SELECTOR,
365                 .pgpolicy      = MULTIBUS,
366                 .pgfailback    = FAILBACK_UNDEF,
367                 .rr_weight     = RR_WEIGHT_NONE,
368                 .no_path_retry = NO_PATH_RETRY_UNDEF,
369                 .minio         = DEFAULT_MINIO,
370                 .checker_name  = DIRECTIO,
371         },
372         /*
373          * NETAPP controller family
374          *
375          * Maintainer : Dave Wysochanski
376          * Mail : davidw@netapp.com
377          */
378         {
379                 .vendor        = "NETAPP",
380                 .product       = "LUN.*",
381                 .getuid        = DEFAULT_GETUID,
382                 .getprio       = "mpath_prio_netapp /dev/%n",
383                 .features      = "1 queue_if_no_path",
384                 .hwhandler     = DEFAULT_HWHANDLER,
385                 .selector      = DEFAULT_SELECTOR,
386                 .pgpolicy      = GROUP_BY_PRIO,
387                 .pgfailback    = -FAILBACK_IMMEDIATE,
388                 .rr_weight     = RR_WEIGHT_NONE,
389                 .no_path_retry = NO_PATH_RETRY_UNDEF,
390                 .minio         = 128,
391                 .checker_name  = READSECTOR0,
392         },
393         /*
394          * IBM NSeries (NETAPP) controller family
395          *
396          * Maintainer : Dave Wysochanski
397          * Mail : davidw@netapp.com
398          */
399         {
400                 .vendor        = "IBM",
401                 .product       = "Nseries.*",
402                 .getuid        = DEFAULT_GETUID,
403                 .getprio       = "mpath_prio_netapp /dev/%n",
404                 .features      = "1 queue_if_no_path",
405                 .hwhandler     = DEFAULT_HWHANDLER,
406                 .selector      = DEFAULT_SELECTOR,
407                 .pgpolicy      = GROUP_BY_PRIO,
408                 .pgfailback    = -FAILBACK_IMMEDIATE,
409                 .rr_weight     = RR_WEIGHT_NONE,
410                 .no_path_retry = NO_PATH_RETRY_UNDEF,
411                 .minio         = 128,
412                 .checker_name  = READSECTOR0,
413         },
414         /*
415          * Pillar Data controller family
416          *
417          * Maintainer : Christophe Varoqui
418          * Mail : christophe.varoqui@free.fr
419          */
420         {
421                 .vendor        = "Pillar",
422                 .product       = "Axiom 500",
423                 .getuid        = DEFAULT_GETUID,
424                 .getprio       = "mpath_prio_alua %d",
425                 .features      = DEFAULT_FEATURES,
426                 .hwhandler     = DEFAULT_HWHANDLER,
427                 .selector      = DEFAULT_SELECTOR,
428                 .pgpolicy      = GROUP_BY_PRIO,
429                 .pgfailback    = FAILBACK_UNDEF,
430                 .rr_weight     = RR_WEIGHT_NONE,
431                 .no_path_retry = NO_PATH_RETRY_UNDEF,
432                 .minio         = DEFAULT_MINIO,
433                 .checker_name  = TUR,
434         },
435         /*
436          * SGI arrays
437          *
438          * Maintainer : Christophe Varoqui
439          * Mail : christophe.varoqui@free.fr
440          */
441         {
442                 .vendor        = "SGI",
443                 .product       = "TP9[13]00",
444                 .getuid        = DEFAULT_GETUID,
445                 .getprio       = NULL,
446                 .features      = DEFAULT_FEATURES,
447                 .hwhandler     = DEFAULT_HWHANDLER,
448                 .selector      = DEFAULT_SELECTOR,
449                 .pgpolicy      = MULTIBUS,
450                 .pgfailback    = FAILBACK_UNDEF,
451                 .rr_weight     = RR_WEIGHT_NONE,
452                 .no_path_retry = NO_PATH_RETRY_UNDEF,
453                 .minio         = DEFAULT_MINIO,
454                 .checker_name  = READSECTOR0,
455         },
456         {
457                 .vendor        = "SGI",
458                 .product       = "TP9[45]00",
459                 .getuid        = DEFAULT_GETUID,
460                 .getprio       = "mpath_prio_tpc /dev/%n",
461                 .features      = DEFAULT_FEATURES,
462                 .hwhandler     = DEFAULT_HWHANDLER,
463                 .selector      = DEFAULT_SELECTOR,
464                 .pgpolicy      = GROUP_BY_PRIO,
465                 .pgfailback    = -FAILBACK_IMMEDIATE,
466                 .rr_weight     = RR_WEIGHT_NONE,
467                 .no_path_retry = NO_PATH_RETRY_UNDEF,
468                 .minio         = DEFAULT_MINIO,
469                 .checker_name  = TUR,
470         },
471         /*
472          * STK arrays
473          *
474          * Maintainer : Christophe Varoqui
475          * Mail : christophe.varoqui@free.fr
476          */
477         {
478                 .vendor        = "STK",
479                 .product       = "OPENstorage D280",
480                 .getuid        = DEFAULT_GETUID,
481                 .getprio       = "mpath_prio_tpc /dev/%n",
482                 .features      = DEFAULT_FEATURES,
483                 .hwhandler     = DEFAULT_HWHANDLER,
484                 .selector      = DEFAULT_SELECTOR,
485                 .pgpolicy      = GROUP_BY_PRIO,
486                 .pgfailback    = -FAILBACK_IMMEDIATE,
487                 .rr_weight     = RR_WEIGHT_NONE,
488                 .no_path_retry = NO_PATH_RETRY_UNDEF,
489                 .minio         = DEFAULT_MINIO,
490                 .checker_name  = TUR,
491         },
492         /*
493          * SUN arrays
494          *
495          * Maintainer : Christophe Varoqui
496          * Mail : christophe.varoqui@free.fr
497          */
498         {
499                 .vendor        = "SUN",
500                 .product       = "(StorEdge 3510|T4)",
501                 .getuid        = DEFAULT_GETUID,
502                 .getprio       = NULL,
503                 .features      = DEFAULT_FEATURES,
504                 .hwhandler     = DEFAULT_HWHANDLER,
505                 .selector      = DEFAULT_SELECTOR,
506                 .pgpolicy      = MULTIBUS,
507                 .pgfailback    = FAILBACK_UNDEF,
508                 .rr_weight     = RR_WEIGHT_NONE,
509                 .no_path_retry = NO_PATH_RETRY_UNDEF,
510                 .minio         = DEFAULT_MINIO,
511                 .checker_name  = READSECTOR0,
512         },
513         /*
514          * EOL
515          */
516         {
517                 .vendor        = NULL,
518                 .product       = NULL,
519                 .getuid        = NULL,
520                 .getprio       = NULL,
521                 .features      = NULL,
522                 .hwhandler     = NULL,
523                 .selector      = NULL,
524                 .pgpolicy      = 0,
525                 .pgfailback    = 0,
526                 .rr_weight     = 0,
527                 .no_path_retry = 0,
528                 .minio         = 0,
529                 .checker_name  = NULL,
530         },
531 };
532
533 extern int
534 setup_default_hwtable (vector hw)
535 {
536         int r = 0;
537         struct hwentry * hwe = default_hw;
538
539         while (hwe->vendor) {
540                 hwe->checker = checker_lookup(hwe->checker_name);
541                 r += store_hwe(hw, hwe);
542                 hwe++;
543         }
544         return r;
545 }