With "detect_checker yes", ALUA is used for all storage devices that support ALUA. But currently RDAC is still preferred for RDAC devices (https://www.redhat.com/archives/dm-devel/2017-September/msg00326.html) Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> --- libmultipath/propsel.c | 52 +++++++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c index 00adc0da4cb1..4a7e3811d21c 100644 --- a/libmultipath/propsel.c +++ b/libmultipath/propsel.c @@ -367,16 +367,42 @@ out: return 0; } +/* + * Current RDAC (NetApp E-Series) firmware relies + * on periodic REPORT TARGET PORT GROUPS for + * internal load balancing. + * Using the sysfs priority checker defeats this purpose. + * + * Moreover, NetApp would also prefer the RDAC checker over ALUA. + * (https://www.redhat.com/archives/dm-devel/2017-September/msg00326.html) + */ +static int +check_rdac(struct path * pp) +{ + int len; + char buff[44]; + + len = get_vpd_sgio(pp->fd, 0xC9, buff, 44); + if (len <= 0) + return 0; + return !(memcmp(buff + 4, "vac1", 4)); +} + int select_checker(struct config *conf, struct path *pp) { char *origin, *checker_name; struct checker * c = &pp->checker; - if (pp->detect_checker == DETECT_CHECKER_ON && pp->tpgs > 0) { - checker_name = TUR; + if (pp->detect_checker == DETECT_CHECKER_ON) { origin = "(setting: storage device autodetected)"; - goto out; - } + if (check_rdac(pp)) { + checker_name = RDAC; + goto out; + } else if (pp->tpgs > 0) { + checker_name = TUR; + goto out; + } + } do_set(checker_name, conf->overrides, checker_name, "(setting: multipath.conf overrides section)"); do_set(checker_name, pp->hwe, checker_name, "(setting: storage device configuration)"); do_set(checker_name, conf, checker_name, "(setting: multipath.conf defaults/devices section)"); @@ -427,24 +453,6 @@ out: return 0; } -/* - * Current RDAC (NetApp E-Series) firmware relies - * on periodic REPORT TARGET PORT GROUPS for - * internal load balancing. - * Using the sysfs priority checker defeats this purpose. - */ -static int -check_rdac(struct path * pp) -{ - int len; - char buff[44]; - - len = get_vpd_sgio(pp->fd, 0xC9, buff, 44); - if (len <= 0) - return 0; - return !(memcmp(buff + 4, "vac1", 4)); -} - void detect_prio(struct config *conf, struct path * pp) { -- 2.14.2 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel