Add alias_prefix to get multipath names based on storage type
[multipath-tools/.git] / libmultipath / propsel.c
1 /*
2  * Copyright (c) 2004, 2005 Christophe Varoqui
3  * Copyright (c) 2005 Benjamin Marzinski, Redhat
4  * Copyright (c) 2005 Kiyoshi Ueda, NEC
5  */
6 #include <stdio.h>
7
8 #include "checkers.h"
9 #include "memory.h"
10 #include "vector.h"
11 #include "structs.h"
12 #include "config.h"
13 #include "debug.h"
14 #include "pgpolicies.h"
15 #include "alias.h"
16 #include "defaults.h"
17 #include "devmapper.h"
18 #include "prio.h"
19
20 pgpolicyfn *pgpolicies[] = {
21         NULL,
22         one_path_per_group,
23         one_group,
24         group_by_serial,
25         group_by_prio,
26         group_by_node_name
27 };
28
29 extern int
30 select_mode (struct multipath *mp)
31 {
32         if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_MODE))) {
33                 mp->attribute_flags |= (1 << ATTR_MODE);
34                 mp->mode = mp->mpe->mode;
35                 condlog(3, "mode = 0%o (LUN setting)", mp->mode);
36         }
37         else if (conf->attribute_flags & (1 << ATTR_MODE)) {
38                 mp->attribute_flags |= (1 << ATTR_MODE);
39                 mp->mode = conf->mode;
40                 condlog(3, "mode = 0%o (config file default)", mp->mode);
41         }
42         else
43                 mp->attribute_flags &= ~(1 << ATTR_MODE);
44         return 0;
45 }
46
47 extern int
48 select_uid (struct multipath *mp)
49 {
50         if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_UID))) {
51                 mp->attribute_flags |= (1 << ATTR_UID);
52                 mp->uid = mp->mpe->uid;
53                 condlog(3, "uid = %u (LUN setting)", mp->uid);
54         }
55         else if (conf->attribute_flags & (1 << ATTR_UID)) {
56                 mp->attribute_flags |= (1 << ATTR_UID);
57                 mp->uid = conf->uid;
58                 condlog(3, "uid = %u (config file default)", mp->uid);
59         }
60         else
61                 mp->attribute_flags &= ~(1 << ATTR_UID);
62         return 0;
63 }
64
65 extern int
66 select_gid (struct multipath *mp)
67 {
68         if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_GID))) {
69                 mp->attribute_flags |= (1 << ATTR_GID);
70                 mp->gid = mp->mpe->gid;
71                 condlog(3, "gid = %u (LUN setting)", mp->gid);
72         }
73         else if (conf->attribute_flags & (1 << ATTR_GID)) {
74                 mp->attribute_flags |= (1 << ATTR_GID);
75                 mp->gid = conf->gid;
76                 condlog(3, "gid = %u (config file default)", mp->gid);
77         }
78         else
79                 mp->attribute_flags &= ~(1 << ATTR_GID);
80         return 0;
81 }
82
83 /*
84  * selectors :
85  * traverse the configuration layers from most specific to most generic
86  * stop at first explicit setting found
87  */
88 extern int
89 select_rr_weight (struct multipath * mp)
90 {
91         if (mp->mpe && mp->mpe->rr_weight) {
92                 mp->rr_weight = mp->mpe->rr_weight;
93                 condlog(3, "%s: rr_weight = %i (LUN setting)",
94                         mp->alias, mp->rr_weight);
95                 return 0;
96         }
97         if (mp->hwe && mp->hwe->rr_weight) {
98                 mp->rr_weight = mp->hwe->rr_weight;
99                 condlog(3, "%s: rr_weight = %i (controller setting)",
100                         mp->alias, mp->rr_weight);
101                 return 0;
102         }
103         if (conf->rr_weight) {
104                 mp->rr_weight = conf->rr_weight;
105                 condlog(3, "%s: rr_weight = %i (config file default)",
106                         mp->alias, mp->rr_weight);
107                 return 0;
108         }
109         mp->rr_weight = RR_WEIGHT_NONE;
110         condlog(3, "%s: rr_weight = %i (internal default)",
111                 mp->alias, mp->rr_weight);
112         return 0;
113 }
114
115 extern int
116 select_pgfailback (struct multipath * mp)
117 {
118         if (mp->mpe && mp->mpe->pgfailback != FAILBACK_UNDEF) {
119                 mp->pgfailback = mp->mpe->pgfailback;
120                 condlog(3, "%s: pgfailback = %i (LUN setting)",
121                         mp->alias, mp->pgfailback);
122                 return 0;
123         }
124         if (mp->hwe && mp->hwe->pgfailback != FAILBACK_UNDEF) {
125                 mp->pgfailback = mp->hwe->pgfailback;
126                 condlog(3, "%s: pgfailback = %i (controller setting)",
127                         mp->alias, mp->pgfailback);
128                 return 0;
129         }
130         if (conf->pgfailback != FAILBACK_UNDEF) {
131                 mp->pgfailback = conf->pgfailback;
132                 condlog(3, "%s: pgfailback = %i (config file default)",
133                         mp->alias, mp->pgfailback);
134                 return 0;
135         }
136         mp->pgfailback = DEFAULT_FAILBACK;
137         condlog(3, "%s: pgfailover = %i (internal default)",
138                 mp->alias, mp->pgfailback);
139         return 0;
140 }
141
142 extern int
143 select_pgpolicy (struct multipath * mp)
144 {
145         char pgpolicy_name[POLICY_NAME_SIZE];
146
147         if (conf->pgpolicy_flag > 0) {
148                 mp->pgpolicy = conf->pgpolicy_flag;
149                 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
150                 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
151                                   mp->pgpolicy);
152                 condlog(3, "%s: pgpolicy = %s (cmd line flag)",
153                         mp->alias, pgpolicy_name);
154                 return 0;
155         }
156         if (mp->mpe && mp->mpe->pgpolicy > 0) {
157                 mp->pgpolicy = mp->mpe->pgpolicy;
158                 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
159                 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
160                                   mp->pgpolicy);
161                 condlog(3, "%s: pgpolicy = %s (LUN setting)",
162                         mp->alias, pgpolicy_name);
163                 return 0;
164         }
165         if (mp->hwe && mp->hwe->pgpolicy > 0) {
166                 mp->pgpolicy = mp->hwe->pgpolicy;
167                 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
168                 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
169                                   mp->pgpolicy);
170                 condlog(3, "%s: pgpolicy = %s (controller setting)",
171                         mp->alias, pgpolicy_name);
172                 return 0;
173         }
174         if (conf->pgpolicy > 0) {
175                 mp->pgpolicy = conf->pgpolicy;
176                 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
177                 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
178                                   mp->pgpolicy);
179                 condlog(3, "%s: pgpolicy = %s (config file default)",
180                         mp->alias, pgpolicy_name);
181                 return 0;
182         }
183         mp->pgpolicy = DEFAULT_PGPOLICY;
184         mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
185         get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE, mp->pgpolicy);
186         condlog(3, "%s: pgpolicy = %s (internal default)",
187                 mp->alias, pgpolicy_name);
188         return 0;
189 }
190
191 extern int
192 select_selector (struct multipath * mp)
193 {
194         if (mp->mpe && mp->mpe->selector) {
195                 mp->selector = mp->mpe->selector;
196                 condlog(3, "%s: selector = %s (LUN setting)",
197                         mp->alias, mp->selector);
198                 return 0;
199         }
200         if (mp->hwe && mp->hwe->selector) {
201                 mp->selector = mp->hwe->selector;
202                 condlog(3, "%s: selector = %s (controller setting)",
203                         mp->alias, mp->selector);
204                 return 0;
205         }
206         if (conf->selector) {
207                 mp->selector = conf->selector;
208                 condlog(3, "%s: selector = %s (config file default)",
209                         mp->alias, mp->selector);
210                 return 0;
211         }
212         mp->selector = set_default(DEFAULT_SELECTOR);
213         condlog(3, "%s: selector = %s (internal default)",
214                 mp->alias, mp->selector);
215         return 0;
216 }
217
218 static void
219 select_alias_prefix (struct multipath * mp)
220 {
221         if (mp->hwe && mp->hwe->alias_prefix) {
222                 mp->alias_prefix = mp->hwe->alias_prefix;
223                 condlog(3, "%s: alias_prefix = %s (controller setting)",
224                         mp->wwid, mp->alias_prefix);
225                 return;
226         }
227         if (conf->alias_prefix) {
228                 mp->alias_prefix = conf->alias_prefix;
229                 condlog(3, "%s: alias_prefix = %s (config file default)",
230                         mp->wwid, mp->alias_prefix);
231                 return;
232         }
233         mp->alias_prefix = set_default(DEFAULT_ALIAS_PREFIX);
234         condlog(3, "%s: alias_prefix = %s (internal default)",
235                 mp->wwid, mp->alias_prefix);
236 }
237
238 extern int
239 select_alias (struct multipath * mp)
240 {
241         if (mp->mpe && mp->mpe->alias)
242                 mp->alias = mp->mpe->alias;
243         else {
244                 mp->alias = NULL;
245                 if (conf->user_friendly_names) {
246                         select_alias_prefix(mp);
247                         mp->alias = get_user_friendly_alias(mp->wwid,
248                                         conf->bindings_file, mp->alias_prefix);
249                 }
250                 if (mp->alias == NULL){
251                         char *alias;
252                         if ((alias = MALLOC(WWID_SIZE)) != NULL){
253                                 if (dm_get_name(mp->wwid, alias) == 1)
254                                         mp->alias = alias;
255                                 else
256                                         FREE(alias);
257                         }
258                 }
259                 if (mp->alias == NULL)
260                         mp->alias = mp->wwid;
261         }
262
263         return 0;
264 }
265
266 extern int
267 select_features (struct multipath * mp)
268 {
269         if (mp->hwe && mp->hwe->features) {
270                 mp->features = mp->hwe->features;
271                 condlog(3, "%s: features = %s (controller setting)",
272                         mp->alias, mp->features);
273                 return 0;
274         }
275         if (conf->features) {
276                 mp->features = conf->features;
277                 condlog(3, "%s: features = %s (config file default)",
278                         mp->alias, mp->features);
279                 return 0;
280         }
281         mp->features = set_default(DEFAULT_FEATURES);
282         condlog(3, "%s: features = %s (internal default)",
283                 mp->alias, mp->features);
284         return 0;
285 }
286
287 extern int
288 select_hwhandler (struct multipath * mp)
289 {
290         if (mp->hwe && mp->hwe->hwhandler) {
291                 mp->hwhandler = mp->hwe->hwhandler;
292                 condlog(3, "%s: hwhandler = %s (controller setting)",
293                         mp->alias, mp->hwhandler);
294                 return 0;
295         }
296         if (conf->hwhandler) {
297                 mp->hwhandler = conf->hwhandler;
298                 condlog(3, "%s: hwhandler = %s (config file default)",
299                         mp->alias, mp->hwhandler);
300                 return 0;
301         }
302         mp->hwhandler = set_default(DEFAULT_HWHANDLER);
303         condlog(3, "%s: hwhandler = %s (internal default)",
304                 mp->alias, mp->hwhandler);
305         return 0;
306 }
307
308 extern int
309 select_checker(struct path *pp)
310 {
311         struct checker * c = &pp->checker;
312
313         if (pp->hwe && pp->hwe->checker_name) {
314                 checker_get(c, pp->hwe->checker_name);
315                 condlog(3, "%s: path checker = %s (controller setting)",
316                         pp->dev, checker_name(c));
317                 return 0;
318         }
319         if (conf->checker_name) {
320                 checker_get(c, conf->checker_name);
321                 condlog(3, "%s: path checker = %s (config file default)",
322                         pp->dev, checker_name(c));
323                 return 0;
324         }
325         checker_get(c, DEFAULT_CHECKER);
326         condlog(3, "%s: path checker = %s (internal default)",
327                 pp->dev, checker_name(c));
328         return 0;
329 }
330
331 extern int
332 select_getuid (struct path * pp)
333 {
334         if (pp->hwe && pp->hwe->getuid) {
335                 pp->getuid = pp->hwe->getuid;
336                 condlog(3, "%s: getuid = %s (controller setting)",
337                         pp->dev, pp->getuid);
338                 return 0;
339         }
340         if (conf->getuid) {
341                 pp->getuid = conf->getuid;
342                 condlog(3, "%s: getuid = %s (config file default)",
343                         pp->dev, pp->getuid);
344                 return 0;
345         }
346         pp->getuid = STRDUP(DEFAULT_GETUID);
347         condlog(3, "%s: getuid = %s (internal default)",
348                 pp->dev, pp->getuid);
349         return 0;
350 }
351
352 extern int
353 select_prio (struct path * pp)
354 {
355         if (pp->hwe && pp->hwe->prio_name) {
356                 pp->prio = prio_lookup(pp->hwe->prio_name);
357                 prio_set_args(pp->prio, pp->hwe->prio_args);
358                 condlog(3, "%s: prio = %s (controller setting)",
359                         pp->dev, pp->hwe->prio_name);
360                 condlog(3, "%s: prio args = %s (controller setting)",
361                         pp->dev, pp->hwe->prio_args);
362                 return 0;
363         }
364         if (conf->prio_name) {
365                 pp->prio = prio_lookup(conf->prio_name);
366                 prio_set_args(pp->prio, conf->prio_args);
367                 condlog(3, "%s: prio = %s (config file default)",
368                         pp->dev, conf->prio_name);
369                 condlog(3, "%s: prio args = %s (config file default)",
370                         pp->dev, conf->prio_args);
371                 return 0;
372         }
373         pp->prio = prio_lookup(DEFAULT_PRIO);
374         prio_set_args(pp->prio, DEFAULT_PRIO_ARGS);
375         condlog(3, "%s: prio = %s (internal default)",
376                 pp->dev, DEFAULT_PRIO);
377         condlog(3, "%s: prio = %s (internal default)",
378                 pp->dev, DEFAULT_PRIO_ARGS);
379         return 0;
380 }
381
382 extern int
383 select_no_path_retry(struct multipath *mp)
384 {
385         if (mp->flush_on_last_del == FLUSH_IN_PROGRESS) {
386                 condlog(0, "flush_on_last_del in progress");
387                 mp->no_path_retry = NO_PATH_RETRY_FAIL;
388         }
389         if (mp->mpe && mp->mpe->no_path_retry != NO_PATH_RETRY_UNDEF) {
390                 mp->no_path_retry = mp->mpe->no_path_retry;
391                 condlog(3, "%s: no_path_retry = %i (multipath setting)",
392                         mp->alias, mp->no_path_retry);
393                 return 0;
394         }
395         if (mp->hwe && mp->hwe->no_path_retry != NO_PATH_RETRY_UNDEF) {
396                 mp->no_path_retry = mp->hwe->no_path_retry;
397                 condlog(3, "%s: no_path_retry = %i (controller setting)",
398                         mp->alias, mp->no_path_retry);
399                 return 0;
400         }
401         if (conf->no_path_retry != NO_PATH_RETRY_UNDEF) {
402                 mp->no_path_retry = conf->no_path_retry;
403                 condlog(3, "%s: no_path_retry = %i (config file default)",
404                         mp->alias, mp->no_path_retry);
405                 return 0;
406         }
407         mp->no_path_retry = NO_PATH_RETRY_UNDEF;
408         condlog(3, "%s: no_path_retry = NONE (internal default)",
409                 mp->alias);
410         return 0;
411 }
412
413 extern int
414 select_minio (struct multipath * mp)
415 {
416         if (mp->mpe && mp->mpe->minio) {
417                 mp->minio = mp->mpe->minio;
418                 condlog(3, "%s: minio = %i (LUN setting)",
419                         mp->alias, mp->minio);
420                 return 0;
421         }
422         if (mp->hwe && mp->hwe->minio) {
423                 mp->minio = mp->hwe->minio;
424                 condlog(3, "%s: minio = %i (controller setting)",
425                         mp->alias, mp->minio);
426                 return 0;
427         }
428         if (conf->minio) {
429                 mp->minio = conf->minio;
430                 condlog(3, "%s: minio = %i (config file default)",
431                         mp->alias, mp->minio);
432                 return 0;
433         }
434         mp->minio = DEFAULT_MINIO;
435         condlog(3, "%s: minio = %i (internal default)",
436                 mp->alias, mp->minio);
437         return 0;
438 }
439
440 extern int
441 select_pg_timeout(struct multipath *mp)
442 {
443         if (mp->mpe && mp->mpe->pg_timeout != PGTIMEOUT_UNDEF) {
444                 mp->pg_timeout = mp->mpe->pg_timeout;
445                 if (mp->pg_timeout > 0)
446                         condlog(3, "%s: pg_timeout = %d (multipath setting)",
447                                 mp->alias, mp->pg_timeout);
448                 else
449                         condlog(3, "%s: pg_timeout = NONE (multipath setting)",
450                                 mp->alias);
451                 return 0;
452         }
453         if (mp->hwe && mp->hwe->pg_timeout != PGTIMEOUT_UNDEF) {
454                 mp->pg_timeout = mp->hwe->pg_timeout;
455                 if (mp->pg_timeout > 0)
456                         condlog(3, "%s: pg_timeout = %d (controller setting)",
457                                 mp->alias, mp->pg_timeout);
458                 else
459                         condlog(3, "%s: pg_timeout = NONE (controller setting)",
460                                 mp->alias);
461                 return 0;
462         }
463         if (conf->pg_timeout != PGTIMEOUT_UNDEF) {
464                 mp->pg_timeout = conf->pg_timeout;
465                 if (mp->pg_timeout > 0)
466                         condlog(3, "%s: pg_timeout = %d (config file default)",
467                                 mp->alias, mp->pg_timeout);
468                 else
469                         condlog(3,
470                                 "%s: pg_timeout = NONE (config file default)",
471                                 mp->alias);
472                 return 0;
473         }
474         mp->pg_timeout = PGTIMEOUT_UNDEF;
475         condlog(3, "pg_timeout = NONE (internal default)");
476         return 0;
477 }
478
479 extern int
480 select_fast_io_fail(struct multipath *mp)
481 {
482         if (mp->hwe && mp->hwe->fast_io_fail) {
483                 mp->fast_io_fail = mp->hwe->fast_io_fail;
484                 if (mp->fast_io_fail == -1)
485                         condlog(3, "%s: fast_io_fail_tmo = off (controller default)", mp->alias);
486                 else
487                         condlog(3, "%s: fast_io_fail_tmo = %d (controller default)", mp->alias, mp->fast_io_fail);
488                 return 0;
489         }
490         if (conf->fast_io_fail) {
491                 mp->fast_io_fail = conf->fast_io_fail;
492                 if (mp->fast_io_fail == -1)
493                         condlog(3, "%s: fast_io_fail_tmo = off (config file default)", mp->alias);
494                 else
495                         condlog(3, "%s: fast_io_fail_tmo = %d (config file default)", mp->alias, mp->fast_io_fail);
496                 return 0;
497         }
498         mp->fast_io_fail = 0;
499         return 0;
500 }
501
502 extern int
503 select_dev_loss(struct multipath *mp)
504 {
505         if (mp->hwe && mp->hwe->dev_loss) {
506                 mp->dev_loss = mp->hwe->dev_loss;
507                 condlog(3, "%s: dev_loss_tmo = %u (controller default)",
508                         mp->alias, mp->dev_loss);
509                 return 0;
510         }
511         if (conf->dev_loss) {
512                 mp->dev_loss = conf->dev_loss;
513                 condlog(3, "%s: dev_loss_tmo = %u (config file default)",
514                         mp->alias, mp->dev_loss);
515                 return 0;
516         }
517         mp->dev_loss = 0;
518         return 0;
519 }
520
521 extern int
522 select_flush_on_last_del(struct multipath *mp)
523 {
524         if (mp->flush_on_last_del == FLUSH_IN_PROGRESS)
525                 return 0;
526         if (mp->mpe && mp->mpe->flush_on_last_del != FLUSH_UNDEF) {
527                 mp->flush_on_last_del = mp->mpe->flush_on_last_del;
528                 condlog(3, "flush_on_last_del = %i (multipath setting)",
529                                 mp->flush_on_last_del);
530                 return 0;
531         }
532         if (mp->hwe && mp->hwe->flush_on_last_del != FLUSH_UNDEF) {
533                 mp->flush_on_last_del = mp->hwe->flush_on_last_del;
534                 condlog(3, "flush_on_last_del = %i (controler setting)",
535                                 mp->flush_on_last_del);
536                 return 0;
537         }
538         if (conf->flush_on_last_del != FLUSH_UNDEF) {
539                 mp->flush_on_last_del = conf->flush_on_last_del;
540                 condlog(3, "flush_on_last_del = %i (config file default)",
541                                 mp->flush_on_last_del);
542                 return 0;
543         }
544         mp->flush_on_last_del = FLUSH_UNDEF;
545         condlog(3, "flush_on_last_del = DISABLED (internal default)");
546         return 0;
547 }