fd54c41ec0
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.
320 lines
9.9 KiB
Diff
320 lines
9.9 KiB
Diff
---
|
|
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);
|