[dm-devel] [RFC] How to fix system stall on root volume multipath
Benjamin Marzinski
bmarzins at redhat.com
Tue Nov 13 22:02:23 UTC 2007
On Tue, Nov 13, 2007 at 02:01:24AM +0100, Christophe Varoqui wrote:
>
> Le lundi 12 novembre 2007 à 11:24 -0500, Kiyoshi Ueda a écrit :
> > Hi Alasdair,
> >
> > On Sat, 10 Nov 2007 03:31:13 +0000, Alasdair G Kergon <agk at redhat.com> wrote:
> > > On Fri, Nov 09, 2007 at 06:17:19PM -0500, Kiyoshi Ueda wrote:
> > > > If we use multipath for "/", temporal all-paths failure could lead to
> > > > system stall because multipathd depends on callout programs on "/".
> > > > I would like to hear your comments about my idea to fix it.
> > >
> > > I thought it avoided that problem by pre-loading everything into a ramdisk:
> > > did that code get dropped for some reason?
> >
> > Thank you for the information! I had forgotten it!
> > Yes, we used to have it, and it seems to be removed by the commit below:
> > http://git.kernel.org/gitweb.cgi?p=linux/storage/multipath-tools/.git;a=commitdiff;h=cad20ecf8919b2126ab6f4f793a1a738e9864f59
> >
> > And probably the following thread is related to the commit.
> > https://www.redhat.com/archives/dm-devel/2005-July/msg00044.html
> >
> >
> > Ben, Christophe,
> > Is that code still problem for current multipathd?
> > And what do you think about my proposal?
> >
> I'm not found of yet-another user-visible ramfs for multipathd use,
> that's why I started with the private namespace tricks. The problems are
> still there, and will stay till we stop using pthreads.
The original problem that I found wasn't a design issue, it was that
pthreads were not working to correctly. When I try the pthread test program that
I posted in
https://www.redhat.com/archives/dm-devel/2005-July/msg00044.html
on RHEL 5, the problem seems to be fixed.
-Ben
> That may happen someday, as one of the main reason for pthread was the
> (blocking ioctl) libdevmapper event collection. And this is being
> superseded by path status uevents.
>
> But not soon enough, and the private namespace stuff suffers from lack
> of friendliness anyway : we can't expect users to grasp easily that
> changing their prioritizer in /sbin won't be seen by the multipath
> daemon till restart, for example.
>
> So I propose to start playing with your prioritizers-as-lib idea to see
> if it's practical.
>
> I prepared the following patch to that effect. It is not complete
> (actually segfaults, no useful prioritizer ported) but can start fixing
> bugs and go where ever your personnal interest leads.
>
> Looking forward to your fixes,
> Thanks,
> cvaroqui
> diff --git a/Makefile.inc b/Makefile.inc
> index 7e2d4e6..1b07ab0 100644
> --- a/Makefile.inc
> +++ b/Makefile.inc
> @@ -24,6 +24,7 @@ exec_prefix = $(prefix)
> bindir = $(exec_prefix)/sbin
> libudevdir = ${prefix}/lib/udev
> checkersdir = $(TOPDIR)/libcheckers
> +libpriodir = $(TOPDIR)/libprio
> multipathdir = $(TOPDIR)/libmultipath
> mandir = $(prefix)/usr/share/man/man8
> man5dir = $(prefix)/usr/share/man/man5
> @@ -33,6 +34,7 @@ GZIP = /bin/gzip -9 -c
>
> CHECKERSLIB = $(checkersdir)/libcheckers
> MULTIPATHLIB = $(multipathdir)/libmultipath
> +LIBPRIO = $(libpriodir)/libprio
>
> INSTALL_PROGRAM = install -s
>
> diff --git a/libmultipath/Makefile b/libmultipath/Makefile
> index 511f5ad..04761e4 100644
> --- a/libmultipath/Makefile
> +++ b/libmultipath/Makefile
> @@ -6,7 +6,7 @@ BUILD = glibc
>
> include ../Makefile.inc
>
> -CFLAGS += -I$(checkersdir)
> +CFLAGS += -I$(checkersdir) -I$(libpriodir)
>
> OBJS = memory.o parser.o vector.o devmapper.o callout.o \
> hwtable.o blacklist.o util.o dmparser.o config.o \
> diff --git a/libmultipath/config.c b/libmultipath/config.c
> index a39af8a..fcca5d8 100644
> --- a/libmultipath/config.c
> +++ b/libmultipath/config.c
> @@ -135,9 +135,6 @@ free_hwe (struct hwentry * hwe)
> if (hwe->getuid)
> FREE(hwe->getuid);
>
> - if (hwe->getprio)
> - FREE(hwe->getprio);
> -
> if (hwe->features)
> FREE(hwe->features);
>
> @@ -265,9 +262,6 @@ store_hwe (vector hwtable, struct hwentry * dhwe)
> if (dhwe->getuid && !(hwe->getuid = set_param_str(dhwe->getuid)))
> goto out;
>
> - if (dhwe->getprio && !(hwe->getprio = set_param_str(dhwe->getprio)))
> - goto out;
> -
> if (dhwe->features && !(hwe->features = set_param_str(dhwe->features)))
> goto out;
>
> @@ -283,6 +277,7 @@ store_hwe (vector hwtable, struct hwentry * dhwe)
> hwe->no_path_retry = dhwe->no_path_retry;
> hwe->minio = dhwe->minio;
> hwe->checker = dhwe->checker;
> + hwe->prio = dhwe->prio;
>
> if (dhwe->bl_product && !(hwe->bl_product = set_param_str(dhwe->bl_product)))
> goto out;
> @@ -321,9 +316,6 @@ free_config (struct config * conf)
> if (conf->getuid)
> FREE(conf->getuid);
>
> - if (conf->getprio)
> - FREE(conf->getprio);
> -
> if (conf->features)
> FREE(conf->features);
>
> diff --git a/libmultipath/config.h b/libmultipath/config.h
> index a25b3ad..7f7b2a9 100644
> --- a/libmultipath/config.h
> +++ b/libmultipath/config.h
> @@ -16,11 +16,11 @@ struct hwentry {
> char * product;
> char * revision;
> char * getuid;
> - char * getprio;
> char * features;
> char * hwhandler;
> char * selector;
> char * checker_name;
> + char * prio_name;
>
> int pgpolicy;
> int pgfailback;
> @@ -28,6 +28,7 @@ struct hwentry {
> int no_path_retry;
> int minio;
> int pg_timeout;
> + struct prio * prio;
> struct checker * checker;
> char * bl_product;
> };
> @@ -53,6 +54,7 @@ struct config {
> int pgpolicy_flag;
> int with_sysfs;
> int pgpolicy;
> + struct prio * prio;
> struct checker * checker;
> enum devtypes dev_type;
> int minio;
> @@ -70,7 +72,6 @@ struct config {
> char * udev_dir;
> char * selector;
> char * getuid;
> - char * getprio;
> char * features;
> char * hwhandler;
> char * bindings_file;
> diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
> index df7d971..97a3dd7 100644
> --- a/libmultipath/defaults.h
> +++ b/libmultipath/defaults.h
> @@ -4,7 +4,6 @@
> #define DEFAULT_FEATURES "0"
> #define DEFAULT_HWHANDLER "0"
> #define DEFAULT_MINIO 1000
> -#define DEFAULT_GETPRIO NULL
> #define DEFAULT_PGPOLICY FAILOVER
> #define DEFAULT_FAILBACK -FAILBACK_MANUAL
> #define DEFAULT_RR_WEIGHT RR_WEIGHT_NONE
> diff --git a/libmultipath/dict.c b/libmultipath/dict.c
> index 4572a7d..bf08a44 100644
> --- a/libmultipath/dict.c
> +++ b/libmultipath/dict.c
> @@ -5,6 +5,7 @@
> * Copyright (c) 2005 Kiyoshi Ueda, NEC
> */
> #include <checkers.h>
> +#include <libprio.h>
>
> #include "vector.h"
> #include "hwtable.h"
> @@ -82,19 +83,16 @@ def_getuid_callout_handler(vector strvec)
> }
>
> static int
> -def_prio_callout_handler(vector strvec)
> +def_prio_handler(vector strvec)
> {
> - conf->getprio = set_value(strvec);
> + char * buff;
>
> - if (!conf->getprio)
> + buff = set_value(strvec);
> + if (!buff)
> return 1;
> -
> - if (strlen(conf->getprio) == 4 &&
> - !strcmp(conf->getprio, "none")) {
> - FREE(conf->getprio);
> - conf->getprio = NULL;
> - }
> -
> +
> + conf->prio = prio_lookup(buff);
> + FREE(buff);
> return 0;
> }
>
> @@ -571,23 +569,20 @@ hw_handler_handler(vector strvec)
> }
>
> static int
> -prio_callout_handler(vector strvec)
> +prio_handler(vector strvec)
> {
> struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
> + char * buff;
>
> if (!hwe)
> return 1;
>
> - hwe->getprio = set_value(strvec);
> -
> - if (!hwe->getprio)
> + buff = set_value(strvec);
> + if (!buff)
> return 1;
> -
> - if (strlen(hwe->getprio) == 4 && !strcmp(hwe->getprio, "none")) {
> - FREE(hwe->getprio);
> - hwe->getprio = NULL;
> - }
> -
> +
> + hwe->prio = prio_lookup(buff);
> + FREE(buff);
> return 0;
> }
>
> @@ -1115,23 +1110,18 @@ snprint_hw_getuid_callout (char * buff, int len, void * data)
> }
>
> static int
> -snprint_hw_prio_callout (char * buff, int len, void * data)
> +snprint_hw_prio (char * buff, int len, void * data)
> {
> struct hwentry * hwe = (struct hwentry *)data;
>
> - if (!conf->getprio && !hwe->getprio)
> + if (!hwe->prio)
> return 0;
> - if (!conf->getprio && hwe->getprio)
> - return snprintf(buff, len, "%s", hwe->getprio);
> - if (conf->getprio && !hwe->getprio)
> - return snprintf(buff, len, "none");
> -
> - /* conf->getprio && hwe->getprio */
> - if (strlen(hwe->getprio) == strlen(conf->getprio) &&
> - !strcmp(hwe->getprio, conf->getprio))
> + if (!prio_selected(hwe->prio))
> return 0;
> -
> - return snprintf(buff, len, "%s", hwe->getprio);
> + if (hwe->prio == conf->prio)
> + return 0;
> +
> + return snprintf(buff, len, "%s", prio_name(hwe->prio));
> }
>
> static int
> @@ -1364,12 +1354,12 @@ snprint_def_getuid_callout (char * buff, int len, void * data)
> }
>
> static int
> -snprint_def_getprio_callout (char * buff, int len, void * data)
> +snprint_def_prio (char * buff, int len, void * data)
> {
> - if (!conf->getprio)
> + if (!conf->prio)
> return 0;
>
> - return snprintf(buff, len, "%s", conf->getprio);
> + return snprintf(buff, len, "%s", prio_name(conf->prio));
> }
>
> static int
> @@ -1523,7 +1513,7 @@ init_keywords(void)
> install_keyword("selector", &def_selector_handler, &snprint_def_selector);
> install_keyword("path_grouping_policy", &def_pgpolicy_handler, &snprint_def_path_grouping_policy);
> install_keyword("getuid_callout", &def_getuid_callout_handler, &snprint_def_getuid_callout);
> - install_keyword("prio_callout", &def_prio_callout_handler, &snprint_def_getprio_callout);
> + install_keyword("prio", &def_prio_handler, &snprint_def_prio);
> install_keyword("features", &def_features_handler, &snprint_def_features);
> install_keyword("path_checker", &def_path_checker_handler, &snprint_def_path_checker);
> install_keyword("failback", &default_failback_handler, &snprint_def_failback);
> @@ -1535,7 +1525,7 @@ init_keywords(void)
> __deprecated install_keyword("default_selector", &def_selector_handler, NULL);
> __deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
> __deprecated install_keyword("default_getuid_callout", &def_getuid_callout_handler, NULL);
> - __deprecated install_keyword("default_prio_callout", &def_prio_callout_handler, NULL);
> + __deprecated install_keyword("default_prio", &def_prio_handler, NULL);
> __deprecated install_keyword("default_features", &def_features_handler, NULL);
> __deprecated install_keyword("default_path_checker", &def_path_checker_handler, NULL);
>
> @@ -1579,7 +1569,7 @@ init_keywords(void)
> install_keyword("path_checker", &hw_path_checker_handler, &snprint_hw_path_checker);
> install_keyword("features", &hw_features_handler, &snprint_hw_features);
> install_keyword("hardware_handler", &hw_handler_handler, &snprint_hw_hardware_handler);
> - install_keyword("prio_callout", &prio_callout_handler, &snprint_hw_prio_callout);
> + install_keyword("prio", &prio_handler, &snprint_hw_prio);
> install_keyword("failback", &hw_failback_handler, &snprint_hw_failback);
> install_keyword("rr_weight", &hw_weight_handler, &snprint_hw_rr_weight);
> install_keyword("no_path_retry", &hw_no_path_retry_handler, &snprint_hw_no_path_retry);
> diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
> index c842eb0..eb096ef 100644
> --- a/libmultipath/discovery.c
> +++ b/libmultipath/discovery.c
> @@ -12,6 +12,7 @@
> #include <errno.h>
>
> #include <checkers.h>
> +#include <libprio.h>
>
> #include "vector.h"
> #include "memory.h"
> @@ -626,27 +627,16 @@ get_state (struct path * pp)
> static int
> get_prio (struct path * pp)
> {
> - char buff[CALLOUT_MAX_SIZE];
> - char prio[16];
> -
> - if (!pp->getprio_selected) {
> - select_getprio(pp);
> - pp->getprio_selected = 1;
> - }
> - if (!pp->getprio) {
> - pp->priority = PRIO_DEFAULT;
> - } else if (apply_format(pp->getprio, &buff[0], pp)) {
> - condlog(0, "error formatting prio callout command");
> - pp->priority = PRIO_UNDEF;
> - return 1;
> - } else if (execute_program(buff, prio, 16)) {
> - condlog(0, "error calling out %s", buff);
> + if (!prio_selected(pp->prio))
> + select_prio(pp);
> + pp->priority = prio_getprio(pp->prio, pp);
> + if (pp->priority < 0) {
> + condlog(0, "%s: %s prio error", pp->dev, prio_name(pp->prio));
> pp->priority = PRIO_UNDEF;
> return 1;
> - } else
> - pp->priority = atoi(prio);
> -
> - condlog(3, "%s: prio = %u", pp->dev, pp->priority);
> + }
> + condlog(3, "%s: %s prio = %u",
> + pp->dev, prio_name(pp->prio), pp->priority);
> return 0;
> }
>
> diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
> index 43c1310..80b8dd2 100644
> --- a/libmultipath/hwtable.c
> +++ b/libmultipath/hwtable.c
> @@ -1,6 +1,7 @@
> #include <stdio.h>
>
> #include <checkers.h>
> +#include <libprio.h>
>
> #include "vector.h"
> #include "defaults.h"
> @@ -27,7 +28,6 @@ static struct hwentry default_hw[] = {
> .vendor = "APPLE*",
> .product = "Xserve RAID ",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -37,6 +37,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = DEFAULT_CHECKER,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * StorageWorks controller family
> @@ -48,7 +49,6 @@ static struct hwentry default_hw[] = {
> .vendor = "3PARdata",
> .product = "VV",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -58,12 +58,12 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = DEFAULT_CHECKER,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> .vendor = "DEC",
> .product = "HSG80",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_hp_sw /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = "1 hp-sw",
> .selector = DEFAULT_SELECTOR,
> @@ -73,12 +73,12 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = HP_SW,
> + .prio_name = PRIO_HP_SW,
> },
> {
> .vendor = "HP",
> .product = "A6189A",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -87,14 +87,14 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> /* MSA 1000/MSA1500 EVA 3000/5000 with old firmware */
> .vendor = "(COMPAQ|HP)",
> .product = "(MSA|HSV)1.0.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_hp_sw /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = "1 hp-sw",
> .selector = DEFAULT_SELECTOR,
> @@ -104,13 +104,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = HP_SW,
> + .prio_name = PRIO_HP_SW,
> },
> {
> /* MSA 1000/1500 with new firmware */
> .vendor = "HP",
> .product = "MSA VOLUME",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_alua /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -120,12 +120,12 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_ALUA,
> },
> {
> .vendor = "HP",
> .product = "MSA2000s*",
> .getuid = "/sbin/cciss_id %n",
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -135,13 +135,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = 12,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> /* EVA 3000/5000 with new firmware */
> .vendor = "(COMPAQ|HP)",
> .product = "(MSA|HSV)1.1.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_alua /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -151,13 +151,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_ALUA,
> },
> {
> /* EVA 4000/6000/8000 */
> .vendor = "HP",
> .product = "HSV2.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_alua /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -167,13 +167,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_ALUA,
> },
> {
> /* HP Smart Array */
> .vendor = "HP",
> .product = "LOGICAL VOLUME.*",
> .getuid = "/lib/udev/scsi_id -n -g -u -s /block/%n",
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -183,6 +183,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * DDN controller family
> @@ -194,7 +195,6 @@ static struct hwentry default_hw[] = {
> .vendor = "DDN",
> .product = "SAN DataDirector",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -204,6 +204,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * EMC / Clariion controller family
> @@ -215,7 +216,6 @@ static struct hwentry default_hw[] = {
> .vendor = "EMC",
> .product = "SYMMETRIX",
> .getuid = "/lib/udev/scsi_id -g -u -ppre-spc3-83 -s /block/%n",
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -224,14 +224,14 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> .vendor = "DGC",
> .product = ".*",
> .bl_product = "LUNZ",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_emc /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = "1 emc",
> .selector = DEFAULT_SELECTOR,
> @@ -241,6 +241,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = (300 / DEFAULT_CHECKINT),
> .minio = DEFAULT_MINIO,
> .checker_name = EMC_CLARIION,
> + .prio_name = PRIO_EMC,
> },
> /*
> * Fujitsu controller family
> @@ -252,7 +253,6 @@ static struct hwentry default_hw[] = {
> .vendor = "FSC",
> .product = "CentricStor",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -261,7 +261,8 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * Hitachi controller family
> @@ -273,7 +274,6 @@ static struct hwentry default_hw[] = {
> .vendor = "(HITACHI|HP)",
> .product = "OPEN-.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -283,12 +283,12 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> .vendor = "HITACHI",
> .product = "DF.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_hds_modular /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -298,6 +298,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_HDS,
> },
> /*
> * IBM controller family
> @@ -309,7 +310,6 @@ static struct hwentry default_hw[] = {
> .vendor = "IBM",
> .product = "ProFibre 4000R",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -318,14 +318,14 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> /* IBM DS4100 / FAStT100 */
> .vendor = "IBM",
> .product = "1742",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_rdac /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -335,13 +335,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_RDAC,
> },
> {
> /* IBM Netfinity Fibre Channel RAID Controller Unit */
> .vendor = "IBM",
> .product = "3526",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_rdac /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -351,13 +351,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_RDAC,
> },
> {
> /* IBM DS4200 / FAStT200 */
> .vendor = "IBM",
> .product = "3542",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -367,13 +367,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> /* IBM ESS F20 aka Shark */
> .vendor = "IBM",
> .product = "2105(800|F20)",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -383,13 +383,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> /* IBM DS6000 */
> .vendor = "IBM",
> .product = "1750500",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_alua /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -399,13 +399,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_ALUA,
> },
> {
> /* IBM DS8000 */
> .vendor = "IBM",
> .product = "2107900",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -415,13 +415,13 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> /* IBM SAN Volume Controller */
> .vendor = "IBM",
> .product = "2145",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_alua /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -431,6 +431,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_ALUA,
> },
> {
> /* IBM S/390 ECKD DASD */
> @@ -438,7 +439,6 @@ static struct hwentry default_hw[] = {
> .product = "S/390 DASD ECKD",
> .bl_product = "S/390.*",
> .getuid = "/sbin/dasdinfo -u -b %n",
> - .getprio = NULL,
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -448,6 +448,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * NETAPP controller family
> @@ -459,7 +460,6 @@ static struct hwentry default_hw[] = {
> .vendor = "NETAPP",
> .product = "LUN.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_netapp /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -468,7 +468,8 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = 128,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = PRIO_NETAPP,
> },
> /*
> * IBM NSeries (NETAPP) controller family
> @@ -480,7 +481,6 @@ static struct hwentry default_hw[] = {
> .vendor = "IBM",
> .product = "Nseries.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_netapp /dev/%n",
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -489,7 +489,8 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = 128,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = PRIO_NETAPP,
> },
> /*
> * Pillar Data controller family
> @@ -501,7 +502,6 @@ static struct hwentry default_hw[] = {
> .vendor = "Pillar",
> .product = "Axiom.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_alua %n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -511,6 +511,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_ALUA,
> },
> /*
> * SGI arrays
> @@ -522,7 +523,6 @@ static struct hwentry default_hw[] = {
> .vendor = "SGI",
> .product = "TP9[13]00",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -531,13 +531,13 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> {
> .vendor = "SGI",
> .product = "TP9[45]00",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_rdac /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -547,12 +547,12 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_QUEUE,
> .minio = DEFAULT_MINIO,
> .checker_name = RDAC,
> + .prio_name = PRIO_RDAC,
> },
> {
> .vendor = "SGI",
> .product = "IS.*",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_rdac /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -562,6 +562,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_QUEUE,
> .minio = DEFAULT_MINIO,
> .checker_name = RDAC,
> + .prio_name = PRIO_RDAC,
> },
> /*
> * STK arrays
> @@ -573,7 +574,6 @@ static struct hwentry default_hw[] = {
> .vendor = "STK",
> .product = "OPENstorage D280",
> .getuid = DEFAULT_GETUID,
> - .getprio = "/sbin/mpath_prio_rdac /dev/%n",
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -583,6 +583,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> .checker_name = TUR,
> + .prio_name = PRIO_RDAC,
> },
> /*
> * SUN arrays
> @@ -594,7 +595,6 @@ static struct hwentry default_hw[] = {
> .vendor = "SUN",
> .product = "(StorEdge 3510|T4)",
> .getuid = DEFAULT_GETUID,
> - .getprio = NULL,
> .features = DEFAULT_FEATURES,
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -603,7 +603,8 @@ static struct hwentry default_hw[] = {
> .rr_weight = RR_WEIGHT_NONE,
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = DEFAULT_MINIO,
> - .checker_name = READSECTOR0,
> + .checker_name = DIRECTIO,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * Pivot3 RAIGE
> @@ -615,7 +616,6 @@ static struct hwentry default_hw[] = {
> .vendor = "PIVOT3",
> .product = "RAIGE VOLUME",
> .getuid = "/sbin/scsi_id -p 0x80 -g -u -s /block/%n",
> - .getprio = NULL,
> .features = "1 queue_if_no_path",
> .hwhandler = DEFAULT_HWHANDLER,
> .selector = DEFAULT_SELECTOR,
> @@ -625,6 +625,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = NO_PATH_RETRY_UNDEF,
> .minio = 100,
> .checker_name = TUR,
> + .prio_name = DEFAULT_PRIO,
> },
> /*
> * EOL
> @@ -633,7 +634,6 @@ static struct hwentry default_hw[] = {
> .vendor = NULL,
> .product = NULL,
> .getuid = NULL,
> - .getprio = NULL,
> .features = NULL,
> .hwhandler = NULL,
> .selector = NULL,
> @@ -643,6 +643,7 @@ static struct hwentry default_hw[] = {
> .no_path_retry = 0,
> .minio = 0,
> .checker_name = NULL,
> + .prio_name = NULL,
> },
> };
>
> diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
> index 45a3728..bb2b2b7 100644
> --- a/libmultipath/propsel.c
> +++ b/libmultipath/propsel.c
> @@ -6,6 +6,7 @@
> #include <stdio.h>
>
> #include <checkers.h>
> +#include <libprio.h>
>
> #include "memory.h"
> #include "vector.h"
> @@ -257,22 +258,23 @@ select_getuid (struct path * pp)
> }
>
> extern int
> -select_getprio (struct path * pp)
> +select_prio (struct path * pp)
> {
> - if (pp->hwe && pp->hwe->getprio) {
> - pp->getprio = pp->hwe->getprio;
> - condlog(3, "%s: getprio = %s (controller setting)",
> - pp->dev, pp->getprio);
> + if (pp->hwe && pp->hwe->prio) {
> + pp->prio = pp->hwe->prio;
> + condlog(3, "%s: prio = %s (controller setting)",
> + pp->dev, prio_name(pp->prio));
> return 0;
> }
> - if (conf->getprio) {
> - pp->getprio = conf->getprio;
> - condlog(3, "%s: getprio = %s (config file default)",
> - pp->dev, pp->getprio);
> + if (conf->prio) {
> + pp->prio = conf->prio;
> + condlog(3, "%s: prio = %s (config file default)",
> + pp->dev, prio_name(pp->prio));
> return 0;
> }
> - pp->getprio = DEFAULT_GETPRIO;
> - condlog(3, "%s: getprio = NULL (internal default)", pp->dev);
> + pp->prio = prio_default();
> + condlog(3, "%s: prio = %s (internal default)",
> + pp->dev, prio_name(pp->prio));
> return 0;
> }
>
> diff --git a/libmultipath/propsel.h b/libmultipath/propsel.h
> index afd1f88..62802f8 100644
> --- a/libmultipath/propsel.h
> +++ b/libmultipath/propsel.h
> @@ -7,7 +7,7 @@ int select_features (struct multipath * mp);
> int select_hwhandler (struct multipath * mp);
> int select_checker(struct path *pp);
> int select_getuid (struct path * pp);
> -int select_getprio (struct path * pp);
> +int select_prio (struct path * pp);
> int select_no_path_retry(struct multipath *mp);
> int select_pg_timeout(struct multipath *mp);
> int select_minio(struct multipath *mp);
> diff --git a/libmultipath/structs.h b/libmultipath/structs.h
> index f821f87..90605c6 100644
> --- a/libmultipath/structs.h
> +++ b/libmultipath/structs.h
> @@ -121,8 +121,7 @@ struct path {
> int priority;
> int pgindex;
> char * getuid;
> - char * getprio;
> - int getprio_selected;
> + struct prio * prio;
> struct checker checker;
> struct multipath * mpp;
> int fd;
> diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
> index 1cc6028..a5dc573 100644
> --- a/libmultipath/structs_vec.c
> +++ b/libmultipath/structs_vec.c
> @@ -3,6 +3,7 @@
> #include <unistd.h>
>
> #include <checkers.h>
> +#include <libprio.h>
>
> #include "vector.h"
> #include "defaults.h"
> @@ -81,8 +82,7 @@ orphan_path (struct path * pp)
> pp->mpp = NULL;
> pp->dmstate = PSTATE_UNDEF;
> pp->getuid = NULL;
> - pp->getprio = NULL;
> - pp->getprio_selected = 0;
> + prio_put(pp->prio);
> checker_put(&pp->checker);
> if (pp->fd >= 0)
> close(pp->fd);
> diff --git a/multipath.conf.annotated b/multipath.conf.annotated
> index e6cfe9a..f617876 100644
> --- a/multipath.conf.annotated
> +++ b/multipath.conf.annotated
> @@ -52,14 +52,14 @@
> # getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n"
> #
> # #
> -# # name : prio_callout
> +# # name : prio
> # # scope : multipath
> -# # desc : the default program and args to callout to obtain a path
> +# # desc : the default function to call to obtain a path
> # # priority value. The ALUA bits in SPC-3 provide an
> -# # exploitable prio value for example. "none" is a valid value
> +# # exploitable prio value for example.
> # # default : (null)
> # #
> -# #prio_callout "/bin/true"
> +# #prio "alua"
> #
> # #
> # # name : path_checker
> @@ -296,15 +296,14 @@
> # getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n"
> #
> # #
> -# # name : prio_callout
> +# # name : prio
> # # scope : multipath
> -# # desc : the program and args to callout to obtain a path
> +# # desc : the function to call to obtain a path
> # # weight. Weights are summed for each path group to
> # # determine the next PG to use case of failure.
> -# # "none" is a valid value.
> # # default : no callout, all paths equals
> # #
> -# prio_callout "/sbin/mpath_prio_balance_units %d"
> +# prio "hp_sw"
> #
> # #
> # # name : path_checker
> diff --git a/multipath.conf.synthetic b/multipath.conf.synthetic
> index 633d625..0c05b4c 100644
> --- a/multipath.conf.synthetic
> +++ b/multipath.conf.synthetic
> @@ -8,7 +8,7 @@
> # selector "round-robin 0"
> # path_grouping_policy multibus
> # getuid_callout "/lib/udev/scsi_id -g -u -s /block/%n"
> -# prio_callout /bin/true
> +# prio const
> # path_checker directio
> # rr_min_io 100
> # rr_weight priorities
> diff --git a/multipathd/Makefile b/multipathd/Makefile
> index b430b94..b82f159 100644
> --- a/multipathd/Makefile
> +++ b/multipathd/Makefile
> @@ -21,6 +21,7 @@ LDFLAGS = -lpthread -ldevmapper -lreadline -lncurses -laio
> #
> OBJS = main.o pidfile.o uxlsnr.o uxclnt.o cli.o cli_handlers.o \
> $(MULTIPATHLIB)-glibc.a $(CHECKERSLIB)-glibc.a \
> + $(LIBPRIO)-glibc.a
>
>
> #
> @@ -37,6 +38,9 @@ $(EXEC): clean $(OBJS)
> $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS)
> $(GZIP) $(EXEC).8 > $(EXEC).8.gz
>
> +$(LIBPRIO)-glibc.a:
> + $(MAKE) -C $(libpriodir) BUILD=glibc glibc
> +
> $(CHECKERSLIB)-glibc.a:
> $(MAKE) -C $(checkersdir) BUILD=glibc glibc
>
More information about the dm-devel
mailing list