From bb04a893de762361da05082a4ff3ba38df99c03e Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 27 Sep 2012 15:56:43 +0000 Subject: [PATCH] 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 deletion(-) create mode 100644 0014-RH-dm_reassign.patch create mode 100644 0015-RH-selector_change.patch create mode 100644 0016-RH-retain_hwhandler.patch create mode 100644 0017-RH-netapp_config.patch create mode 100644 0018-RH-remove-config-dups.patch 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 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 - 0.4.9-30 - Scriptlets replaced with new systemd macros (#850088)