[device-mapper-multipath] device-mapper-multipath-0.4.9-31 Add 0014-RH-dm_reassign.patch * Fix reassign_maps option Add 0015

Benjamin Marzinski bmarzins at fedoraproject.org
Thu Sep 27 21:33:53 UTC 2012


commit bb04a893de762361da05082a4ff3ba38df99c03e
Author: Benjamin Marzinski <bmarzins at redhat.com>
Date:   Thu Sep 27 15:56:43 2012 +0000

    device-mapper-multipath-0.4.9-31
    Add 0014-RH-dm_reassign.patch
      * Fix reassign_maps option
    Add 0015-RH-selector_change.patch
      * devices default to using service-time selector
    Add 0016-RH-retain_hwhandler.patch
      * add retain_attached_hw_handler option, to let multipath keep an
        already attached scsi device handler
    Add 0017-RH-netapp_config.patch
    Add 0018-RH-remove-config-dups.patch
      * Clean up duplicates in the devices and blacklist sections

 0014-RH-dm_reassign.patch        |   80 ++++++++++
 0015-RH-selector_change.patch    |   17 +++
 0016-RH-retain_hwhandler.patch   |  297 ++++++++++++++++++++++++++++++++++++++
 0017-RH-netapp_config.patch      |   50 +++++++
 0018-RH-remove-config-dups.patch |  130 +++++++++++++++++
 device-mapper-multipath.spec     |   24 +++-
 6 files changed, 597 insertions(+), 1 deletions(-)
