[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