[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