---
diff --git a/0014-RH-dm_reassign.patch b/0014-RH-dm_reassign.patch
new file mode 100644
index 0000000..a66b93c
--- /dev/null
+++ b/0014-RH-dm_reassign.patch
@@ -0,0 +1,80 @@
+---
+ libmultipath/devmapper.c |    4 +++-
+ libmultipath/sysfs.c     |   10 ++++++----
+ libmultipath/util.c      |    3 ++-
+ 3 files changed, 11 insertions(+), 6 deletions(-)
+
+Index: multipath-tools-120821/libmultipath/devmapper.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/devmapper.c
++++ multipath-tools-120821/libmultipath/devmapper.c
+@@ -1372,8 +1372,10 @@ int dm_reassign(const char *mapname)
+ 		return 1;
+ 	}
+ 
+-	if (!(dmt = dm_task_create(DM_DEVICE_DEPS)))
++	if (!(dmt = dm_task_create(DM_DEVICE_DEPS))) {
++		condlog(3, "%s: couldn't make dm task", mapname);
+ 		return 0;
++	}
+ 
+ 	if (!dm_task_set_name(dmt, mapname))
+ 		goto out;
+Index: multipath-tools-120821/libmultipath/sysfs.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/sysfs.c
++++ multipath-tools-120821/libmultipath/sysfs.c
+@@ -125,8 +125,10 @@ int sysfs_check_holders(char * check_dev
+ 		return 0;
+ 	}
+ 
+-	if (devt2devname(check_dev, PATH_SIZE, check_devt))
++	if (devt2devname(check_dev, PATH_SIZE, check_devt)) {
++		condlog(1, "can't get devname for %s", check_devt);
+ 		return 0;
++	}
+ 
+ 	condlog(3, "%s: checking holder", check_dev);
+ 
+@@ -143,17 +145,17 @@ int sysfs_check_holders(char * check_dev
+ 			continue;
+ 
+ 		if (sscanf(holder->d_name, "dm-%d", &table_minor) != 1) {
+-			condlog(3, "%s: %s is not a dm-device",
++			condlog(0, "%s: %s is not a dm-device",
+ 				check_dev, holder->d_name);
+ 			continue;
+ 		}
+ 		if (table_minor == new_minor) {
+-			condlog(3, "%s: holder already correct", check_dev);
++			condlog(0, "%s: holder already correct", check_dev);
+ 			continue;
+ 		}
+ 		table_name = dm_mapname(major, table_minor);
+ 
+-		condlog(3, "%s: reassign table %s old %s new %s", check_dev,
++		condlog(0, "%s: reassign table %s old %s new %s", check_dev,
+ 			table_name, check_devt, new_devt);
+ 
+ 		dm_reassign_table(table_name, check_devt, new_devt);
+Index: multipath-tools-120821/libmultipath/util.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/util.c
++++ multipath-tools-120821/libmultipath/util.c
+@@ -161,6 +161,7 @@ devt2devname (char *devname, int devname
+ 	struct stat statbuf;
+ 
+ 	memset(block_path, 0, sizeof(block_path));
++	memset(dev, 0, sizeof(dev));
+ 	if (sscanf(devt, "%u:%u", &major, &minor) != 2) {
+ 		condlog(0, "Invalid device number %s", devt);
+ 		return 1;
+@@ -172,7 +173,7 @@ devt2devname (char *devname, int devname
+ 	if (stat("/sys/dev/block", &statbuf) == 0) {
+ 		/* Newer kernels have /sys/dev/block */
+ 		sprintf(block_path,"/sys/dev/block/%u:%u", major, minor);
+-		if (stat(block_path, &statbuf) == 0) {
++		if (lstat(block_path, &statbuf) == 0) {
+ 			if (S_ISLNK(statbuf.st_mode) &&
+ 			    readlink(block_path, dev, FILE_NAME_SIZE) > 0) {
+ 				char *p = strrchr(dev, '/');
diff --git a/0015-RH-selector_change.patch b/0015-RH-selector_change.patch
new file mode 100644
index 0000000..06a4148
--- /dev/null
+++ b/0015-RH-selector_change.patch
@@ -0,0 +1,17 @@
+---
+ libmultipath/defaults.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: multipath-tools-120821/libmultipath/defaults.h
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/defaults.h
++++ multipath-tools-120821/libmultipath/defaults.h
+@@ -1,7 +1,7 @@
+ #define DEFAULT_UID_ATTRIBUTE	"ID_SERIAL"
+ #define DEFAULT_UDEVDIR		"/dev"
+ #define DEFAULT_MULTIPATHDIR	"/" LIB_STRING "/multipath"
+-#define DEFAULT_SELECTOR	"round-robin 0"
++#define DEFAULT_SELECTOR	"service-time 0"
+ #define DEFAULT_ALIAS_PREFIX	"mpath"
+ #define DEFAULT_FEATURES	"0"
+ #define DEFAULT_HWHANDLER	"0"
diff --git a/0016-RH-retain_hwhandler.patch b/0016-RH-retain_hwhandler.patch
new file mode 100644
index 0000000..6c69b4f
--- /dev/null
+++ b/0016-RH-retain_hwhandler.patch
@@ -0,0 +1,297 @@
+---
+ libmultipath/config.c    |    3 +
+ libmultipath/config.h    |    2 +
+ libmultipath/configure.c |    7 +++-
+ libmultipath/defaults.h  |    1 
+ libmultipath/dict.c      |   74 +++++++++++++++++++++++++++++++++++++++++++++++
+ libmultipath/dmparser.c  |    3 +
+ libmultipath/propsel.c   |   17 ++++++++++
+ libmultipath/propsel.h   |    1 
+ libmultipath/structs.h   |    7 ++++
+ 9 files changed, 113 insertions(+), 2 deletions(-)
+
+Index: multipath-tools-120821/libmultipath/config.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/config.c
++++ multipath-tools-120821/libmultipath/config.c
+@@ -327,6 +327,7 @@ merge_hwe (struct hwentry * dst, struct
+ 	merge_num(fast_io_fail);
+ 	merge_num(dev_loss);
+ 	merge_num(user_friendly_names);
++	merge_num(retain_hwhandler);
+ 
+ 	return 0;
+ }
+@@ -386,6 +387,7 @@ store_hwe (vector hwtable, struct hwentr
+ 	hwe->fast_io_fail = dhwe->fast_io_fail;
+ 	hwe->dev_loss = dhwe->dev_loss;
+ 	hwe->user_friendly_names = dhwe->user_friendly_names;
++	hwe->retain_hwhandler = dhwe->retain_hwhandler;
+ 
+ 	if (dhwe->bl_product && !(hwe->bl_product = set_param_str(dhwe->bl_product)))
+ 		goto out;
+@@ -519,6 +521,7 @@ load_config (char * file)
+ 	conf->max_checkint = MAX_CHECKINT(conf->checkint);
+ 	conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;
+ 	conf->fast_io_fail = 5;
++	conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
+ 
+ 	/*
+ 	 * preload default hwtable
+Index: multipath-tools-120821/libmultipath/config.h
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/config.h
++++ multipath-tools-120821/libmultipath/config.h
+@@ -46,6 +46,7 @@ struct hwentry {
+ 	int fast_io_fail;
+ 	unsigned int dev_loss;
+ 	int user_friendly_names;
++	int retain_hwhandler;
+ 	char * bl_product;
+ };
+ 
+@@ -110,6 +111,7 @@ struct config {
+ 	mode_t mode;
+ 	uint32_t cookie;
+ 	int reassign_maps;
++	int retain_hwhandler;
+ 
+ 	char * dev;
+ 	struct udev * udev;
+Index: multipath-tools-120821/libmultipath/defaults.h
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/defaults.h
++++ multipath-tools-120821/libmultipath/defaults.h
+@@ -16,6 +16,7 @@
+ #define DEFAULT_VERBOSITY	2
+ #define DEFAULT_REASSIGN_MAPS	1
+ #define DEFAULT_FIND_MULTIPATHS 0
++#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_OFF
+ 
+ #define DEFAULT_CHECKINT	5
+ #define MAX_CHECKINT(a)		(a << 2)
+Index: multipath-tools-120821/libmultipath/dict.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/dict.c
++++ multipath-tools-120821/libmultipath/dict.c
+@@ -650,6 +650,29 @@ wwids_file_handler(vector strvec)
+ 	return 0;
+ }
+ 
++static int
++def_retain_hwhandler_handler(vector strvec)
++{
++	char * buff;
++
++	buff = set_value(strvec);
++
++	if (!buff)
++		return 1;
++
++	if ((strlen(buff) == 2 && !strcmp(buff, "no")) ||
++	    (strlen(buff) == 1 && !strcmp(buff, "0")))
++		conf->retain_hwhandler = RETAIN_HWHANDLER_OFF;
++	else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) ||
++		 (strlen(buff) == 1 && !strcmp(buff, "1")))
++		conf->retain_hwhandler = RETAIN_HWHANDLER_ON;
++	else
++		conf->retain_hwhandler = RETAIN_HWHANDLER_UNDEF;
++
++	FREE(buff);
++	return 0;
++}
++
+ /*
+  * blacklist block handlers
+  */
+@@ -1271,6 +1294,33 @@ hw_names_handler(vector strvec)
+ 	return 0;
+ }
+ 
++static int
++hw_retain_hwhandler_handler(vector strvec)
++{
++	struct hwentry *hwe = VECTOR_LAST_SLOT(conf->hwtable);
++	char * buff;
++
++	if (!hwe)
++		return 1;
++
++	buff = set_value(strvec);
++
++	if (!buff)
++		return 1;
++
++	if ((strlen(buff) == 2 && !strcmp(buff, "no")) ||
++	    (strlen(buff) == 1 && !strcmp(buff, "0")))
++		hwe->retain_hwhandler = RETAIN_HWHANDLER_OFF;
++	else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) ||
++		 (strlen(buff) == 1 && !strcmp(buff, "1")))
++		hwe->retain_hwhandler = RETAIN_HWHANDLER_ON;
++	else
++		hwe->user_friendly_names = RETAIN_HWHANDLER_UNDEF;
++
++	FREE(buff);
++	return 0;
++}
++
+ /*
+  * multipaths block handlers
+  */
+@@ -2295,6 +2345,19 @@ snprint_hw_user_friendly_names (char * b
+ }
+ 
+ static int
++snprint_hw_retain_hwhandler_handler(char * buff, int len, void * data)
++{
++	struct hwentry * hwe = (struct hwentry *)data;
++
++	if (hwe->retain_hwhandler == RETAIN_HWHANDLER_ON)
++		return snprintf(buff, len, "yes");
++	else if (hwe->retain_hwhandler == RETAIN_HWHANDLER_OFF)
++		return snprintf(buff, len, "no");
++	else
++		return 0;
++}
++
++static int
+ snprint_def_polling_interval (char * buff, int len, void * data)
+ {
+ 	return snprintf(buff, len, "%i", conf->checkint);
+@@ -2632,6 +2695,15 @@ snprint_def_reservation_key(char * buff,
+ }
+ 
+ static int
++snprint_def_retain_hwhandler_handler(char * buff, int len, void * data)
++{
++	if (conf->retain_hwhandler == RETAIN_HWHANDLER_ON)
++		return snprintf(buff, len, "yes");
++	else
++		return snprintf(buff, len, "no");
++}
++
++static int
+ snprint_ble_simple (char * buff, int len, void * data)
+ {
+ 	struct blentry * ble = (struct blentry *)data;
+@@ -2696,6 +2768,7 @@ init_keywords(void)
+ 	install_keyword("log_checker_err", &def_log_checker_err_handler, &snprint_def_log_checker_err);
+ 	install_keyword("reservation_key", &def_reservation_key_handler, &snprint_def_reservation_key);
+ 	install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths);
++	install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
+ 	__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
+ 	__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
+ 	__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
+@@ -2757,6 +2830,7 @@ init_keywords(void)
+ 	install_keyword("fast_io_fail_tmo", &hw_fast_io_fail_handler, &snprint_hw_fast_io_fail);
+ 	install_keyword("dev_loss_tmo", &hw_dev_loss_handler, &snprint_hw_dev_loss);
+ 	install_keyword("user_friendly_names", &hw_names_handler, &snprint_hw_user_friendly_names);
++	install_keyword("retain_attached_hw_handler", &hw_retain_hwhandler_handler, &snprint_hw_retain_hwhandler_handler);
+ 	install_sublevel_end();
+ 
+ 	install_keyword_root("multipaths", &multipaths_handler);
+Index: multipath-tools-120821/libmultipath/structs.h
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/structs.h
++++ multipath-tools-120821/libmultipath/structs.h
+@@ -99,6 +99,12 @@ enum user_friendly_names_states {
+ 	USER_FRIENDLY_NAMES_ON,
+ };
+ 
++enum retain_hwhandler_states {
++	RETAIN_HWHANDLER_UNDEF,
++	RETAIN_HWHANDLER_OFF,
++	RETAIN_HWHANDLER_ON,
++};
++
+ struct scsi_idlun {
+ 	int dev_id;
+ 	int host_unique_id;
+@@ -188,6 +194,7 @@ struct multipath {
+ 	int flush_on_last_del;
+ 	int attribute_flags;
+ 	int fast_io_fail;
++	int retain_hwhandler;
+ 	unsigned int dev_loss;
+ 	uid_t uid;
+ 	gid_t gid;
+Index: multipath-tools-120821/libmultipath/configure.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/configure.c
++++ multipath-tools-120821/libmultipath/configure.c
+@@ -76,6 +76,7 @@ setup_map (struct multipath * mpp, char
+ 	select_fast_io_fail(mpp);
+ 	select_dev_loss(mpp);
+ 	select_reservation_key(mpp);
++	select_retain_hwhandler(mpp);
+ 
+ 	sysfs_set_scsi_tmo(mpp);
+ 	/*
+@@ -217,8 +218,10 @@ select_action (struct multipath * mpp, v
+ 			mpp->alias);
+ 		return;
+ 	}
+-	if (!cmpp->selector || strncmp(cmpp->hwhandler, mpp->hwhandler,
+-		    strlen(mpp->hwhandler))) {
++	if (mpp->retain_hwhandler != RETAIN_HWHANDLER_ON &&
++            (strlen(cmpp->hwhandler) != strlen(mpp->hwhandler) ||
++	     strncmp(cmpp->hwhandler, mpp->hwhandler,
++		    strlen(mpp->hwhandler)))) {
+ 		mpp->action = ACT_RELOAD;
+ 		condlog(3, "%s: set ACT_RELOAD (hwhandler change)",
+ 			mpp->alias);
+Index: multipath-tools-120821/libmultipath/dmparser.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/dmparser.c
++++ multipath-tools-120821/libmultipath/dmparser.c
+@@ -56,6 +56,7 @@ assemble_map (struct multipath * mp, cha
+ 	int nr_priority_groups, initial_pg_nr;
+ 	char * p, * f;
+ 	char no_path_retry[] = "queue_if_no_path";
++	char retain_hwhandler[] = "retain_attached_hw_handler";
+ 	struct pathgroup * pgp;
+ 	struct path * pp;
+ 
+@@ -81,6 +82,8 @@ assemble_map (struct multipath * mp, cha
+ 	} else {
+ 		add_feature(&f, no_path_retry);
+ 	}
++	if (mp->retain_hwhandler == RETAIN_HWHANDLER_ON)
++		add_feature(&f, retain_hwhandler);
+ 
+ 	shift = snprintf(p, freechar, "%s %s %i %i",
+ 			 f, mp->hwhandler,
+Index: multipath-tools-120821/libmultipath/propsel.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/propsel.c
++++ multipath-tools-120821/libmultipath/propsel.c
+@@ -674,3 +674,20 @@ select_reservation_key (struct multipath
+ 	return 0;
+ }
+ 
++extern int
++select_retain_hwhandler (struct multipath * mp)
++{
++	if (mp->hwe && mp->hwe->retain_hwhandler) {
++		mp->retain_hwhandler = mp->hwe->retain_hwhandler;
++		condlog(3, "%s: retain_attached_hw_handler = %d (controller default)", mp->alias, mp->retain_hwhandler);
++		return 0;
++	}
++	if (conf->retain_hwhandler) {
++		mp->retain_hwhandler = conf->retain_hwhandler;
++		condlog(3, "%s: retain_attached_hw_handler = %d (config file default)", mp->alias, mp->retain_hwhandler);
++		return 0;
++	}
++	mp->retain_hwhandler = 0;
++	condlog(3, "%s: retain_attached_hw_handler = %d (compiled in default)", mp->alias, mp->retain_hwhandler);
++	return 0;
++}
+Index: multipath-tools-120821/libmultipath/propsel.h
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/propsel.h
++++ multipath-tools-120821/libmultipath/propsel.h
+@@ -18,3 +18,4 @@ int select_gid(struct multipath *mp);
+ int select_fast_io_fail(struct multipath *mp);
+ int select_dev_loss(struct multipath *mp);
+ int select_reservation_key(struct multipath *mp);
++extern int select_retain_hwhandler (struct multipath * mp);
diff --git a/0017-RH-netapp_config.patch b/0017-RH-netapp_config.patch
new file mode 100644
index 0000000..675af9e
--- /dev/null
+++ b/0017-RH-netapp_config.patch
@@ -0,0 +1,50 @@
+---
+ libmultipath/hwtable.c |   21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+Index: multipath-tools-120821/libmultipath/hwtable.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/hwtable.c
++++ multipath-tools-120821/libmultipath/hwtable.c
+@@ -864,15 +864,16 @@ static struct hwentry default_hw[] = {
+ 		.vendor        = "NETAPP",
+ 		.product       = "LUN.*",
+ 		.features      = "3 queue_if_no_path pg_init_retries 50",
+-		.hwhandler     = DEFAULT_HWHANDLER,
++		.hwhandler     = "1 alua",
+ 		.pgpolicy      = GROUP_BY_PRIO,
+ 		.pgfailback    = -FAILBACK_IMMEDIATE,
+ 		.flush_on_last_del = FLUSH_ENABLED,
+ 		.rr_weight     = RR_WEIGHT_NONE,
+ 		.no_path_retry = NO_PATH_RETRY_UNDEF,
+ 		.minio         = 128,
++		.dev_loss      = MAX_DEV_LOSS_TMO,
+ 		.checker_name  = TUR,
+-		.prio_name     = PRIO_ONTAP,
++		.prio_name     = PRIO_ALUA,
+ 		.prio_args     = NULL,
+ 	},
+ 	/*
+@@ -1135,6 +1136,22 @@ static struct hwentry default_hw[] = {
+ 		.prio_args     = NULL,
+ 	},
+ 	{
++		.vendor        = "NETAPP",
++		.product       = "INF-01-00",
++		.bl_product    = "Universal Xport",
++		.features      = "2 pg_init_retries 50",
++		.hwhandler     = "2 alua 1",
++		.pgpolicy      = GROUP_BY_PRIO,
++		.pgfailback    = -FAILBACK_IMMEDIATE,
++		.rr_weight     = RR_WEIGHT_NONE,
++		.no_path_retry = 15,
++		.minio         = DEFAULT_MINIO,
++		.minio_rq      = DEFAULT_MINIO_RQ,
++		.checker_name  = TUR,
++		.prio_name     = PRIO_ALUA,
++		.prio_args     = NULL,
++	},
++	{
+ 		.vendor        = "STK",
+ 		.product       = "FLEXLINE 380",
+ 		.bl_product    = "Universal Xport",
diff --git a/0018-RH-remove-config-dups.patch b/0018-RH-remove-config-dups.patch
new file mode 100644
index 0000000..b5bee69
--- /dev/null
+++ b/0018-RH-remove-config-dups.patch
@@ -0,0 +1,130 @@
+---
+ libmultipath/blacklist.c |   91 ++++++++++++++++++++++++-----------------------
+ libmultipath/config.c    |    5 ++
+ 2 files changed, 52 insertions(+), 44 deletions(-)
+
+Index: multipath-tools-120821/libmultipath/blacklist.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/blacklist.c
++++ multipath-tools-120821/libmultipath/blacklist.c
+@@ -96,50 +96,6 @@ set_ble_device (vector blist, char * ven
+ }
+ 
+ int
+-setup_default_blist (struct config * conf)
+-{
+-	struct blentry * ble;
+-	struct hwentry *hwe;
+-	char * str;
+-	int i;
+-
+-	str = STRDUP("^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*");
+-	if (!str)
+-		return 1;
+-	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
+-		return 1;
+-
+-	str = STRDUP("^hd[a-z]");
+-	if (!str)
+-		return 1;
+-	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
+-		return 1;
+-
+-	str = STRDUP("^dcssblk[0-9]*");
+-	if (!str)
+-		return 1;
+-	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
+-		return 1;
+-
+-	vector_foreach_slot (conf->hwtable, hwe, i) {
+-		if (hwe->bl_product) {
+-			if (alloc_ble_device(conf->blist_device))
+-				return 1;
+-			ble = VECTOR_SLOT(conf->blist_device,
+-					  VECTOR_SIZE(conf->blist_device) -1);
+-			if (set_ble_device(conf->blist_device,
+-					   STRDUP(hwe->vendor),
+-					   STRDUP(hwe->bl_product),
+-					   ORIGIN_DEFAULT)) {
+-				FREE(ble);
+-				return 1;
+-			}
+-		}
+-	}
+-	return 0;
+-}
+-
+-int
+ _blacklist_exceptions (vector elist, char * str)
+ {
+ 	int i;
+@@ -192,6 +148,53 @@ _blacklist_device (vector blist, char *
+ 	}
+ 	return 0;
+ }
++
++int
++setup_default_blist (struct config * conf)
++{
++	struct blentry * ble;
++	struct hwentry *hwe;
++	char * str;
++	int i;
++
++	str = STRDUP("^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*");
++	if (!str)
++		return 1;
++	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
++		return 1;
++
++	str = STRDUP("^hd[a-z]");
++	if (!str)
++		return 1;
++	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
++		return 1;
++
++	str = STRDUP("^dcssblk[0-9]*");
++	if (!str)
++		return 1;
++	if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
++		return 1;
++
++	vector_foreach_slot (conf->hwtable, hwe, i) {
++		if (hwe->bl_product) {
++			if (_blacklist_device(conf->blist_device, hwe->vendor,
++					      hwe->bl_product))
++				continue;
++			if (alloc_ble_device(conf->blist_device))
++				return 1;
++			ble = VECTOR_SLOT(conf->blist_device,
++					  VECTOR_SIZE(conf->blist_device) -1);
++			if (set_ble_device(conf->blist_device,
++					   STRDUP(hwe->vendor),
++					   STRDUP(hwe->bl_product),
++					   ORIGIN_DEFAULT)) {
++				FREE(ble);
++				return 1;
++			}
++		}
++	}
++	return 0;
++}
+ 
+ #define LOG_BLIST(M) \
+ 	if (vendor && product)						 \
+Index: multipath-tools-120821/libmultipath/config.c
+===================================================================
+--- multipath-tools-120821.orig/libmultipath/config.c
++++ multipath-tools-120821/libmultipath/config.c
+@@ -417,6 +417,11 @@ factorize_hwtable (vector hw, int n)
+ 				continue;
+ 			/* dup */
+ 			merge_hwe(hwe2, hwe1);
++			vector_del_slot(hw, i);
++			free_hwe(hwe1);
++			n -= 1;
++			i -= 1;
++			j -= 1;
+ 		}
+ 	}
+ 	return 0;
diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec
index fe06839..3be1312 100644
--- a/device-mapper-multipath.spec
+++ b/device-mapper-multipath.spec
@@ -1,7 +1,7 @@
 Summary: Tools to manage multipath devices using device-mapper
 Name: device-mapper-multipath
 Version: 0.4.9
-Release: 30%{?dist}
+Release: 31%{?dist}
 License: GPL+
 Group: System Environment/Base
 URL: http://christophe.varoqui.free.fr/
@@ -21,6 +21,11 @@ Patch0010: 0010-RH-deprecate-uid-gid-mode.patch
 Patch0011: 0011-RH-use-sync-support.patch
 Patch0012: 0012-RH-change-configs.patch
 Patch0013: 0013-RH-kpartx-msg.patch
+Patch0014: 0014-RH-dm_reassign.patch
+Patch0015: 0015-RH-selector_change.patch
+Patch0016: 0016-RH-retain_hwhandler.patch
+Patch0017: 0017-RH-netapp_config.patch
+Patch0018: 0018-RH-remove-config-dups.patch
 
 # runtime
 Requires: %{name}-libs = %{version}-%{release}
@@ -86,6 +91,11 @@ kpartx manages partition creation and removal for device-mapper devices.
 %patch0011 -p1
 %patch0012 -p1
 %patch0013 -p1
+%patch0014 -p1
+%patch0015 -p1
+%patch0016 -p1
+%patch0017 -p1
+%patch0018 -p1
 cp %{SOURCE1} .
 
 %build
@@ -172,6 +182,18 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||:
 %{_mandir}/man8/kpartx.8.gz
 
 %changelog
+* Thu Sep 27 2012 Benjamin Marzinski <bmarzins at redhat.com> 0.4.9-31
+- Add 0014-RH-dm_reassign.patch
+  * Fix reassign_maps option
+- Add 0015-RH-selector_change.patch
+  * devices default to using service-time selector
+- Add 0016-RH-retain_hwhandler.patch
+  * add retain_attached_hw_handler option, to let multipath keep an
+    already attached scsi device handler
+- Add 0017-RH-netapp_config.patch
+- Add 0018-RH-remove-config-dups.patch
+  * Clean up duplicates in the devices and blacklist sections
+
 * Wed Sep 05 2012 Václav Pavlín <vpavlin at redhat.com> - 0.4.9-30
 - Scriptlets replaced with new systemd macros (#850088)
 


More information about the scm-commits mailing list