2 * Copyright (c) 2004, 2005 Christophe Varoqui
3 * Copyright (c) 2005 Benjamin Marzinski, Redhat
4 * Copyright (c) 2005 Kiyoshi Ueda, NEC
14 #include "pgpolicies.h"
17 #include "devmapper.h"
19 #include "discovery.h"
22 pgpolicyfn *pgpolicies[] = {
32 select_mode (struct multipath *mp)
34 if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_MODE))) {
35 mp->attribute_flags |= (1 << ATTR_MODE);
36 mp->mode = mp->mpe->mode;
37 condlog(3, "mode = 0%o (LUN setting)", mp->mode);
39 else if (conf->attribute_flags & (1 << ATTR_MODE)) {
40 mp->attribute_flags |= (1 << ATTR_MODE);
41 mp->mode = conf->mode;
42 condlog(3, "mode = 0%o (config file default)", mp->mode);
45 mp->attribute_flags &= ~(1 << ATTR_MODE);
50 select_uid (struct multipath *mp)
52 if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_UID))) {
53 mp->attribute_flags |= (1 << ATTR_UID);
54 mp->uid = mp->mpe->uid;
55 condlog(3, "uid = %u (LUN setting)", mp->uid);
57 else if (conf->attribute_flags & (1 << ATTR_UID)) {
58 mp->attribute_flags |= (1 << ATTR_UID);
60 condlog(3, "uid = %u (config file default)", mp->uid);
63 mp->attribute_flags &= ~(1 << ATTR_UID);
68 select_gid (struct multipath *mp)
70 if (mp->mpe && (mp->mpe->attribute_flags & (1 << ATTR_GID))) {
71 mp->attribute_flags |= (1 << ATTR_GID);
72 mp->gid = mp->mpe->gid;
73 condlog(3, "gid = %u (LUN setting)", mp->gid);
75 else if (conf->attribute_flags & (1 << ATTR_GID)) {
76 mp->attribute_flags |= (1 << ATTR_GID);
78 condlog(3, "gid = %u (config file default)", mp->gid);
81 mp->attribute_flags &= ~(1 << ATTR_GID);
87 * traverse the configuration layers from most specific to most generic
88 * stop at first explicit setting found
91 select_rr_weight (struct multipath * mp)
93 if (mp->mpe && mp->mpe->rr_weight) {
94 mp->rr_weight = mp->mpe->rr_weight;
95 condlog(3, "%s: rr_weight = %i (LUN setting)",
96 mp->alias, mp->rr_weight);
99 if (mp->hwe && mp->hwe->rr_weight) {
100 mp->rr_weight = mp->hwe->rr_weight;
101 condlog(3, "%s: rr_weight = %i (controller setting)",
102 mp->alias, mp->rr_weight);
105 if (conf->rr_weight) {
106 mp->rr_weight = conf->rr_weight;
107 condlog(3, "%s: rr_weight = %i (config file default)",
108 mp->alias, mp->rr_weight);
111 mp->rr_weight = RR_WEIGHT_NONE;
112 condlog(3, "%s: rr_weight = %i (internal default)",
113 mp->alias, mp->rr_weight);
118 select_pgfailback (struct multipath * mp)
120 if (mp->mpe && mp->mpe->pgfailback != FAILBACK_UNDEF) {
121 mp->pgfailback = mp->mpe->pgfailback;
122 condlog(3, "%s: pgfailback = %i (LUN setting)",
123 mp->alias, mp->pgfailback);
126 if (mp->hwe && mp->hwe->pgfailback != FAILBACK_UNDEF) {
127 mp->pgfailback = mp->hwe->pgfailback;
128 condlog(3, "%s: pgfailback = %i (controller setting)",
129 mp->alias, mp->pgfailback);
132 if (conf->pgfailback != FAILBACK_UNDEF) {
133 mp->pgfailback = conf->pgfailback;
134 condlog(3, "%s: pgfailback = %i (config file default)",
135 mp->alias, mp->pgfailback);
138 mp->pgfailback = DEFAULT_FAILBACK;
139 condlog(3, "%s: pgfailover = %i (internal default)",
140 mp->alias, mp->pgfailback);
145 select_pgpolicy (struct multipath * mp)
147 char pgpolicy_name[POLICY_NAME_SIZE];
149 if (conf->pgpolicy_flag > 0) {
150 mp->pgpolicy = conf->pgpolicy_flag;
151 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
152 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
154 condlog(3, "%s: pgpolicy = %s (cmd line flag)",
155 mp->alias, pgpolicy_name);
158 if (mp->mpe && mp->mpe->pgpolicy > 0) {
159 mp->pgpolicy = mp->mpe->pgpolicy;
160 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
161 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
163 condlog(3, "%s: pgpolicy = %s (LUN setting)",
164 mp->alias, pgpolicy_name);
167 if (mp->hwe && mp->hwe->pgpolicy > 0) {
168 mp->pgpolicy = mp->hwe->pgpolicy;
169 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
170 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
172 condlog(3, "%s: pgpolicy = %s (controller setting)",
173 mp->alias, pgpolicy_name);
176 if (conf->pgpolicy > 0) {
177 mp->pgpolicy = conf->pgpolicy;
178 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
179 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE,
181 condlog(3, "%s: pgpolicy = %s (config file default)",
182 mp->alias, pgpolicy_name);
185 mp->pgpolicy = DEFAULT_PGPOLICY;
186 mp->pgpolicyfn = pgpolicies[mp->pgpolicy];
187 get_pgpolicy_name(pgpolicy_name, POLICY_NAME_SIZE, mp->pgpolicy);
188 condlog(3, "%s: pgpolicy = %s (internal default)",
189 mp->alias, pgpolicy_name);
194 select_selector (struct multipath * mp)
196 if (mp->mpe && mp->mpe->selector) {
197 mp->selector = mp->mpe->selector;
198 condlog(3, "%s: selector = %s (LUN setting)",
199 mp->alias, mp->selector);
202 if (mp->hwe && mp->hwe->selector) {
203 mp->selector = mp->hwe->selector;
204 condlog(3, "%s: selector = %s (controller setting)",
205 mp->alias, mp->selector);
208 if (conf->selector) {
209 mp->selector = conf->selector;
210 condlog(3, "%s: selector = %s (config file default)",
211 mp->alias, mp->selector);
214 mp->selector = set_default(DEFAULT_SELECTOR);
215 condlog(3, "%s: selector = %s (internal default)",
216 mp->alias, mp->selector);
221 select_alias_prefix (struct multipath * mp)
223 if (mp->hwe && mp->hwe->alias_prefix) {
224 mp->alias_prefix = mp->hwe->alias_prefix;
225 condlog(3, "%s: alias_prefix = %s (controller setting)",
226 mp->wwid, mp->alias_prefix);
229 if (conf->alias_prefix) {
230 mp->alias_prefix = conf->alias_prefix;
231 condlog(3, "%s: alias_prefix = %s (config file default)",
232 mp->wwid, mp->alias_prefix);
235 mp->alias_prefix = set_default(DEFAULT_ALIAS_PREFIX);
236 condlog(3, "%s: alias_prefix = %s (internal default)",
237 mp->wwid, mp->alias_prefix);
241 select_alias (struct multipath * mp)
243 if (mp->mpe && mp->mpe->alias)
244 mp->alias = STRDUP(mp->mpe->alias);
247 if (conf->user_friendly_names) {
248 select_alias_prefix(mp);
249 mp->alias = get_user_friendly_alias(mp->wwid,
250 conf->bindings_file, mp->alias_prefix, conf->bindings_read_only);
252 if (mp->alias == NULL)
253 mp->alias = dm_get_name(mp->wwid);
254 if (mp->alias == NULL)
255 mp->alias = STRDUP(mp->wwid);
258 return mp->alias ? 0 : 1;
262 select_features (struct multipath * mp)
264 struct mpentry * mpe;
267 if ((mpe = find_mpe(mp->wwid)) && mpe->features) {
268 mp->features = STRDUP(mpe->features);
269 origin = "LUN setting";
270 } else if (mp->hwe && mp->hwe->features) {
271 mp->features = STRDUP(mp->hwe->features);
272 origin = "controller setting";
274 mp->features = STRDUP(conf->features);
275 origin = "internal default";
277 condlog(3, "%s: features = %s (%s)",
278 mp->alias, mp->features, origin);
279 if (strstr(mp->features, "queue_if_no_path")) {
280 if (mp->no_path_retry == NO_PATH_RETRY_UNDEF)
281 mp->no_path_retry = NO_PATH_RETRY_QUEUE;
282 else if (mp->no_path_retry == NO_PATH_RETRY_FAIL) {
283 condlog(1, "%s: config error, overriding 'no_path_retry' value",
285 mp->no_path_retry = NO_PATH_RETRY_QUEUE;
292 select_hwhandler (struct multipath * mp)
294 if (mp->hwe && mp->hwe->hwhandler) {
295 mp->hwhandler = mp->hwe->hwhandler;
296 condlog(3, "%s: hwhandler = %s (controller setting)",
297 mp->alias, mp->hwhandler);
300 if (conf->hwhandler) {
301 mp->hwhandler = conf->hwhandler;
302 condlog(3, "%s: hwhandler = %s (config file default)",
303 mp->alias, mp->hwhandler);
306 mp->hwhandler = set_default(DEFAULT_HWHANDLER);
307 condlog(3, "%s: hwhandler = %s (internal default)",
308 mp->alias, mp->hwhandler);
313 select_checker(struct path *pp)
315 struct checker * c = &pp->checker;
317 if (pp->hwe && pp->hwe->checker_name) {
318 checker_get(c, pp->hwe->checker_name);
319 condlog(3, "%s: path checker = %s (controller setting)",
320 pp->dev, checker_name(c));
323 if (conf->checker_name) {
324 checker_get(c, conf->checker_name);
325 condlog(3, "%s: path checker = %s (config file default)",
326 pp->dev, checker_name(c));
329 checker_get(c, DEFAULT_CHECKER);
330 condlog(3, "%s: path checker = %s (internal default)",
331 pp->dev, checker_name(c));
333 if (conf->checker_timeout) {
334 c->timeout = conf->checker_timeout * 1000;
335 condlog(3, "%s: checker timeout = %u ms (config file default)",
336 pp->dev, c->timeout);
338 else if (pp->udev && sysfs_get_timeout(pp, &c->timeout) == 0)
339 condlog(3, "%s: checker timeout = %u ms (sysfs setting)",
340 pp->dev, c->timeout);
342 c->timeout = DEF_TIMEOUT;
343 condlog(3, "%s: checker timeout = %u ms (internal default)",
344 pp->dev, c->timeout);
350 select_getuid (struct path * pp)
352 if (pp->hwe && pp->hwe->getuid) {
353 pp->getuid = pp->hwe->getuid;
354 condlog(3, "%s: getuid = %s (controller setting)",
355 pp->dev, pp->getuid);
359 pp->getuid = conf->getuid;
360 condlog(3, "%s: getuid = %s (config file default)",
361 pp->dev, pp->getuid);
364 pp->getuid = STRDUP(DEFAULT_GETUID);
365 condlog(3, "%s: getuid = %s (internal default)",
366 pp->dev, pp->getuid);
371 select_prio (struct path * pp)
373 struct mpentry * mpe;
375 if ((mpe = find_mpe(pp->wwid))) {
376 if (mpe->prio_name) {
377 pp->prio = prio_lookup(mpe->prio_name);
378 prio_set_args(pp->prio, mpe->prio_args);
379 condlog(3, "%s: prio = %s (LUN setting)",
380 pp->dev, pp->prio->name);
385 if (pp->hwe && pp->hwe->prio_name) {
386 pp->prio = prio_lookup(pp->hwe->prio_name);
387 prio_set_args(pp->prio, pp->hwe->prio_args);
388 condlog(3, "%s: prio = %s (controller setting)",
389 pp->dev, pp->hwe->prio_name);
390 condlog(3, "%s: prio args = %s (controller setting)",
391 pp->dev, pp->hwe->prio_args);
394 if (conf->prio_name) {
395 pp->prio = prio_lookup(conf->prio_name);
396 prio_set_args(pp->prio, conf->prio_args);
397 condlog(3, "%s: prio = %s (config file default)",
398 pp->dev, conf->prio_name);
399 condlog(3, "%s: prio args = %s (config file default)",
400 pp->dev, conf->prio_args);
403 pp->prio = prio_lookup(DEFAULT_PRIO);
404 prio_set_args(pp->prio, DEFAULT_PRIO_ARGS);
405 condlog(3, "%s: prio = %s (internal default)",
406 pp->dev, DEFAULT_PRIO);
407 condlog(3, "%s: prio = %s (internal default)",
408 pp->dev, DEFAULT_PRIO_ARGS);
413 select_no_path_retry(struct multipath *mp)
415 if (mp->flush_on_last_del == FLUSH_IN_PROGRESS) {
416 condlog(0, "flush_on_last_del in progress");
417 mp->no_path_retry = NO_PATH_RETRY_FAIL;
419 if (mp->mpe && mp->mpe->no_path_retry != NO_PATH_RETRY_UNDEF) {
420 mp->no_path_retry = mp->mpe->no_path_retry;
421 condlog(3, "%s: no_path_retry = %i (multipath setting)",
422 mp->alias, mp->no_path_retry);
425 if (mp->hwe && mp->hwe->no_path_retry != NO_PATH_RETRY_UNDEF) {
426 mp->no_path_retry = mp->hwe->no_path_retry;
427 condlog(3, "%s: no_path_retry = %i (controller setting)",
428 mp->alias, mp->no_path_retry);
431 if (conf->no_path_retry != NO_PATH_RETRY_UNDEF) {
432 mp->no_path_retry = conf->no_path_retry;
433 condlog(3, "%s: no_path_retry = %i (config file default)",
434 mp->alias, mp->no_path_retry);
437 if (mp->no_path_retry != NO_PATH_RETRY_UNDEF)
438 condlog(3, "%s: no_path_retry = %i (inherited setting)",
439 mp->alias, mp->no_path_retry);
441 condlog(3, "%s: no_path_retry = %i (internal default)",
442 mp->alias, mp->no_path_retry);
447 select_minio_rq (struct multipath * mp)
449 if (mp->mpe && mp->mpe->minio_rq) {
450 mp->minio = mp->mpe->minio_rq;
451 condlog(3, "%s: minio = %i rq (LUN setting)",
452 mp->alias, mp->minio);
455 if (mp->hwe && mp->hwe->minio_rq) {
456 mp->minio = mp->hwe->minio_rq;
457 condlog(3, "%s: minio = %i rq (controller setting)",
458 mp->alias, mp->minio);
462 mp->minio = conf->minio_rq;
463 condlog(3, "%s: minio = %i rq (config file default)",
464 mp->alias, mp->minio);
467 mp->minio = DEFAULT_MINIO_RQ;
468 condlog(3, "%s: minio = %i rq (internal default)",
469 mp->alias, mp->minio);
474 select_minio_bio (struct multipath * mp)
476 if (mp->mpe && mp->mpe->minio) {
477 mp->minio = mp->mpe->minio;
478 condlog(3, "%s: minio = %i (LUN setting)",
479 mp->alias, mp->minio);
482 if (mp->hwe && mp->hwe->minio) {
483 mp->minio = mp->hwe->minio;
484 condlog(3, "%s: minio = %i (controller setting)",
485 mp->alias, mp->minio);
489 mp->minio = conf->minio;
490 condlog(3, "%s: minio = %i (config file default)",
491 mp->alias, mp->minio);
494 mp->minio = DEFAULT_MINIO;
495 condlog(3, "%s: minio = %i (internal default)",
496 mp->alias, mp->minio);
501 select_minio (struct multipath * mp)
504 return select_minio_rq(mp);
506 return select_minio_bio(mp);
510 select_pg_timeout(struct multipath *mp)
512 if (mp->mpe && mp->mpe->pg_timeout != PGTIMEOUT_UNDEF) {
513 mp->pg_timeout = mp->mpe->pg_timeout;
514 if (mp->pg_timeout > 0)
515 condlog(3, "%s: pg_timeout = %d (multipath setting)",
516 mp->alias, mp->pg_timeout);
518 condlog(3, "%s: pg_timeout = NONE (multipath setting)",
522 if (mp->hwe && mp->hwe->pg_timeout != PGTIMEOUT_UNDEF) {
523 mp->pg_timeout = mp->hwe->pg_timeout;
524 if (mp->pg_timeout > 0)
525 condlog(3, "%s: pg_timeout = %d (controller setting)",
526 mp->alias, mp->pg_timeout);
528 condlog(3, "%s: pg_timeout = NONE (controller setting)",
532 if (conf->pg_timeout != PGTIMEOUT_UNDEF) {
533 mp->pg_timeout = conf->pg_timeout;
534 if (mp->pg_timeout > 0)
535 condlog(3, "%s: pg_timeout = %d (config file default)",
536 mp->alias, mp->pg_timeout);
539 "%s: pg_timeout = NONE (config file default)",
543 mp->pg_timeout = PGTIMEOUT_UNDEF;
544 condlog(3, "%s: pg_timeout = NONE (internal default)", mp->alias);
549 select_fast_io_fail(struct multipath *mp)
551 if (mp->hwe && mp->hwe->fast_io_fail) {
552 mp->fast_io_fail = mp->hwe->fast_io_fail;
553 if (mp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
554 condlog(3, "%s: fast_io_fail_tmo = off (controller default)", mp->alias);
556 condlog(3, "%s: fast_io_fail_tmo = %d (controller default)", mp->alias,
557 mp->fast_io_fail == MP_FAST_IO_FAIL_ZERO ? 0 : mp->fast_io_fail);
560 if (conf->fast_io_fail) {
561 mp->fast_io_fail = conf->fast_io_fail;
562 if (mp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
563 condlog(3, "%s: fast_io_fail_tmo = off (config file default)", mp->alias);
565 condlog(3, "%s: fast_io_fail_tmo = %d (config file default)", mp->alias,
566 mp->fast_io_fail == MP_FAST_IO_FAIL_ZERO ? 0 : mp->fast_io_fail);
569 mp->fast_io_fail = 0;
574 select_dev_loss(struct multipath *mp)
576 if (mp->hwe && mp->hwe->dev_loss) {
577 mp->dev_loss = mp->hwe->dev_loss;
578 condlog(3, "%s: dev_loss_tmo = %u (controller default)",
579 mp->alias, mp->dev_loss);
582 if (conf->dev_loss) {
583 mp->dev_loss = conf->dev_loss;
584 condlog(3, "%s: dev_loss_tmo = %u (config file default)",
585 mp->alias, mp->dev_loss);
593 select_flush_on_last_del(struct multipath *mp)
595 if (mp->flush_on_last_del == FLUSH_IN_PROGRESS)
597 if (mp->mpe && mp->mpe->flush_on_last_del != FLUSH_UNDEF) {
598 mp->flush_on_last_del = mp->mpe->flush_on_last_del;
599 condlog(3, "flush_on_last_del = %i (multipath setting)",
600 mp->flush_on_last_del);
603 if (mp->hwe && mp->hwe->flush_on_last_del != FLUSH_UNDEF) {
604 mp->flush_on_last_del = mp->hwe->flush_on_last_del;
605 condlog(3, "flush_on_last_del = %i (controler setting)",
606 mp->flush_on_last_del);
609 if (conf->flush_on_last_del != FLUSH_UNDEF) {
610 mp->flush_on_last_del = conf->flush_on_last_del;
611 condlog(3, "flush_on_last_del = %i (config file default)",
612 mp->flush_on_last_del);
615 mp->flush_on_last_del = FLUSH_UNDEF;
616 condlog(3, "flush_on_last_del = DISABLED (internal default)");
621 select_reservation_key (struct multipath * mp)
627 mp->reservation_key = NULL;
629 if (mp->mpe && mp->mpe->reservation_key) {
630 keyp = mp->mpe->reservation_key;
631 for (j = 0; j < 8; ++j) {
638 condlog(3, "%s: reservation_key = 0x%" PRIx64 " "
639 "(multipath setting)", mp->alias, prkey);
641 mp->reservation_key = mp->mpe->reservation_key;
645 if (conf->reservation_key) {
646 keyp = conf->reservation_key;
647 for (j = 0; j < 8; ++j) {
654 condlog(3, "%s: reservation_key = 0x%" PRIx64
655 " (config file default)", mp->alias, prkey);
657 mp->reservation_key = conf->reservation_key;