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
This commit is contained in:
Benjamin Marzinski 2012-09-27 15:56:43 +00:00
parent a3c4618518
commit bb04a893de
6 changed files with 597 additions and 1 deletions

80
0014-RH-dm_reassign.patch Normal file
View File

@ -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, '/');

View File

@ -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"

View File

@ -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);

View File

@ -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",

View File

@ -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;

View File

@ -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@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@redhat.com> - 0.4.9-30
- Scriptlets replaced with new systemd macros (#850088)