device-mapper-multipath-0.4.9-33
Modify 0016-RH-retain_hwhandler.patch * Check the dm-multipath module version, and don't enable retain_attached_hw_handler if the kernel doesn't support it Add 0019-RH-detect-prio.patch * add detect_prio option, to make multipath check if the device supports the ALUA prio, before defaulting to the configured prio Remove 0017-RH-netapp_config.patch Add 0020-RH-netapp-config.patch * new netapp config that uses retain_attached_hw_handler and detect_prio to autoconfigure ALUA and non-ALUA devices.
This commit is contained in:
parent
67e579f751
commit
fd54c41ec0
@ -1,14 +1,16 @@
|
||||
---
|
||||
libmultipath/config.c | 3 +
|
||||
libmultipath/config.h | 2 +
|
||||
libmultipath/config.c | 5 ++-
|
||||
libmultipath/config.h | 4 +-
|
||||
libmultipath/configure.c | 7 +++-
|
||||
libmultipath/defaults.h | 1
|
||||
libmultipath/devmapper.c | 34 +++------------------
|
||||
libmultipath/devmapper.h | 8 ++++-
|
||||
libmultipath/dict.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
libmultipath/dmparser.c | 3 +
|
||||
libmultipath/propsel.c | 17 ++++++++++
|
||||
libmultipath/propsel.c | 29 +++++++++++++++++-
|
||||
libmultipath/propsel.h | 1
|
||||
libmultipath/structs.h | 7 ++++
|
||||
9 files changed, 113 insertions(+), 2 deletions(-)
|
||||
11 files changed, 138 insertions(+), 35 deletions(-)
|
||||
|
||||
Index: multipath-tools-120821/libmultipath/config.c
|
||||
===================================================================
|
||||
@ -30,6 +32,15 @@ Index: multipath-tools-120821/libmultipath/config.c
|
||||
|
||||
if (dhwe->bl_product && !(hwe->bl_product = set_param_str(dhwe->bl_product)))
|
||||
goto out;
|
||||
@@ -502,7 +504,7 @@ load_config (char * file)
|
||||
conf->verbosity = DEFAULT_VERBOSITY;
|
||||
|
||||
conf->udev = udev_new();
|
||||
- conf->dmrq = dm_drv_get_rq();
|
||||
+ dm_drv_version(conf->version, TGT_MPATH);
|
||||
conf->dev_type = DEV_NONE;
|
||||
conf->minio = DEFAULT_MINIO;
|
||||
conf->minio_rq = DEFAULT_MINIO_RQ;
|
||||
@@ -519,6 +521,7 @@ load_config (char * file)
|
||||
conf->max_checkint = MAX_CHECKINT(conf->checkint);
|
||||
conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;
|
||||
@ -50,11 +61,20 @@ Index: multipath-tools-120821/libmultipath/config.h
|
||||
char * bl_product;
|
||||
};
|
||||
|
||||
@@ -110,6 +111,7 @@ struct config {
|
||||
@@ -75,7 +76,6 @@ struct mpentry {
|
||||
};
|
||||
|
||||
struct config {
|
||||
- int dmrq;
|
||||
int verbosity;
|
||||
int dry_run;
|
||||
int list;
|
||||
@@ -110,6 +110,8 @@ struct config {
|
||||
mode_t mode;
|
||||
uint32_t cookie;
|
||||
int reassign_maps;
|
||||
+ int retain_hwhandler;
|
||||
+ unsigned int version[3];
|
||||
|
||||
char * dev;
|
||||
struct udev * udev;
|
||||
@ -265,13 +285,32 @@ 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
|
||||
@@ -513,7 +513,9 @@ select_minio_bio (struct multipath * mp)
|
||||
extern int
|
||||
select_minio (struct multipath * mp)
|
||||
{
|
||||
- if (conf->dmrq)
|
||||
+ unsigned int minv_dmrq[3] = {1, 1, 0};
|
||||
+
|
||||
+ if (VERSION_GE(conf->version, minv_dmrq))
|
||||
return select_minio_rq(mp);
|
||||
else
|
||||
return select_minio_bio(mp);
|
||||
@@ -674,3 +676,28 @@ select_reservation_key (struct multipath
|
||||
return 0;
|
||||
}
|
||||
|
||||
+extern int
|
||||
+select_retain_hwhandler (struct multipath * mp)
|
||||
+{
|
||||
+ unsigned int minv_dm_retain[3] = {1, 5, 0};
|
||||
+
|
||||
+ if (!VERSION_GE(conf->version, minv_dm_retain)) {
|
||||
+ mp->retain_hwhandler = RETAIN_HWHANDLER_OFF;
|
||||
+ condlog(3, "%s: retain_attached_hw_hander disabled (requires kernel version >= 1.5.0)", mp->alias);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ 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);
|
||||
@ -294,4 +333,94 @@ Index: multipath-tools-120821/libmultipath/propsel.h
|
||||
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);
|
||||
+int select_retain_hwhandler (struct multipath * mp);
|
||||
Index: multipath-tools-120821/libmultipath/devmapper.c
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/devmapper.c
|
||||
+++ multipath-tools-120821/libmultipath/devmapper.c
|
||||
@@ -98,12 +98,6 @@ dm_init(void) {
|
||||
dm_log_init_verbose(conf ? conf->verbosity + 3 : 0);
|
||||
}
|
||||
|
||||
-#define VERSION_GE(v, minv) ( \
|
||||
- (v[0] > minv[0]) || \
|
||||
- ((v[0] == minv[0]) && (v[1] > minv[1])) || \
|
||||
- ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2])) \
|
||||
-)
|
||||
-
|
||||
static int
|
||||
dm_lib_prereq (void)
|
||||
{
|
||||
@@ -126,7 +120,7 @@ dm_lib_prereq (void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
-static int
|
||||
+int
|
||||
dm_drv_version (unsigned int * version, char * str)
|
||||
{
|
||||
int r = 2;
|
||||
@@ -135,6 +129,10 @@ dm_drv_version (unsigned int * version,
|
||||
struct dm_versions *last_target;
|
||||
unsigned int *v;
|
||||
|
||||
+ version[0] = 0;
|
||||
+ version[1] = 0;
|
||||
+ version[2] = 0;
|
||||
+
|
||||
if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
|
||||
return 1;
|
||||
|
||||
@@ -169,28 +167,6 @@ out:
|
||||
return r;
|
||||
}
|
||||
|
||||
-int
|
||||
-dm_drv_get_rq (void)
|
||||
-{
|
||||
- unsigned int minv_dmrq[3] = {1, 1, 0};
|
||||
- unsigned int version[3] = {0, 0, 0};
|
||||
- unsigned int * v = version;
|
||||
-
|
||||
- if (dm_drv_version(v, TGT_MPATH)) {
|
||||
- /* in doubt return least capable */
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- /* test request based multipath capability */
|
||||
- if VERSION_GE(v, minv_dmrq) {
|
||||
- condlog(3, "activate request-based multipathing mode "
|
||||
- "(driver >= v%u.%u.%u)",
|
||||
- minv_dmrq[0], minv_dmrq[1], minv_dmrq[2]);
|
||||
- return 1;
|
||||
- }
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static int
|
||||
dm_drv_prereq (void)
|
||||
{
|
||||
Index: multipath-tools-120821/libmultipath/devmapper.h
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/devmapper.h
|
||||
+++ multipath-tools-120821/libmultipath/devmapper.h
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
void dm_init(void);
|
||||
int dm_prereq (void);
|
||||
-int dm_drv_get_rq (void);
|
||||
+int dm_drv_version (unsigned int * version, char * str);
|
||||
int dm_simplecmd_flush (int, const char *, int);
|
||||
int dm_simplecmd_noflush (int, const char *);
|
||||
int dm_addmap_create (struct multipath *mpp, char *params);
|
||||
@@ -46,4 +46,10 @@ int dm_setgeometry(struct multipath *mpp
|
||||
void udev_wait(unsigned int c);
|
||||
void udev_set_sync_support(int c);
|
||||
|
||||
+#define VERSION_GE(v, minv) ( \
|
||||
+ (v[0] > minv[0]) || \
|
||||
+ ((v[0] == minv[0]) && (v[1] > minv[1])) || \
|
||||
+ ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2])) \
|
||||
+)
|
||||
+
|
||||
#endif /* _DEVMAPPER_H */
|
||||
|
@ -1,50 +0,0 @@
|
||||
---
|
||||
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",
|
319
0019-RH-detect-prio.patch
Normal file
319
0019-RH-detect-prio.patch
Normal file
@ -0,0 +1,319 @@
|
||||
---
|
||||
libmultipath/Makefile | 2 -
|
||||
libmultipath/config.c | 3 +
|
||||
libmultipath/config.h | 2 +
|
||||
libmultipath/defaults.h | 1
|
||||
libmultipath/dict.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
libmultipath/discovery.c | 1
|
||||
libmultipath/propsel.c | 41 ++++++++++++++++++++++++++
|
||||
libmultipath/propsel.h | 1
|
||||
libmultipath/structs.h | 7 ++++
|
||||
9 files changed, 131 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: multipath-tools-120821/libmultipath/config.c
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/config.c
|
||||
+++ multipath-tools-120821/libmultipath/config.c
|
||||
@@ -331,6 +331,7 @@ merge_hwe (struct hwentry * dst, struct
|
||||
merge_num(dev_loss);
|
||||
merge_num(user_friendly_names);
|
||||
merge_num(retain_hwhandler);
|
||||
+ merge_num(detect_prio);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -391,6 +392,7 @@ store_hwe (vector hwtable, struct hwentr
|
||||
hwe->dev_loss = dhwe->dev_loss;
|
||||
hwe->user_friendly_names = dhwe->user_friendly_names;
|
||||
hwe->retain_hwhandler = dhwe->retain_hwhandler;
|
||||
+ hwe->detect_prio = dhwe->detect_prio;
|
||||
|
||||
if (dhwe->bl_product && !(hwe->bl_product = set_param_str(dhwe->bl_product)))
|
||||
goto out;
|
||||
@@ -532,6 +534,7 @@ load_config (char * file)
|
||||
conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;
|
||||
conf->fast_io_fail = 5;
|
||||
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
|
||||
+ conf->detect_prio = DEFAULT_DETECT_PRIO;
|
||||
|
||||
/*
|
||||
* preload default hwtable
|
||||
Index: multipath-tools-120821/libmultipath/config.h
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/config.h
|
||||
+++ multipath-tools-120821/libmultipath/config.h
|
||||
@@ -47,6 +47,7 @@ struct hwentry {
|
||||
unsigned int dev_loss;
|
||||
int user_friendly_names;
|
||||
int retain_hwhandler;
|
||||
+ int detect_prio;
|
||||
char * bl_product;
|
||||
};
|
||||
|
||||
@@ -111,6 +112,7 @@ struct config {
|
||||
uint32_t cookie;
|
||||
int reassign_maps;
|
||||
int retain_hwhandler;
|
||||
+ int detect_prio;
|
||||
unsigned int version[3];
|
||||
|
||||
char * dev;
|
||||
Index: multipath-tools-120821/libmultipath/defaults.h
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/defaults.h
|
||||
+++ multipath-tools-120821/libmultipath/defaults.h
|
||||
@@ -17,6 +17,7 @@
|
||||
#define DEFAULT_REASSIGN_MAPS 1
|
||||
#define DEFAULT_FIND_MULTIPATHS 0
|
||||
#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_OFF
|
||||
+#define DEFAULT_DETECT_PRIO DETECT_PRIO_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
|
||||
@@ -673,6 +673,29 @@ def_retain_hwhandler_handler(vector strv
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int
|
||||
+def_detect_prio_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->detect_prio = DETECT_PRIO_OFF;
|
||||
+ else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) ||
|
||||
+ (strlen(buff) == 1 && !strcmp(buff, "1")))
|
||||
+ conf->detect_prio = DETECT_PRIO_ON;
|
||||
+ else
|
||||
+ conf->detect_prio = DETECT_PRIO_UNDEF;
|
||||
+
|
||||
+ FREE(buff);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* blacklist block handlers
|
||||
*/
|
||||
@@ -1321,6 +1344,33 @@ hw_retain_hwhandler_handler(vector strve
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int
|
||||
+hw_detect_prio_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->detect_prio = DETECT_PRIO_OFF;
|
||||
+ else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) ||
|
||||
+ (strlen(buff) == 1 && !strcmp(buff, "1")))
|
||||
+ hwe->detect_prio = DETECT_PRIO_ON;
|
||||
+ else
|
||||
+ hwe->detect_prio = DETECT_PRIO_UNDEF;
|
||||
+
|
||||
+ FREE(buff);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* multipaths block handlers
|
||||
*/
|
||||
@@ -2358,6 +2408,19 @@ snprint_hw_retain_hwhandler_handler(char
|
||||
}
|
||||
|
||||
static int
|
||||
+snprint_detect_prio(char * buff, int len, void * data)
|
||||
+{
|
||||
+ struct hwentry * hwe = (struct hwentry *)data;
|
||||
+
|
||||
+ if (hwe->detect_prio == DETECT_PRIO_ON)
|
||||
+ return snprintf(buff, len, "yes");
|
||||
+ else if (hwe->detect_prio == DETECT_PRIO_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);
|
||||
@@ -2704,6 +2767,15 @@ snprint_def_retain_hwhandler_handler(cha
|
||||
}
|
||||
|
||||
static int
|
||||
+snprint_def_detect_prio(char * buff, int len, void * data)
|
||||
+{
|
||||
+ if (conf->detect_prio == DETECT_PRIO_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;
|
||||
@@ -2769,6 +2841,7 @@ init_keywords(void)
|
||||
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);
|
||||
+ install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
|
||||
__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);
|
||||
@@ -2831,6 +2904,7 @@ init_keywords(void)
|
||||
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_keyword("detect_prio", &hw_detect_prio_handler, &snprint_detect_prio);
|
||||
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
|
||||
@@ -105,6 +105,12 @@ enum retain_hwhandler_states {
|
||||
RETAIN_HWHANDLER_ON,
|
||||
};
|
||||
|
||||
+enum detect_prio_states {
|
||||
+ DETECT_PRIO_UNDEF,
|
||||
+ DETECT_PRIO_OFF,
|
||||
+ DETECT_PRIO_ON,
|
||||
+};
|
||||
+
|
||||
struct scsi_idlun {
|
||||
int dev_id;
|
||||
int host_unique_id;
|
||||
@@ -162,6 +168,7 @@ struct path {
|
||||
int failcount;
|
||||
int priority;
|
||||
int pgindex;
|
||||
+ int detect_prio;
|
||||
char * uid_attribute;
|
||||
struct prio * prio;
|
||||
struct checker checker;
|
||||
Index: multipath-tools-120821/libmultipath/propsel.c
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/propsel.c
|
||||
+++ multipath-tools-120821/libmultipath/propsel.c
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "devmapper.h"
|
||||
#include "prio.h"
|
||||
#include "discovery.h"
|
||||
+#include "prioritizers/alua_rtpg.h"
|
||||
#include <inttypes.h>
|
||||
|
||||
pgpolicyfn *pgpolicies[] = {
|
||||
@@ -379,11 +380,33 @@ select_getuid (struct path * pp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+struct prio *
|
||||
+detect_prio(struct path * pp)
|
||||
+{
|
||||
+ struct prio *prio;
|
||||
+
|
||||
+ if (get_target_port_group_support(pp->fd) > 0) {
|
||||
+ prio = prio_lookup(PRIO_ALUA);
|
||||
+ prio_set_args(prio, DEFAULT_PRIO_ARGS);
|
||||
+ return prio;
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
extern int
|
||||
select_prio (struct path * pp)
|
||||
{
|
||||
struct mpentry * mpe;
|
||||
|
||||
+ if (pp->detect_prio == DETECT_PRIO_ON) {
|
||||
+ pp->prio = detect_prio(pp);
|
||||
+ if (pp->prio) {
|
||||
+ condlog(3, "%s: prio = %s (detected setting)",
|
||||
+ pp->dev, pp->prio->name);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if ((mpe = find_mpe(pp->wwid))) {
|
||||
if (mpe->prio_name) {
|
||||
pp->prio = prio_lookup(mpe->prio_name);
|
||||
@@ -701,3 +724,21 @@ select_retain_hwhandler (struct multipat
|
||||
condlog(3, "%s: retain_attached_hw_handler = %d (compiled in default)", mp->alias, mp->retain_hwhandler);
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+extern int
|
||||
+select_detect_prio (struct path * pp)
|
||||
+{
|
||||
+ if (pp->hwe && pp->hwe->detect_prio) {
|
||||
+ pp->detect_prio = pp->hwe->detect_prio;
|
||||
+ condlog(3, "%s: detect_prio = %d (controller default)", pp->dev, pp->detect_prio);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ if (conf->detect_prio) {
|
||||
+ pp->detect_prio = conf->detect_prio;
|
||||
+ condlog(3, "%s: detect_prio = %d (config file default)", pp->dev, pp->detect_prio);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ pp->detect_prio = 0;
|
||||
+ condlog(3, "%s: detect_prio = %d (compiled in default)", pp->dev, pp->detect_prio);
|
||||
+ return 0;
|
||||
+}
|
||||
Index: multipath-tools-120821/libmultipath/Makefile
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/Makefile
|
||||
+++ multipath-tools-120821/libmultipath/Makefile
|
||||
@@ -15,7 +15,7 @@ OBJS = memory.o parser.o vector.o devmap
|
||||
pgpolicies.o debug.o regex.o defaults.o uevent.o \
|
||||
switchgroup.o uxsock.o print.o alias.o log_pthread.o \
|
||||
log.o configure.o structs_vec.o sysfs.o prio.o checkers.o \
|
||||
- lock.o waiter.o file.o wwids.o
|
||||
+ lock.o waiter.o file.o wwids.o prioritizers/alua_rtpg.o
|
||||
|
||||
LIBDM_API_FLUSH = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_no_flush' /usr/include/libdevmapper.h)
|
||||
|
||||
Index: multipath-tools-120821/libmultipath/discovery.c
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/discovery.c
|
||||
+++ multipath-tools-120821/libmultipath/discovery.c
|
||||
@@ -778,6 +778,7 @@ get_prio (struct path * pp)
|
||||
return 0;
|
||||
|
||||
if (!pp->prio) {
|
||||
+ select_detect_prio(pp);
|
||||
select_prio(pp);
|
||||
if (!pp->prio) {
|
||||
condlog(3, "%s: no prio selected", pp->dev);
|
||||
Index: multipath-tools-120821/libmultipath/propsel.h
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/propsel.h
|
||||
+++ multipath-tools-120821/libmultipath/propsel.h
|
||||
@@ -19,3 +19,4 @@ int select_fast_io_fail(struct multipath
|
||||
int select_dev_loss(struct multipath *mp);
|
||||
int select_reservation_key(struct multipath *mp);
|
||||
int select_retain_hwhandler (struct multipath * mp);
|
||||
+int select_detect_prio(struct path * pp);
|
21
0020-RH-netapp-config.patch
Normal file
21
0020-RH-netapp-config.patch
Normal file
@ -0,0 +1,21 @@
|
||||
---
|
||||
libmultipath/hwtable.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
Index: multipath-tools-120821/libmultipath/hwtable.c
|
||||
===================================================================
|
||||
--- multipath-tools-120821.orig/libmultipath/hwtable.c
|
||||
+++ multipath-tools-120821/libmultipath/hwtable.c
|
||||
@@ -871,9 +871,12 @@ static struct hwentry default_hw[] = {
|
||||
.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_args = NULL,
|
||||
+ .retain_hwhandler = RETAIN_HWHANDLER_ON,
|
||||
+ .detect_prio = DETECT_PRIO_ON,
|
||||
},
|
||||
/*
|
||||
* NEXENTA/COMSTAR controller family
|
@ -1,7 +1,7 @@
|
||||
Summary: Tools to manage multipath devices using device-mapper
|
||||
Name: device-mapper-multipath
|
||||
Version: 0.4.9
|
||||
Release: 32%{?dist}
|
||||
Release: 33%{?dist}
|
||||
License: GPL+
|
||||
Group: System Environment/Base
|
||||
URL: http://christophe.varoqui.free.fr/
|
||||
@ -24,8 +24,10 @@ 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
|
||||
# Patch0017: 0017-RH-netapp_config.patch
|
||||
Patch0018: 0018-RH-remove-config-dups.patch
|
||||
Patch0019: 0019-RH-detect-prio.patch
|
||||
Patch0020: 0020-RH-netapp-config.patch
|
||||
|
||||
# runtime
|
||||
Requires: %{name}-libs = %{version}-%{release}
|
||||
@ -94,8 +96,10 @@ kpartx manages partition creation and removal for device-mapper devices.
|
||||
%patch0014 -p1
|
||||
%patch0015 -p1
|
||||
%patch0016 -p1
|
||||
%patch0017 -p1
|
||||
# %patch0017 -p1
|
||||
%patch0018 -p1
|
||||
%patch0019 -p1
|
||||
%patch0020 -p1
|
||||
cp %{SOURCE1} .
|
||||
|
||||
%build
|
||||
@ -182,6 +186,18 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||:
|
||||
%{_mandir}/man8/kpartx.8.gz
|
||||
|
||||
%changelog
|
||||
* Wed Oct 23 2012 Benjamin Marzinski <bmarizns@redhat.com> 0.4.9-33
|
||||
- Modify 0016-RH-retain_hwhandler.patch
|
||||
* Check the dm-multipath module version, and don't enable
|
||||
retain_attached_hw_handler if the kernel doesn't support it
|
||||
- Add 0019-RH-detect-prio.patch
|
||||
* add detect_prio option, to make multipath check if the device
|
||||
supports the ALUA prio, before defaulting to the configured prio
|
||||
- Remove 0017-RH-netapp_config.patch
|
||||
- Add 0020-RH-netapp-config.patch
|
||||
* new netapp config that uses retain_attached_hw_handler and
|
||||
detect_prio to autoconfigure ALUA and non-ALUA devices.
|
||||
|
||||
* Tue Oct 2 2012 Benjamin Marzinski <bmarizns@redhat.com> 0.4.9-32
|
||||
- Modified 0018-RH-remove-config-dups.patch
|
||||
* Made modified config remove original only if the vendor/product
|
||||
|
Loading…
Reference in New Issue
Block a user