device-mapper-multipath-0.4.9-75
Add 0111-RH-dont-show-pg-timeout.patch * The kernel doesn't support pg_timeout, so multipath shouldn't bother to display it Add 0112-RHBZ-1194917-add-config_dir-option.patch * multipath will now also read its configuration from files with the .conf suffix in the directory specified by config_dir which defaults to /etc/multipath/conf.d Add 0113-RHBZ-1194917-cleanup.patch * cleanup some unnecessary code Add 0114-RHBZ-1196394-delayed-reintegration.patch * Add "delay_watch_checks" and "delay_wait_checks" options to delay reintegration of flakey paths. Add 0115-RHBZ-1198418-fix-double-free.patch * multipath was freeing the multipath alias twice if it failed to create the multipath device. Add 0116-UPBZ-1188179-dell-36xxi.patch * new builtin configurations. Add 0117-RHBZ-1198424-autodetect-clariion-alua.patch * configure multipath to automatically detect alua settings on clariion devices.
This commit is contained in:
parent
f3b1b79f2b
commit
3f562fdb0b
147
0111-RH-dont-show-pg-timeout.patch
Normal file
147
0111-RH-dont-show-pg-timeout.patch
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
---
|
||||||
|
libmultipath/dict.c | 97 ----------------------------------------------------
|
||||||
|
1 file changed, 97 deletions(-)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/dict.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/dict.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/dict.c
|
||||||
|
@@ -473,26 +473,6 @@ def_checker_timeout_handler(vector strve
|
||||||
|
static int
|
||||||
|
def_pg_timeout_handler(vector strvec)
|
||||||
|
{
|
||||||
|
- int pg_timeout;
|
||||||
|
- char * buff;
|
||||||
|
-
|
||||||
|
- buff = set_value(strvec);
|
||||||
|
-
|
||||||
|
- if (!buff)
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
- if (strlen(buff) == 4 && !strcmp(buff, "none"))
|
||||||
|
- conf->pg_timeout = -PGTIMEOUT_NONE;
|
||||||
|
- else if (sscanf(buff, "%d", &pg_timeout) == 1 && pg_timeout >= 0) {
|
||||||
|
- if (pg_timeout == 0)
|
||||||
|
- conf->pg_timeout = -PGTIMEOUT_NONE;
|
||||||
|
- else
|
||||||
|
- conf->pg_timeout = pg_timeout;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- conf->pg_timeout = PGTIMEOUT_UNDEF;
|
||||||
|
-
|
||||||
|
- FREE(buff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1358,30 +1338,6 @@ hw_minio_rq_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
hw_pg_timeout_handler(vector strvec)
|
||||||
|
{
|
||||||
|
- int pg_timeout;
|
||||||
|
- 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) == 4 && !strcmp(buff, "none"))
|
||||||
|
- hwe->pg_timeout = -PGTIMEOUT_NONE;
|
||||||
|
- else if (sscanf(buff, "%d", &pg_timeout) == 1 && pg_timeout >= 0) {
|
||||||
|
- if (pg_timeout == 0)
|
||||||
|
- hwe->pg_timeout = -PGTIMEOUT_NONE;
|
||||||
|
- else
|
||||||
|
- hwe->pg_timeout = pg_timeout;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- hwe->pg_timeout = PGTIMEOUT_UNDEF;
|
||||||
|
-
|
||||||
|
- FREE(buff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1819,29 +1775,6 @@ mp_minio_rq_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
mp_pg_timeout_handler(vector strvec)
|
||||||
|
{
|
||||||
|
- int pg_timeout;
|
||||||
|
- struct mpentry *mpe = VECTOR_LAST_SLOT(conf->mptable);
|
||||||
|
- char *buff;
|
||||||
|
-
|
||||||
|
- if (!mpe)
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
- buff = set_value(strvec);
|
||||||
|
-
|
||||||
|
- if (!buff)
|
||||||
|
- return 1;
|
||||||
|
- if (strlen(buff) == 4 && !strcmp(buff, "none"))
|
||||||
|
- mpe->pg_timeout = -PGTIMEOUT_NONE;
|
||||||
|
- else if (sscanf(buff, "%d", &pg_timeout) == 1 && pg_timeout >= 0) {
|
||||||
|
- if (pg_timeout == 0)
|
||||||
|
- mpe->pg_timeout = -PGTIMEOUT_NONE;
|
||||||
|
- else
|
||||||
|
- mpe->pg_timeout = pg_timeout;
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- mpe->pg_timeout = PGTIMEOUT_UNDEF;
|
||||||
|
-
|
||||||
|
- FREE(buff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2180,16 +2113,6 @@ snprint_mp_rr_min_io_rq (char * buff, in
|
||||||
|
static int
|
||||||
|
snprint_mp_pg_timeout (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
- struct mpentry * mpe = (struct mpentry *)data;
|
||||||
|
-
|
||||||
|
- switch (mpe->pg_timeout) {
|
||||||
|
- case PGTIMEOUT_UNDEF:
|
||||||
|
- break;
|
||||||
|
- case -PGTIMEOUT_NONE:
|
||||||
|
- return snprintf(buff, len, "\"none\"");
|
||||||
|
- default:
|
||||||
|
- return snprintf(buff, len, "%i", mpe->pg_timeout);
|
||||||
|
- }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2551,19 +2474,6 @@ snprint_hw_rr_min_io_rq (char * buff, in
|
||||||
|
static int
|
||||||
|
snprint_hw_pg_timeout (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
- struct hwentry * hwe = (struct hwentry *)data;
|
||||||
|
-
|
||||||
|
- if (!hwe->pg_timeout)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- switch (hwe->pg_timeout) {
|
||||||
|
- case PGTIMEOUT_UNDEF:
|
||||||
|
- break;
|
||||||
|
- case -PGTIMEOUT_NONE:
|
||||||
|
- return snprintf(buff, len, "\"none\"");
|
||||||
|
- default:
|
||||||
|
- return snprintf(buff, len, "%i", hwe->pg_timeout);
|
||||||
|
- }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2895,13 +2805,6 @@ snprint_def_checker_timeout (char *buff,
|
||||||
|
static int
|
||||||
|
snprint_def_pg_timeout (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
- switch (conf->pg_timeout) {
|
||||||
|
- case PGTIMEOUT_UNDEF:
|
||||||
|
- case -PGTIMEOUT_NONE:
|
||||||
|
- return snprintf(buff, len, "\"none\"");
|
||||||
|
- default:
|
||||||
|
- return snprintf(buff, len, "%i", conf->pg_timeout);
|
||||||
|
- }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
616
0112-RHBZ-1194917-add-config_dir-option.patch
Normal file
616
0112-RHBZ-1194917-add-config_dir-option.patch
Normal file
@ -0,0 +1,616 @@
|
|||||||
|
---
|
||||||
|
libmultipath/config.c | 56 +++++++++++++++++++++++++++++++-
|
||||||
|
libmultipath/config.h | 2 +
|
||||||
|
libmultipath/defaults.h | 1
|
||||||
|
libmultipath/dict.c | 69 +++++++++++++++++++++++++++++++++++----
|
||||||
|
libmultipath/parser.c | 78 +++++++++++++++++++++++----------------------
|
||||||
|
libmultipath/parser.h | 3 -
|
||||||
|
multipath.conf.annotated | 10 +++++
|
||||||
|
multipath.conf.defaults | 1
|
||||||
|
multipath/multipath.conf.5 | 7 ++++
|
||||||
|
9 files changed, 179 insertions(+), 48 deletions(-)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/parser.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/parser.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/parser.c
|
||||||
|
@@ -18,6 +18,7 @@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <syslog.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
|
||||||
|
#include "parser.h"
|
||||||
|
#include "memory.h"
|
||||||
|
@@ -453,14 +454,15 @@ set_value(vector strvec)
|
||||||
|
/* non-recursive configuration stream handler */
|
||||||
|
static int kw_level = 0;
|
||||||
|
|
||||||
|
-int warn_on_duplicates(vector uniques, char *str)
|
||||||
|
+int warn_on_duplicates(vector uniques, char *str, char *file)
|
||||||
|
{
|
||||||
|
char *tmp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
vector_foreach_slot(uniques, tmp, i) {
|
||||||
|
if (!strcmp(str, tmp)) {
|
||||||
|
- condlog(1, "multipath.conf line %d, duplicate keyword: %s", line_nr, str);
|
||||||
|
+ condlog(1, "%s line %d, duplicate keyword: %s",
|
||||||
|
+ file, line_nr, str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -496,65 +498,70 @@ is_sublevel_keyword(char *str)
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
-validate_config_strvec(vector strvec)
|
||||||
|
+validate_config_strvec(vector strvec, char *file)
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
str = VECTOR_SLOT(strvec, 0);
|
||||||
|
if (str == NULL) {
|
||||||
|
- condlog(0, "can't parse option on line %d of config file",
|
||||||
|
- line_nr);
|
||||||
|
+ condlog(0, "can't parse option on line %d of %s",
|
||||||
|
+ line_nr, file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (*str == '}') {
|
||||||
|
if (VECTOR_SIZE(strvec) > 1)
|
||||||
|
- condlog(0, "ignoring extra data starting with '%s' on line %d of config file", (char *)VECTOR_SLOT(strvec, 1), line_nr);
|
||||||
|
+ condlog(0, "ignoring extra data starting with '%s' on line %d of %s", (char *)VECTOR_SLOT(strvec, 1), line_nr, file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (*str == '{') {
|
||||||
|
- condlog(0, "invalid keyword '%s' on line %d of config file", str, line_nr);
|
||||||
|
+ condlog(0, "invalid keyword '%s' on line %d of %s",
|
||||||
|
+ str, line_nr, file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (is_sublevel_keyword(str)) {
|
||||||
|
str = VECTOR_SLOT(strvec, 1);
|
||||||
|
if (str == NULL)
|
||||||
|
- condlog(0, "missing '{' on line %d of config file", line_nr);
|
||||||
|
+ condlog(0, "missing '{' on line %d of %s",
|
||||||
|
+ line_nr, file);
|
||||||
|
else if (*str != '{')
|
||||||
|
- condlog(0, "expecting '{' on line %d of config file. found '%s'", line_nr, str);
|
||||||
|
+ condlog(0, "expecting '{' on line %d of %s. found '%s'",
|
||||||
|
+ line_nr, file, str);
|
||||||
|
else if (VECTOR_SIZE(strvec) > 2)
|
||||||
|
- condlog(0, "ignoring extra data starting with '%s' on line %d of config file", (char *)VECTOR_SLOT(strvec, 2), line_nr);
|
||||||
|
+ condlog(0, "ignoring extra data starting with '%s' on line %d of %s", (char *)VECTOR_SLOT(strvec, 2), line_nr, file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
str = VECTOR_SLOT(strvec, 1);
|
||||||
|
if (str == NULL) {
|
||||||
|
- condlog(0, "missing value for option '%s' on line %d of config file", (char *)VECTOR_SLOT(strvec, 0), line_nr);
|
||||||
|
+ condlog(0, "missing value for option '%s' on line %d of %s",
|
||||||
|
+ (char *)VECTOR_SLOT(strvec, 0), line_nr, file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (*str != '"') {
|
||||||
|
if (VECTOR_SIZE(strvec) > 2)
|
||||||
|
- condlog(0, "ignoring extra data starting with '%s' on line %d of config file", (char *)VECTOR_SLOT(strvec, 2), line_nr);
|
||||||
|
+ condlog(0, "ignoring extra data starting with '%s' on line %d of %s", (char *)VECTOR_SLOT(strvec, 2), line_nr, file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (i = 2; i < VECTOR_SIZE(strvec); i++) {
|
||||||
|
str = VECTOR_SLOT(strvec, i);
|
||||||
|
if (str == NULL) {
|
||||||
|
- condlog(0, "can't parse value on line %d of config file", line_nr);
|
||||||
|
+ condlog(0, "can't parse value on line %d of %s",
|
||||||
|
+ line_nr, file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (*str == '"') {
|
||||||
|
if (VECTOR_SIZE(strvec) > i + 1)
|
||||||
|
- condlog(0, "ignoring extra data starting with '%s' on line %d of config file", (char *)VECTOR_SLOT(strvec, (i + 1)), line_nr);
|
||||||
|
+ condlog(0, "ignoring extra data starting with '%s' on line %d of %s", (char *)VECTOR_SLOT(strvec, (i + 1)), line_nr, file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- condlog(0, "missing closing quotes on line %d of config file",
|
||||||
|
- line_nr);
|
||||||
|
+ condlog(0, "missing closing quotes on line %d of %s",
|
||||||
|
+ line_nr, file);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int
|
||||||
|
-process_stream(vector keywords)
|
||||||
|
+static int
|
||||||
|
+process_stream(vector keywords, char *file)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int r = 0;
|
||||||
|
@@ -583,7 +590,7 @@ process_stream(vector keywords)
|
||||||
|
if (!strvec)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- if (validate_config_strvec(strvec) != 0) {
|
||||||
|
+ if (validate_config_strvec(strvec, file) != 0) {
|
||||||
|
free_strvec(strvec);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -595,8 +602,8 @@ process_stream(vector keywords)
|
||||||
|
free_strvec(strvec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
- condlog(0, "unmatched '%s' at line %d of config file",
|
||||||
|
- EOB, line_nr);
|
||||||
|
+ condlog(0, "unmatched '%s' at line %d of %s",
|
||||||
|
+ EOB, line_nr, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < VECTOR_SIZE(keywords); i++) {
|
||||||
|
@@ -604,7 +611,7 @@ process_stream(vector keywords)
|
||||||
|
|
||||||
|
if (!strcmp(keyword->string, str)) {
|
||||||
|
if (keyword->unique &&
|
||||||
|
- warn_on_duplicates(uniques, str)) {
|
||||||
|
+ warn_on_duplicates(uniques, str, file)) {
|
||||||
|
r = 1;
|
||||||
|
free_strvec(strvec);
|
||||||
|
goto out;
|
||||||
|
@@ -614,15 +621,15 @@ process_stream(vector keywords)
|
||||||
|
|
||||||
|
if (keyword->sub) {
|
||||||
|
kw_level++;
|
||||||
|
- r += process_stream(keyword->sub);
|
||||||
|
+ r += process_stream(keyword->sub, file);
|
||||||
|
kw_level--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i >= VECTOR_SIZE(keywords))
|
||||||
|
- condlog(1, "multipath.conf +%d, invalid keyword: %s",
|
||||||
|
- line_nr, str);
|
||||||
|
+ condlog(1, "%s line %d, invalid keyword: %s",
|
||||||
|
+ file, line_nr, str);
|
||||||
|
|
||||||
|
free_strvec(strvec);
|
||||||
|
}
|
||||||
|
@@ -646,27 +653,24 @@ int alloc_keywords(void)
|
||||||
|
|
||||||
|
/* Data initialization */
|
||||||
|
int
|
||||||
|
-init_data(char *conf_file, void (*init_keywords) (void))
|
||||||
|
+process_file(char *file)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
- stream = fopen(conf_file, "r");
|
||||||
|
+ if (!keywords) {
|
||||||
|
+ condlog(0, "No keywords alocated");
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ stream = fopen(file, "r");
|
||||||
|
if (!stream) {
|
||||||
|
- syslog(LOG_WARNING, "Configuration file open problem");
|
||||||
|
+ condlog(0, "couldn't open configuration file '%s': %s",
|
||||||
|
+ file, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Init Keywords structure */
|
||||||
|
- (*init_keywords) ();
|
||||||
|
-
|
||||||
|
-/* Dump configuration *
|
||||||
|
- vector_dump(keywords);
|
||||||
|
- dump_keywords(keywords, 0);
|
||||||
|
-*/
|
||||||
|
-
|
||||||
|
/* Stream handling */
|
||||||
|
line_nr = 0;
|
||||||
|
- r = process_stream(keywords);
|
||||||
|
+ r = process_stream(keywords, file);
|
||||||
|
fclose(stream);
|
||||||
|
//free_keywords(keywords);
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/dict.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/dict.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/dict.c
|
||||||
|
@@ -117,6 +117,8 @@ reassign_maps_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
multipath_dir_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->multipath_dir)
|
||||||
|
+ FREE(conf->multipath_dir);
|
||||||
|
conf->multipath_dir = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->multipath_dir)
|
||||||
|
@@ -128,6 +130,8 @@ multipath_dir_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_selector_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->selector)
|
||||||
|
+ FREE(conf->selector);
|
||||||
|
conf->selector = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->selector)
|
||||||
|
@@ -155,6 +159,8 @@ def_pgpolicy_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_uid_attribute_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->uid_attribute)
|
||||||
|
+ FREE(conf->uid_attribute);
|
||||||
|
conf->uid_attribute = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->uid_attribute)
|
||||||
|
@@ -166,6 +172,8 @@ def_uid_attribute_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_prio_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->prio_name)
|
||||||
|
+ FREE(conf->prio_name);
|
||||||
|
conf->prio_name = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->prio_name)
|
||||||
|
@@ -177,6 +185,8 @@ def_prio_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_alias_prefix_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->alias_prefix)
|
||||||
|
+ FREE(conf->alias_prefix);
|
||||||
|
conf->alias_prefix = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->alias_prefix)
|
||||||
|
@@ -188,6 +198,8 @@ def_alias_prefix_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_prio_args_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->prio_args)
|
||||||
|
+ FREE(conf->prio_args);
|
||||||
|
conf->prio_args = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->prio_args)
|
||||||
|
@@ -199,6 +211,8 @@ def_prio_args_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_features_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->features)
|
||||||
|
+ FREE(conf->features);
|
||||||
|
conf->features = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->features)
|
||||||
|
@@ -210,6 +224,8 @@ def_features_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
def_path_checker_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->checker_name)
|
||||||
|
+ FREE(conf->checker_name);
|
||||||
|
conf->checker_name = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->checker_name)
|
||||||
|
@@ -432,6 +448,23 @@ def_no_path_retry_handler(vector strvec)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+def_config_dir_handler(vector strvec)
|
||||||
|
+{
|
||||||
|
+ /* this is only valid in the main config file */
|
||||||
|
+ if (conf->processed_main_config)
|
||||||
|
+ return 0;
|
||||||
|
+ if (conf->config_dir)
|
||||||
|
+ FREE(conf->config_dir);
|
||||||
|
+ conf->config_dir = set_value(strvec);
|
||||||
|
+
|
||||||
|
+ if (!conf->config_dir)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
def_queue_without_daemon(vector strvec)
|
||||||
|
{
|
||||||
|
@@ -611,6 +644,8 @@ def_names_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
bindings_file_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->bindings_file)
|
||||||
|
+ FREE(conf->bindings_file);
|
||||||
|
conf->bindings_file = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->bindings_file)
|
||||||
|
@@ -622,6 +657,8 @@ bindings_file_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
wwids_file_handler(vector strvec)
|
||||||
|
{
|
||||||
|
+ if (conf->wwids_file)
|
||||||
|
+ FREE(conf->wwids_file);
|
||||||
|
conf->wwids_file = set_value(strvec);
|
||||||
|
|
||||||
|
if (!conf->wwids_file)
|
||||||
|
@@ -770,9 +807,12 @@ def_ignore_new_boot_devs_handler(vector
|
||||||
|
static int
|
||||||
|
blacklist_handler(vector strvec)
|
||||||
|
{
|
||||||
|
- conf->blist_devnode = vector_alloc();
|
||||||
|
- conf->blist_wwid = vector_alloc();
|
||||||
|
- conf->blist_device = vector_alloc();
|
||||||
|
+ if (!conf->blist_devnode)
|
||||||
|
+ conf->blist_devnode = vector_alloc();
|
||||||
|
+ if (!conf->blist_wwid)
|
||||||
|
+ conf->blist_wwid = vector_alloc();
|
||||||
|
+ if (!conf->blist_device)
|
||||||
|
+ conf->blist_device = vector_alloc();
|
||||||
|
|
||||||
|
if (!conf->blist_devnode || !conf->blist_wwid || !conf->blist_device)
|
||||||
|
return 1;
|
||||||
|
@@ -783,9 +823,12 @@ blacklist_handler(vector strvec)
|
||||||
|
static int
|
||||||
|
blacklist_exceptions_handler(vector strvec)
|
||||||
|
{
|
||||||
|
- conf->elist_devnode = vector_alloc();
|
||||||
|
- conf->elist_wwid = vector_alloc();
|
||||||
|
- conf->elist_device = vector_alloc();
|
||||||
|
+ if (!conf->elist_devnode)
|
||||||
|
+ conf->elist_devnode = vector_alloc();
|
||||||
|
+ if (!conf->elist_wwid)
|
||||||
|
+ conf->elist_wwid = vector_alloc();
|
||||||
|
+ if (!conf->elist_device)
|
||||||
|
+ conf->elist_device = vector_alloc();
|
||||||
|
|
||||||
|
if (!conf->elist_devnode || !conf->elist_wwid || !conf->elist_device)
|
||||||
|
return 1;
|
||||||
|
@@ -1480,7 +1523,8 @@ hw_deferred_remove_handler(vector strvec
|
||||||
|
static int
|
||||||
|
multipaths_handler(vector strvec)
|
||||||
|
{
|
||||||
|
- conf->mptable = vector_alloc();
|
||||||
|
+ if (!conf->mptable)
|
||||||
|
+ conf->mptable = vector_alloc();
|
||||||
|
|
||||||
|
if (!conf->mptable)
|
||||||
|
return 1;
|
||||||
|
@@ -2945,6 +2989,16 @@ snprint_def_ignore_new_boot_devs(char *
|
||||||
|
return snprintf(buff, len, "no");
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+snprint_def_config_dir (char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ if (!conf->config_dir)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return snprintf(buff, len, "\"%s\"", conf->config_dir);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
snprint_ble_simple (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
@@ -3016,6 +3070,7 @@ init_keywords(void)
|
||||||
|
install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);
|
||||||
|
install_keyword("deferred_remove", &def_deferred_remove_handler, &snprint_def_deferred_remove);
|
||||||
|
install_keyword("ignore_new_boot_devs", &def_ignore_new_boot_devs_handler, &snprint_def_ignore_new_boot_devs);
|
||||||
|
+ install_keyword("config_dir", &def_config_dir_handler, &snprint_def_config_dir);
|
||||||
|
__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);
|
||||||
|
Index: multipath-tools-130222/libmultipath/parser.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/parser.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/parser.h
|
||||||
|
@@ -76,9 +76,8 @@ extern int read_line(char *buf, int size
|
||||||
|
extern vector read_value_block(void);
|
||||||
|
extern int alloc_value_block(vector strvec, void (*alloc_func) (vector));
|
||||||
|
extern void *set_value(vector strvec);
|
||||||
|
-extern int process_stream(vector keywords);
|
||||||
|
extern int alloc_keywords(void);
|
||||||
|
-extern int init_data(char *conf_file, void (*init_keywords) (void));
|
||||||
|
+extern int process_file(char *conf_file);
|
||||||
|
extern struct keyword * find_keyword(vector v, char * name);
|
||||||
|
void set_current_keywords (vector *k);
|
||||||
|
int snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw,
|
||||||
|
Index: multipath-tools-130222/libmultipath/config.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/config.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/config.c
|
||||||
|
@@ -6,6 +6,9 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <libudev.h>
|
||||||
|
+#include <dirent.h>
|
||||||
|
+#include <limits.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
|
||||||
|
#include "checkers.h"
|
||||||
|
#include "memory.h"
|
||||||
|
@@ -556,6 +559,7 @@ free_config (struct config * conf)
|
||||||
|
|
||||||
|
if (conf->wwids_file)
|
||||||
|
FREE(conf->wwids_file);
|
||||||
|
+
|
||||||
|
if (conf->prio_name)
|
||||||
|
FREE(conf->prio_name);
|
||||||
|
|
||||||
|
@@ -567,6 +571,10 @@ free_config (struct config * conf)
|
||||||
|
|
||||||
|
if (conf->checker_name)
|
||||||
|
FREE(conf->checker_name);
|
||||||
|
+
|
||||||
|
+ if (conf->config_dir)
|
||||||
|
+ FREE(conf->config_dir);
|
||||||
|
+
|
||||||
|
if (conf->reservation_key)
|
||||||
|
FREE(conf->reservation_key);
|
||||||
|
|
||||||
|
@@ -584,6 +592,43 @@ free_config (struct config * conf)
|
||||||
|
FREE(conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* if multipath fails to process the config directory, it should continue,
|
||||||
|
+ * with just a warning message */
|
||||||
|
+static void
|
||||||
|
+process_config_dir(vector keywords, char *dir)
|
||||||
|
+{
|
||||||
|
+ struct dirent **namelist;
|
||||||
|
+ int i, n;
|
||||||
|
+ char path[LINE_MAX];
|
||||||
|
+ int old_hwtable_size;
|
||||||
|
+
|
||||||
|
+ if (dir[0] != '/') {
|
||||||
|
+ condlog(1, "config_dir '%s' must be a fully qualified path",
|
||||||
|
+ dir);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ n = scandir(dir, &namelist, NULL, alphasort);
|
||||||
|
+ if (n < 0) {
|
||||||
|
+ if (errno == ENOENT)
|
||||||
|
+ condlog(3, "No configuration dir '%s'", dir);
|
||||||
|
+ else
|
||||||
|
+ condlog(0, "couldn't open configuration dir '%s': %s",
|
||||||
|
+ dir, strerror(errno));
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ for (i = 0; i < n; i++) {
|
||||||
|
+ if (!strstr(namelist[i]->d_name, ".conf"))
|
||||||
|
+ continue;
|
||||||
|
+ old_hwtable_size = VECTOR_SIZE(conf->hwtable);
|
||||||
|
+ snprintf(path, LINE_MAX, "%s/%s", dir, namelist[i]->d_name);
|
||||||
|
+ path[LINE_MAX-1] = '\0';
|
||||||
|
+ process_file(path);
|
||||||
|
+ if (VECTOR_SIZE(conf->hwtable) > old_hwtable_size)
|
||||||
|
+ factorize_hwtable(conf->hwtable, old_hwtable_size);
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int
|
||||||
|
load_config (char * file, struct udev *udev)
|
||||||
|
{
|
||||||
|
@@ -623,6 +668,7 @@ load_config (char * file, struct udev *u
|
||||||
|
conf->hw_strmatch = 0;
|
||||||
|
conf->force_sync = 0;
|
||||||
|
conf->ignore_new_boot_devs = 0;
|
||||||
|
+ conf->processed_main_config = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* preload default hwtable
|
||||||
|
@@ -641,11 +687,12 @@ load_config (char * file, struct udev *u
|
||||||
|
*/
|
||||||
|
set_current_keywords(&conf->keywords);
|
||||||
|
alloc_keywords();
|
||||||
|
+ init_keywords();
|
||||||
|
if (filepresent(file)) {
|
||||||
|
int builtin_hwtable_size;
|
||||||
|
|
||||||
|
builtin_hwtable_size = VECTOR_SIZE(conf->hwtable);
|
||||||
|
- if (init_data(file, init_keywords)) {
|
||||||
|
+ if (process_file(file)) {
|
||||||
|
condlog(0, "error parsing config file");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -658,7 +705,6 @@ load_config (char * file, struct udev *u
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
- init_keywords();
|
||||||
|
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
|
||||||
|
condlog(0, "A default multipath.conf file is located at");
|
||||||
|
condlog(0, "/usr/share/doc/device-mapper-multipath-%d.%d.%d/multipath.conf", MULTIPATH_VERSION(VERSION_CODE));
|
||||||
|
@@ -677,6 +723,12 @@ load_config (char * file, struct udev *u
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ conf->processed_main_config = 1;
|
||||||
|
+ if (conf->config_dir == NULL)
|
||||||
|
+ conf->config_dir = set_default(DEFAULT_CONFIG_DIR);
|
||||||
|
+ if (conf->config_dir && conf->config_dir[0] != '\0')
|
||||||
|
+ process_config_dir(conf->keywords, conf->config_dir);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* fill the voids left in the config file
|
||||||
|
*/
|
||||||
|
Index: multipath-tools-130222/libmultipath/config.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/config.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/config.h
|
||||||
|
@@ -132,6 +132,7 @@ struct config {
|
||||||
|
int force_sync;
|
||||||
|
int deferred_remove;
|
||||||
|
int ignore_new_boot_devs;
|
||||||
|
+ int processed_main_config;
|
||||||
|
unsigned int version[3];
|
||||||
|
|
||||||
|
char * dev;
|
||||||
|
@@ -147,6 +148,7 @@ struct config {
|
||||||
|
char * prio_args;
|
||||||
|
char * checker_name;
|
||||||
|
char * alias_prefix;
|
||||||
|
+ char * config_dir;
|
||||||
|
unsigned char * reservation_key;
|
||||||
|
|
||||||
|
vector keywords;
|
||||||
|
Index: multipath-tools-130222/libmultipath/defaults.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/defaults.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/defaults.h
|
||||||
|
@@ -31,5 +31,6 @@
|
||||||
|
#define DEFAULT_CONFIGFILE "/etc/multipath.conf"
|
||||||
|
#define DEFAULT_BINDINGS_FILE "/etc/multipath/bindings"
|
||||||
|
#define DEFAULT_WWIDS_FILE "/etc/multipath/wwids"
|
||||||
|
+#define DEFAULT_CONFIG_DIR "/etc/multipath/conf.d"
|
||||||
|
|
||||||
|
char * set_default (char * str);
|
||||||
|
Index: multipath-tools-130222/multipath.conf.annotated
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath.conf.annotated
|
||||||
|
+++ multipath-tools-130222/multipath.conf.annotated
|
||||||
|
@@ -232,6 +232,16 @@
|
||||||
|
# # values : yes|no
|
||||||
|
# # default : no
|
||||||
|
# force_sync yes
|
||||||
|
+#
|
||||||
|
+# #
|
||||||
|
+# # name : config_dir
|
||||||
|
+# # scope : multipath & multipathd
|
||||||
|
+# # desc : If not set to an empty string, multipath will search
|
||||||
|
+# # this directory alphabetically for files ending in ".conf"
|
||||||
|
+# # and it will read configuration information from these
|
||||||
|
+# # files, just as if it was in /etc/multipath.conf
|
||||||
|
+# # values : "" or a fully qualified pathname
|
||||||
|
+# # default : "/etc/multipath/conf.d"
|
||||||
|
#}
|
||||||
|
#
|
||||||
|
##
|
||||||
|
Index: multipath-tools-130222/multipath.conf.defaults
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath.conf.defaults
|
||||||
|
+++ multipath-tools-130222/multipath.conf.defaults
|
||||||
|
@@ -26,6 +26,7 @@
|
||||||
|
# log_checker_err always
|
||||||
|
# retain_attached_hw_handler no
|
||||||
|
# detect_prio no
|
||||||
|
+# config_dir "/etc/multipath/conf.d"
|
||||||
|
#}
|
||||||
|
#blacklist {
|
||||||
|
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
|
||||||
|
Index: multipath-tools-130222/multipath/multipath.conf.5
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath/multipath.conf.5
|
||||||
|
+++ multipath-tools-130222/multipath/multipath.conf.5
|
||||||
|
@@ -430,6 +430,13 @@ still in use, it will be freed when the
|
||||||
|
to the multipath device before the last user closes it, the deferred remove
|
||||||
|
will be canceled. Default is
|
||||||
|
.I no
|
||||||
|
+.TP
|
||||||
|
+.B config_dir
|
||||||
|
+If set to anything other than "", multipath will search this directory
|
||||||
|
+alphabetically for file ending in ".conf" and it will read configuration
|
||||||
|
+information from them, just as if it was in /etc/multipath.conf. config_dir
|
||||||
|
+must either be "" or a fully qualified directory name. Default is
|
||||||
|
+.I "/etc/multipath/conf.d"
|
||||||
|
.
|
||||||
|
.SH "blacklist section"
|
||||||
|
The
|
185
0113-RHBZ-1194917-cleanup.patch
Normal file
185
0113-RHBZ-1194917-cleanup.patch
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
---
|
||||||
|
libmultipath/parser.c | 103 +++-----------------------------------------------
|
||||||
|
libmultipath/parser.h | 6 --
|
||||||
|
2 files changed, 8 insertions(+), 101 deletions(-)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/parser.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/parser.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/parser.c
|
||||||
|
@@ -280,8 +280,8 @@ out:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int
|
||||||
|
-read_line(char *buf, int size)
|
||||||
|
+static int
|
||||||
|
+read_line(FILE *stream, char *buf, int size)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
int count = 0;
|
||||||
|
@@ -297,95 +297,6 @@ read_line(char *buf, int size)
|
||||||
|
return (ch == EOF) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-vector
|
||||||
|
-read_value_block(void)
|
||||||
|
-{
|
||||||
|
- char *buf;
|
||||||
|
- int i;
|
||||||
|
- char *str = NULL;
|
||||||
|
- char *dup;
|
||||||
|
- vector vec = NULL;
|
||||||
|
- vector elements = vector_alloc();
|
||||||
|
-
|
||||||
|
- if (!elements)
|
||||||
|
- return NULL;
|
||||||
|
-
|
||||||
|
- buf = (char *) MALLOC(MAXBUF);
|
||||||
|
-
|
||||||
|
- if (!buf) {
|
||||||
|
- vector_free(elements);
|
||||||
|
- return NULL;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- while (read_line(buf, MAXBUF)) {
|
||||||
|
- vec = alloc_strvec(buf);
|
||||||
|
- if (vec) {
|
||||||
|
- str = VECTOR_SLOT(vec, 0);
|
||||||
|
- if (!strcmp(str, EOB)) {
|
||||||
|
- free_strvec(vec);
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- for (i = 0; i < VECTOR_SIZE(vec); i++) {
|
||||||
|
- str = VECTOR_SLOT(vec, i);
|
||||||
|
- dup = (char *) MALLOC(strlen(str) + 1);
|
||||||
|
- if (!dup)
|
||||||
|
- goto out;
|
||||||
|
- memcpy(dup, str, strlen(str));
|
||||||
|
-
|
||||||
|
- if (!vector_alloc_slot(elements)) {
|
||||||
|
- free_strvec(vec);
|
||||||
|
- goto out1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- vector_set_slot(elements, dup);
|
||||||
|
- }
|
||||||
|
- free_strvec(vec);
|
||||||
|
- }
|
||||||
|
- memset(buf, 0, MAXBUF);
|
||||||
|
- }
|
||||||
|
- FREE(buf);
|
||||||
|
- return elements;
|
||||||
|
-out1:
|
||||||
|
- FREE(dup);
|
||||||
|
-out:
|
||||||
|
- FREE(buf);
|
||||||
|
- vector_free(elements);
|
||||||
|
- return NULL;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-int
|
||||||
|
-alloc_value_block(vector strvec, void (*alloc_func) (vector))
|
||||||
|
-{
|
||||||
|
- char *buf;
|
||||||
|
- char *str = NULL;
|
||||||
|
- vector vec = NULL;
|
||||||
|
-
|
||||||
|
- buf = (char *) MALLOC(MAXBUF);
|
||||||
|
-
|
||||||
|
- if (!buf)
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
- while (read_line(buf, MAXBUF)) {
|
||||||
|
- vec = alloc_strvec(buf);
|
||||||
|
- if (vec) {
|
||||||
|
- str = VECTOR_SLOT(vec, 0);
|
||||||
|
- if (!strcmp(str, EOB)) {
|
||||||
|
- free_strvec(vec);
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (VECTOR_SIZE(vec))
|
||||||
|
- (*alloc_func) (vec);
|
||||||
|
-
|
||||||
|
- free_strvec(vec);
|
||||||
|
- }
|
||||||
|
- memset(buf, 0, MAXBUF);
|
||||||
|
- }
|
||||||
|
- FREE(buf);
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
void *
|
||||||
|
set_value(vector strvec)
|
||||||
|
{
|
||||||
|
@@ -561,7 +472,7 @@ validate_config_strvec(vector strvec, ch
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-process_stream(vector keywords, char *file)
|
||||||
|
+process_stream(FILE *stream, vector keywords, char *file)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int r = 0;
|
||||||
|
@@ -582,7 +493,7 @@ process_stream(vector keywords, char *fi
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- while (read_line(buf, MAXBUF)) {
|
||||||
|
+ while (read_line(stream, buf, MAXBUF)) {
|
||||||
|
line_nr++;
|
||||||
|
strvec = alloc_strvec(buf);
|
||||||
|
memset(buf,0, MAXBUF);
|
||||||
|
@@ -621,7 +532,8 @@ process_stream(vector keywords, char *fi
|
||||||
|
|
||||||
|
if (keyword->sub) {
|
||||||
|
kw_level++;
|
||||||
|
- r += process_stream(keyword->sub, file);
|
||||||
|
+ r += process_stream(stream,
|
||||||
|
+ keyword->sub, file);
|
||||||
|
kw_level--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -656,6 +568,7 @@ int
|
||||||
|
process_file(char *file)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
+ FILE *stream;
|
||||||
|
|
||||||
|
if (!keywords) {
|
||||||
|
condlog(0, "No keywords alocated");
|
||||||
|
@@ -670,7 +583,7 @@ process_file(char *file)
|
||||||
|
|
||||||
|
/* Stream handling */
|
||||||
|
line_nr = 0;
|
||||||
|
- r = process_stream(keywords, file);
|
||||||
|
+ r = process_stream(stream, keywords, file);
|
||||||
|
fclose(stream);
|
||||||
|
//free_keywords(keywords);
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/parser.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/parser.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/parser.h
|
||||||
|
@@ -47,9 +47,6 @@ struct keyword {
|
||||||
|
int unique;
|
||||||
|
};
|
||||||
|
|
||||||
|
-/* global var exported */
|
||||||
|
-FILE *stream;
|
||||||
|
-
|
||||||
|
/* Reloading helpers */
|
||||||
|
#define SET_RELOAD (reload = 1)
|
||||||
|
#define UNSET_RELOAD (reload = 0)
|
||||||
|
@@ -72,9 +69,6 @@ extern int _install_keyword(char *string
|
||||||
|
extern void dump_keywords(vector keydump, int level);
|
||||||
|
extern void free_keywords(vector keywords);
|
||||||
|
extern vector alloc_strvec(char *string);
|
||||||
|
-extern int read_line(char *buf, int size);
|
||||||
|
-extern vector read_value_block(void);
|
||||||
|
-extern int alloc_value_block(vector strvec, void (*alloc_func) (vector));
|
||||||
|
extern void *set_value(vector strvec);
|
||||||
|
extern int alloc_keywords(void);
|
||||||
|
extern int process_file(char *conf_file);
|
744
0114-RHBZ-1196394-delayed-reintegration.patch
Normal file
744
0114-RHBZ-1196394-delayed-reintegration.patch
Normal file
@ -0,0 +1,744 @@
|
|||||||
|
---
|
||||||
|
libmultipath/checkers.c | 3
|
||||||
|
libmultipath/checkers.h | 9 +
|
||||||
|
libmultipath/config.c | 4
|
||||||
|
libmultipath/config.h | 6 +
|
||||||
|
libmultipath/configure.c | 2
|
||||||
|
libmultipath/defaults.h | 1
|
||||||
|
libmultipath/dict.c | 204 ++++++++++++++++++++++++++++++++++++++++++++-
|
||||||
|
libmultipath/print.c | 2
|
||||||
|
libmultipath/propsel.c | 52 +++++++++++
|
||||||
|
libmultipath/propsel.h | 2
|
||||||
|
libmultipath/structs.h | 9 +
|
||||||
|
multipath.conf.annotated | 40 ++++++++
|
||||||
|
multipath.conf.defaults | 2
|
||||||
|
multipath/multipath.conf.5 | 27 +++++
|
||||||
|
multipathd/main.c | 34 ++++++-
|
||||||
|
15 files changed, 388 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/config.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/config.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/config.h
|
||||||
|
@@ -62,6 +62,8 @@ struct hwentry {
|
||||||
|
int retain_hwhandler;
|
||||||
|
int detect_prio;
|
||||||
|
int deferred_remove;
|
||||||
|
+ int delay_watch_checks;
|
||||||
|
+ int delay_wait_checks;
|
||||||
|
char * bl_product;
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -86,6 +88,8 @@ struct mpentry {
|
||||||
|
int attribute_flags;
|
||||||
|
int user_friendly_names;
|
||||||
|
int deferred_remove;
|
||||||
|
+ int delay_watch_checks;
|
||||||
|
+ int delay_wait_checks;
|
||||||
|
uid_t uid;
|
||||||
|
gid_t gid;
|
||||||
|
mode_t mode;
|
||||||
|
@@ -133,6 +137,8 @@ struct config {
|
||||||
|
int deferred_remove;
|
||||||
|
int ignore_new_boot_devs;
|
||||||
|
int processed_main_config;
|
||||||
|
+ int delay_watch_checks;
|
||||||
|
+ int delay_wait_checks;
|
||||||
|
unsigned int version[3];
|
||||||
|
|
||||||
|
char * dev;
|
||||||
|
Index: multipath-tools-130222/libmultipath/structs.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/structs.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/structs.h
|
||||||
|
@@ -134,6 +134,11 @@ enum scsi_protocol {
|
||||||
|
SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
|
||||||
|
};
|
||||||
|
|
||||||
|
+enum delay_checks_states {
|
||||||
|
+ DELAY_CHECKS_OFF = -1,
|
||||||
|
+ DELAY_CHECKS_UNDEF = 0,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
struct sg_id {
|
||||||
|
int host_no;
|
||||||
|
int channel;
|
||||||
|
@@ -180,6 +185,8 @@ struct path {
|
||||||
|
int priority;
|
||||||
|
int pgindex;
|
||||||
|
int detect_prio;
|
||||||
|
+ int watch_checks;
|
||||||
|
+ int wait_checks;
|
||||||
|
char * uid_attribute;
|
||||||
|
struct prio prio;
|
||||||
|
char * prio_args;
|
||||||
|
@@ -215,6 +222,8 @@ struct multipath {
|
||||||
|
int fast_io_fail;
|
||||||
|
int retain_hwhandler;
|
||||||
|
int deferred_remove;
|
||||||
|
+ int delay_watch_checks;
|
||||||
|
+ int delay_wait_checks;
|
||||||
|
unsigned int dev_loss;
|
||||||
|
uid_t uid;
|
||||||
|
gid_t gid;
|
||||||
|
Index: multipath-tools-130222/libmultipath/checkers.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/checkers.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/checkers.h
|
||||||
|
@@ -46,6 +46,14 @@
|
||||||
|
* PATH_PENDING:
|
||||||
|
* - Use: All async checkers
|
||||||
|
* - Description: Indicates a check IO is in flight.
|
||||||
|
+ *
|
||||||
|
+ * PATH_DELAYED:
|
||||||
|
+ * - Use: None of the checkers (returned if the path is being delayed before
|
||||||
|
+ * reintegration.
|
||||||
|
+ * - Description: If a path fails after being up for less than
|
||||||
|
+ * delay_watch_checks checks, when it comes back up again, it will not
|
||||||
|
+ * be marked as up until it has been up for delay_wait_checks checks.
|
||||||
|
+ * During this time, it is marked as "delayed"
|
||||||
|
*/
|
||||||
|
enum path_check_state {
|
||||||
|
PATH_WILD,
|
||||||
|
@@ -55,6 +63,7 @@ enum path_check_state {
|
||||||
|
PATH_SHAKY,
|
||||||
|
PATH_GHOST,
|
||||||
|
PATH_PENDING,
|
||||||
|
+ PATH_DELAYED,
|
||||||
|
PATH_MAX_STATE
|
||||||
|
};
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/configure.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/configure.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/configure.c
|
||||||
|
@@ -291,6 +291,8 @@ setup_map (struct multipath * mpp, char
|
||||||
|
select_reservation_key(mpp);
|
||||||
|
select_retain_hwhandler(mpp);
|
||||||
|
select_deferred_remove(mpp);
|
||||||
|
+ select_delay_watch_checks(mpp);
|
||||||
|
+ select_delay_wait_checks(mpp);
|
||||||
|
|
||||||
|
sysfs_set_scsi_tmo(mpp);
|
||||||
|
/*
|
||||||
|
Index: multipath-tools-130222/libmultipath/defaults.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/defaults.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/defaults.h
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_OFF
|
||||||
|
#define DEFAULT_DETECT_PRIO DETECT_PRIO_OFF
|
||||||
|
#define DEFAULT_DEFERRED_REMOVE DEFERRED_REMOVE_OFF
|
||||||
|
+#define DEFAULT_DELAY_CHECKS DELAY_CHECKS_OFF
|
||||||
|
|
||||||
|
#define DEFAULT_CHECKINT 5
|
||||||
|
#define MAX_CHECKINT(a) (a << 2)
|
||||||
|
Index: multipath-tools-130222/libmultipath/dict.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/dict.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/dict.c
|
||||||
|
@@ -801,6 +801,44 @@ def_ignore_new_boot_devs_handler(vector
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+def_delay_watch_checks_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->delay_watch_checks = DELAY_CHECKS_OFF;
|
||||||
|
+ else if ((conf->delay_watch_checks = atoi(buff)) < 1)
|
||||||
|
+ conf->delay_watch_checks = DELAY_CHECKS_OFF;
|
||||||
|
+
|
||||||
|
+ FREE(buff);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+def_delay_wait_checks_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->delay_wait_checks = DELAY_CHECKS_OFF;
|
||||||
|
+ else if ((conf->delay_wait_checks = atoi(buff)) < 1)
|
||||||
|
+ conf->delay_wait_checks = DELAY_CHECKS_OFF;
|
||||||
|
+
|
||||||
|
+ FREE(buff);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* blacklist block handlers
|
||||||
|
*/
|
||||||
|
@@ -1517,6 +1555,52 @@ hw_deferred_remove_handler(vector strvec
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+hw_delay_watch_checks_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->delay_watch_checks = DELAY_CHECKS_OFF;
|
||||||
|
+ else if ((hwe->delay_watch_checks = atoi(buff)) < 1)
|
||||||
|
+ hwe->delay_watch_checks = DELAY_CHECKS_OFF;
|
||||||
|
+
|
||||||
|
+ FREE(buff);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+hw_delay_wait_checks_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->delay_wait_checks = DELAY_CHECKS_OFF;
|
||||||
|
+ else if ((hwe->delay_wait_checks = atoi(buff)) < 1)
|
||||||
|
+ hwe->delay_wait_checks = DELAY_CHECKS_OFF;
|
||||||
|
+
|
||||||
|
+ FREE(buff);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* multipaths block handlers
|
||||||
|
*/
|
||||||
|
@@ -1996,6 +2080,52 @@ mp_deferred_remove_handler(vector strvec
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+mp_delay_watch_checks_handler(vector strvec)
|
||||||
|
+{
|
||||||
|
+ struct mpentry *mpe = VECTOR_LAST_SLOT(conf->mptable);
|
||||||
|
+ char * buff;
|
||||||
|
+
|
||||||
|
+ if (!mpe)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ buff = set_value(strvec);
|
||||||
|
+ if (!buff)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ if ((strlen(buff) == 2 && !strcmp(buff, "no")) ||
|
||||||
|
+ (strlen(buff) == 1 && !strcmp(buff, "0")))
|
||||||
|
+ mpe->delay_watch_checks = DELAY_CHECKS_OFF;
|
||||||
|
+ else if ((mpe->delay_watch_checks = atoi(buff)) < 1)
|
||||||
|
+ mpe->delay_watch_checks = DELAY_CHECKS_OFF;
|
||||||
|
+
|
||||||
|
+ FREE(buff);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+mp_delay_wait_checks_handler(vector strvec)
|
||||||
|
+{
|
||||||
|
+ struct mpentry *mpe = VECTOR_LAST_SLOT(conf->mptable);
|
||||||
|
+ char * buff;
|
||||||
|
+
|
||||||
|
+ if (!mpe)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ buff = set_value(strvec);
|
||||||
|
+ if (!buff)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ if ((strlen(buff) == 2 && !strcmp(buff, "no")) ||
|
||||||
|
+ (strlen(buff) == 1 && !strcmp(buff, "0")))
|
||||||
|
+ mpe->delay_wait_checks = DELAY_CHECKS_OFF;
|
||||||
|
+ else if ((mpe->delay_wait_checks = atoi(buff)) < 1)
|
||||||
|
+ mpe->delay_wait_checks = DELAY_CHECKS_OFF;
|
||||||
|
+
|
||||||
|
+ FREE(buff);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* config file keywords printing
|
||||||
|
*/
|
||||||
|
@@ -2258,6 +2388,30 @@ snprint_mp_deferred_remove (char * buff,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
+snprint_mp_delay_watch_checks(char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ struct mpentry * mpe = (struct mpentry *)data;
|
||||||
|
+
|
||||||
|
+ if (mpe->delay_watch_checks == DELAY_CHECKS_UNDEF)
|
||||||
|
+ return 0;
|
||||||
|
+ if (mpe->delay_watch_checks == DELAY_CHECKS_OFF)
|
||||||
|
+ return snprintf(buff, len, "no");
|
||||||
|
+ return snprintf(buff, len, "%d", mpe->delay_watch_checks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+snprint_mp_delay_wait_checks(char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ struct mpentry * mpe = (struct mpentry *)data;
|
||||||
|
+
|
||||||
|
+ if (mpe->delay_wait_checks == DELAY_CHECKS_UNDEF)
|
||||||
|
+ return 0;
|
||||||
|
+ if (mpe->delay_wait_checks == DELAY_CHECKS_OFF)
|
||||||
|
+ return snprintf(buff, len, "no");
|
||||||
|
+ return snprintf(buff, len, "%d", mpe->delay_wait_checks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
snprint_hw_fast_io_fail(char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
struct hwentry * hwe = (struct hwentry *)data;
|
||||||
|
@@ -2586,6 +2740,30 @@ snprint_hw_deferred_remove(char * buff,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
+snprint_hw_delay_watch_checks(char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ struct hwentry * hwe = (struct hwentry *)data;
|
||||||
|
+
|
||||||
|
+ if (hwe->delay_watch_checks == DELAY_CHECKS_UNDEF)
|
||||||
|
+ return 0;
|
||||||
|
+ if (hwe->delay_watch_checks == DELAY_CHECKS_OFF)
|
||||||
|
+ return snprintf(buff, len, "no");
|
||||||
|
+ return snprintf(buff, len, "%d", hwe->delay_watch_checks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+snprint_hw_delay_wait_checks(char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ struct hwentry * hwe = (struct hwentry *)data;
|
||||||
|
+
|
||||||
|
+ if (hwe->delay_wait_checks == DELAY_CHECKS_UNDEF)
|
||||||
|
+ return 0;
|
||||||
|
+ if (hwe->delay_wait_checks == DELAY_CHECKS_OFF)
|
||||||
|
+ return snprintf(buff, len, "no");
|
||||||
|
+ return snprintf(buff, len, "%d", hwe->delay_wait_checks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
snprint_detect_prio(char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
struct hwentry * hwe = (struct hwentry *)data;
|
||||||
|
@@ -2883,7 +3061,6 @@ snprint_def_find_multipaths (char * buff
|
||||||
|
return snprintf(buff, len, "yes");
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
static int
|
||||||
|
snprint_def_user_friendly_names (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
@@ -2989,7 +3166,6 @@ snprint_def_ignore_new_boot_devs(char *
|
||||||
|
return snprintf(buff, len, "no");
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
static int
|
||||||
|
snprint_def_config_dir (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
@@ -3000,6 +3176,24 @@ snprint_def_config_dir (char * buff, int
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
+snprint_def_delay_watch_checks(char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ if (conf->delay_watch_checks == DELAY_CHECKS_UNDEF ||
|
||||||
|
+ conf->delay_watch_checks == DELAY_CHECKS_OFF)
|
||||||
|
+ return snprintf(buff, len, "no");
|
||||||
|
+ return snprintf(buff, len, "%d", conf->delay_watch_checks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+snprint_def_delay_wait_checks(char * buff, int len, void * data)
|
||||||
|
+{
|
||||||
|
+ if (conf->delay_wait_checks == DELAY_CHECKS_UNDEF ||
|
||||||
|
+ conf->delay_wait_checks == DELAY_CHECKS_OFF)
|
||||||
|
+ return snprintf(buff, len, "no");
|
||||||
|
+ return snprintf(buff, len, "%d", conf->delay_wait_checks);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
snprint_ble_simple (char * buff, int len, void * data)
|
||||||
|
{
|
||||||
|
struct blentry * ble = (struct blentry *)data;
|
||||||
|
@@ -3071,6 +3265,8 @@ init_keywords(void)
|
||||||
|
install_keyword("deferred_remove", &def_deferred_remove_handler, &snprint_def_deferred_remove);
|
||||||
|
install_keyword("ignore_new_boot_devs", &def_ignore_new_boot_devs_handler, &snprint_def_ignore_new_boot_devs);
|
||||||
|
install_keyword("config_dir", &def_config_dir_handler, &snprint_def_config_dir);
|
||||||
|
+ install_keyword("delay_watch_checks", &def_delay_watch_checks_handler, &snprint_def_delay_watch_checks);
|
||||||
|
+ install_keyword("delay_wait_checks", &def_delay_wait_checks_handler, &snprint_def_delay_wait_checks);
|
||||||
|
__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);
|
||||||
|
@@ -3136,6 +3332,8 @@ init_keywords(void)
|
||||||
|
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_keyword("deferred_remove", &hw_deferred_remove_handler, &snprint_hw_deferred_remove);
|
||||||
|
+ install_keyword("delay_watch_checks", &hw_delay_watch_checks_handler, &snprint_hw_delay_watch_checks);
|
||||||
|
+ install_keyword("delay_wait_checks", &hw_delay_wait_checks_handler, &snprint_hw_delay_wait_checks);
|
||||||
|
install_sublevel_end();
|
||||||
|
|
||||||
|
install_keyword_root("multipaths", &multipaths_handler);
|
||||||
|
@@ -3161,5 +3359,7 @@ init_keywords(void)
|
||||||
|
install_keyword("reservation_key", &mp_reservation_key_handler, &snprint_mp_reservation_key);
|
||||||
|
install_keyword("user_friendly_names", &mp_names_handler, &snprint_mp_user_friendly_names);
|
||||||
|
install_keyword("deferred_remove", &mp_deferred_remove_handler, &snprint_mp_deferred_remove);
|
||||||
|
+ install_keyword("delay_watch_checks", &mp_delay_watch_checks_handler, &snprint_mp_delay_watch_checks);
|
||||||
|
+ install_keyword("delay_wait_checks", &mp_delay_wait_checks_handler, &snprint_mp_delay_wait_checks);
|
||||||
|
install_sublevel_end();
|
||||||
|
}
|
||||||
|
Index: multipath-tools-130222/libmultipath/print.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/print.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/print.c
|
||||||
|
@@ -336,6 +336,8 @@ snprint_chk_state (char * buff, size_t l
|
||||||
|
return snprintf(buff, len, "shaky");
|
||||||
|
case PATH_GHOST:
|
||||||
|
return snprintf(buff, len, "ghost");
|
||||||
|
+ case PATH_DELAYED:
|
||||||
|
+ return snprintf(buff, len, "delayed");
|
||||||
|
default:
|
||||||
|
return snprintf(buff, len, "undef");
|
||||||
|
}
|
||||||
|
Index: multipath-tools-130222/libmultipath/propsel.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/propsel.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/propsel.c
|
||||||
|
@@ -788,3 +788,55 @@ select_detect_prio (struct path * pp)
|
||||||
|
condlog(3, "%s: detect_prio = %d (compiled in default)", pp->dev, pp->detect_prio);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+extern int
|
||||||
|
+select_delay_watch_checks (struct multipath * mp)
|
||||||
|
+{
|
||||||
|
+ if (mp->mpe && mp->mpe->delay_watch_checks != DELAY_CHECKS_UNDEF) {
|
||||||
|
+ mp->delay_watch_checks = mp->mpe->delay_watch_checks;
|
||||||
|
+ condlog(3, "delay_watch_checks = %i (multipath setting)",
|
||||||
|
+ mp->delay_watch_checks);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (mp->hwe && mp->hwe->delay_watch_checks != DELAY_CHECKS_UNDEF) {
|
||||||
|
+ mp->delay_watch_checks = mp->hwe->delay_watch_checks;
|
||||||
|
+ condlog(3, "delay_watch_checks = %i (controler setting)",
|
||||||
|
+ mp->delay_watch_checks);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (conf->delay_watch_checks != DELAY_CHECKS_UNDEF) {
|
||||||
|
+ mp->delay_watch_checks = conf->delay_watch_checks;
|
||||||
|
+ condlog(3, "delay_watch_checks = %i (config file default)",
|
||||||
|
+ mp->delay_watch_checks);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ mp->delay_watch_checks = DEFAULT_DELAY_CHECKS;
|
||||||
|
+ condlog(3, "delay_watch_checks = DISABLED (internal default)");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+extern int
|
||||||
|
+select_delay_wait_checks (struct multipath * mp)
|
||||||
|
+{
|
||||||
|
+ if (mp->mpe && mp->mpe->delay_wait_checks != DELAY_CHECKS_UNDEF) {
|
||||||
|
+ mp->delay_wait_checks = mp->mpe->delay_wait_checks;
|
||||||
|
+ condlog(3, "delay_wait_checks = %i (multipath setting)",
|
||||||
|
+ mp->delay_wait_checks);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (mp->hwe && mp->hwe->delay_wait_checks != DELAY_CHECKS_UNDEF) {
|
||||||
|
+ mp->delay_wait_checks = mp->hwe->delay_wait_checks;
|
||||||
|
+ condlog(3, "delay_wait_checks = %i (controler setting)",
|
||||||
|
+ mp->delay_wait_checks);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ if (conf->delay_wait_checks != DELAY_CHECKS_UNDEF) {
|
||||||
|
+ mp->delay_wait_checks = conf->delay_wait_checks;
|
||||||
|
+ condlog(3, "delay_wait_checks = %i (config file default)",
|
||||||
|
+ mp->delay_wait_checks);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ mp->delay_wait_checks = DEFAULT_DELAY_CHECKS;
|
||||||
|
+ condlog(3, "delay_wait_checks = DISABLED (internal default)");
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
Index: multipath-tools-130222/libmultipath/propsel.h
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/propsel.h
|
||||||
|
+++ multipath-tools-130222/libmultipath/propsel.h
|
||||||
|
@@ -21,3 +21,5 @@ int select_reservation_key(struct multip
|
||||||
|
int select_retain_hwhandler (struct multipath * mp);
|
||||||
|
int select_detect_prio(struct path * pp);
|
||||||
|
int select_deferred_remove(struct multipath *mp);
|
||||||
|
+int select_delay_watch_checks (struct multipath * mp);
|
||||||
|
+int select_delay_wait_checks (struct multipath * mp);
|
||||||
|
Index: multipath-tools-130222/multipathd/main.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipathd/main.c
|
||||||
|
+++ multipath-tools-130222/multipathd/main.c
|
||||||
|
@@ -188,7 +188,8 @@ sync_map_state(struct multipath *mpp)
|
||||||
|
vector_foreach_slot (mpp->pg, pgp, i){
|
||||||
|
vector_foreach_slot (pgp->paths, pp, j){
|
||||||
|
if (pp->state == PATH_UNCHECKED ||
|
||||||
|
- pp->state == PATH_WILD)
|
||||||
|
+ pp->state == PATH_WILD ||
|
||||||
|
+ pp->state == PATH_DELAYED)
|
||||||
|
continue;
|
||||||
|
if ((pp->dmstate == PSTATE_FAILED ||
|
||||||
|
pp->dmstate == PSTATE_UNDEF) &&
|
||||||
|
@@ -1165,6 +1166,16 @@ check_path (struct vectors * vecs, struc
|
||||||
|
if (!pp->mpp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ if ((newstate == PATH_UP || newstate == PATH_GHOST) &&
|
||||||
|
+ pp->wait_checks > 0) {
|
||||||
|
+ if (pp->mpp && pp->mpp->nr_active > 0) {
|
||||||
|
+ pp->state = PATH_DELAYED;
|
||||||
|
+ pp->wait_checks--;
|
||||||
|
+ return;
|
||||||
|
+ } else
|
||||||
|
+ pp->wait_checks = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
pp->chkrstate = newstate;
|
||||||
|
if (newstate != pp->state) {
|
||||||
|
int oldstate = pp->state;
|
||||||
|
@@ -1182,9 +1193,14 @@ check_path (struct vectors * vecs, struc
|
||||||
|
* proactively fail path in the DM
|
||||||
|
*/
|
||||||
|
if (oldstate == PATH_UP ||
|
||||||
|
- oldstate == PATH_GHOST)
|
||||||
|
+ oldstate == PATH_GHOST) {
|
||||||
|
fail_path(pp, 1);
|
||||||
|
- else
|
||||||
|
+ if (pp->mpp->delay_wait_checks > 0 &&
|
||||||
|
+ pp->watch_checks > 0) {
|
||||||
|
+ pp->wait_checks = pp->mpp->delay_wait_checks;
|
||||||
|
+ pp->watch_checks = 0;
|
||||||
|
+ }
|
||||||
|
+ }else
|
||||||
|
fail_path(pp, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1211,11 +1227,15 @@ check_path (struct vectors * vecs, struc
|
||||||
|
* reinstate this path
|
||||||
|
*/
|
||||||
|
if (oldstate != PATH_UP &&
|
||||||
|
- oldstate != PATH_GHOST)
|
||||||
|
+ oldstate != PATH_GHOST) {
|
||||||
|
+ if (pp->mpp->delay_watch_checks > 0)
|
||||||
|
+ pp->watch_checks = pp->mpp->delay_watch_checks;
|
||||||
|
reinstate_path(pp, 1);
|
||||||
|
- else
|
||||||
|
+ } else {
|
||||||
|
+ if (pp->watch_checks > 0)
|
||||||
|
+ pp->watch_checks--;
|
||||||
|
reinstate_path(pp, 0);
|
||||||
|
-
|
||||||
|
+ }
|
||||||
|
new_path_up = 1;
|
||||||
|
|
||||||
|
if (oldchkrstate != PATH_UP && oldchkrstate != PATH_GHOST)
|
||||||
|
@@ -1245,6 +1265,8 @@ check_path (struct vectors * vecs, struc
|
||||||
|
else
|
||||||
|
pp->checkint = conf->max_checkint;
|
||||||
|
}
|
||||||
|
+ if (pp->watch_checks > 0)
|
||||||
|
+ pp->watch_checks--;
|
||||||
|
pp->tick = pp->checkint;
|
||||||
|
condlog(4, "%s: delay next check %is",
|
||||||
|
pp->dev_t, pp->tick);
|
||||||
|
Index: multipath-tools-130222/multipath.conf.annotated
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath.conf.annotated
|
||||||
|
+++ multipath-tools-130222/multipath.conf.annotated
|
||||||
|
@@ -242,6 +242,30 @@
|
||||||
|
# # files, just as if it was in /etc/multipath.conf
|
||||||
|
# # values : "" or a fully qualified pathname
|
||||||
|
# # default : "/etc/multipath/conf.d"
|
||||||
|
+#
|
||||||
|
+# #
|
||||||
|
+# # name : delay_watch_checks
|
||||||
|
+# # scope : multipathd
|
||||||
|
+# # desc : If set to a value greater than 0, multipathd will watch
|
||||||
|
+# # paths that have recently become valid for this many
|
||||||
|
+# # checks. If they fail again while they are being watched,
|
||||||
|
+# # when they next become valid, they will not be used until
|
||||||
|
+# # they have stayed up for delay_wait_checks checks.
|
||||||
|
+# # values : no|<n> > 0
|
||||||
|
+# # default : no
|
||||||
|
+# delay_watch_checks 12
|
||||||
|
+#
|
||||||
|
+# #
|
||||||
|
+# # name : delay_wait_checks
|
||||||
|
+# # scope : multipathd
|
||||||
|
+# # desc : If set to a value greater than 0, when a device that has
|
||||||
|
+# # recently come back online fails again within
|
||||||
|
+# # delay_watch_checks checks, the next time it comes back
|
||||||
|
+# # online, it will marked and delayed, and not used until
|
||||||
|
+# # it has passed delay_wait_checks checks.
|
||||||
|
+# # values : no|<n> > 0
|
||||||
|
+# # default : no
|
||||||
|
+# delay_wait_checks 12
|
||||||
|
#}
|
||||||
|
#
|
||||||
|
##
|
||||||
|
@@ -383,6 +407,13 @@
|
||||||
|
# #
|
||||||
|
# flush_on_last_del yes
|
||||||
|
#
|
||||||
|
+# #
|
||||||
|
+# # name : delay_watch_checks
|
||||||
|
+# # See defualts section for information.
|
||||||
|
+#
|
||||||
|
+# #
|
||||||
|
+# # name : delay_wait_checks
|
||||||
|
+# # See defualts section for information.
|
||||||
|
# }
|
||||||
|
# multipath {
|
||||||
|
# wwid 1DEC_____321816758474
|
||||||
|
@@ -566,6 +597,15 @@
|
||||||
|
# # before removing it from the system.
|
||||||
|
# # values : n > 0
|
||||||
|
# dev_loss_tmo 600
|
||||||
|
+#
|
||||||
|
+# #
|
||||||
|
+# # name : delay_watch_checks
|
||||||
|
+# # See defaults section for information.
|
||||||
|
+#
|
||||||
|
+# #
|
||||||
|
+# # name : delay_wait_checks
|
||||||
|
+# # See defaults section for information.
|
||||||
|
+#
|
||||||
|
# }
|
||||||
|
# device {
|
||||||
|
# vendor "COMPAQ "
|
||||||
|
Index: multipath-tools-130222/multipath.conf.defaults
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath.conf.defaults
|
||||||
|
+++ multipath-tools-130222/multipath.conf.defaults
|
||||||
|
@@ -27,6 +27,8 @@
|
||||||
|
# retain_attached_hw_handler no
|
||||||
|
# detect_prio no
|
||||||
|
# config_dir "/etc/multipath/conf.d"
|
||||||
|
+# delay_watch_checks no
|
||||||
|
+# delay_wait_checks no
|
||||||
|
#}
|
||||||
|
#blacklist {
|
||||||
|
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
|
||||||
|
Index: multipath-tools-130222/multipath/multipath.conf.5
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath/multipath.conf.5
|
||||||
|
+++ multipath-tools-130222/multipath/multipath.conf.5
|
||||||
|
@@ -437,6 +437,25 @@ alphabetically for file ending in ".conf
|
||||||
|
information from them, just as if it was in /etc/multipath.conf. config_dir
|
||||||
|
must either be "" or a fully qualified directory name. Default is
|
||||||
|
.I "/etc/multipath/conf.d"
|
||||||
|
+.TP
|
||||||
|
+.B delay_watch_checks
|
||||||
|
+If set to a value greater than 0, multipathd will watch paths that have
|
||||||
|
+recently become valid for this many checks. If they fail again while they are
|
||||||
|
+being watched, when they next become valid, they will not be used until they
|
||||||
|
+have stayed up for
|
||||||
|
+.I delay_wait_checks
|
||||||
|
+checks. Default is
|
||||||
|
+.I no
|
||||||
|
+.TP
|
||||||
|
+.B delay_wait_checks
|
||||||
|
+If set to a value greater than 0, when a device that has recently come back
|
||||||
|
+online fails again within
|
||||||
|
+.I delay_watch_checks
|
||||||
|
+checks, the next time it comes back online, it will marked and delayed, and not
|
||||||
|
+used until it has passed
|
||||||
|
+.I delay_wait_checks
|
||||||
|
+checks. Default is
|
||||||
|
+.I no
|
||||||
|
.
|
||||||
|
.SH "blacklist section"
|
||||||
|
The
|
||||||
|
@@ -540,6 +559,10 @@ section:
|
||||||
|
.B reservation_key
|
||||||
|
.TP
|
||||||
|
.B deferred_remove
|
||||||
|
+.TP
|
||||||
|
+.B delay_watch_checks
|
||||||
|
+.TP
|
||||||
|
+.B delay_wait_checks
|
||||||
|
.RE
|
||||||
|
.PD
|
||||||
|
.LP
|
||||||
|
@@ -632,6 +655,10 @@ section:
|
||||||
|
.B detect_prio
|
||||||
|
.TP
|
||||||
|
.B deferred_remove
|
||||||
|
+.TP
|
||||||
|
+.B delay_watch_checks
|
||||||
|
+.TP
|
||||||
|
+.B delay_wait_checks
|
||||||
|
.RE
|
||||||
|
.PD
|
||||||
|
.LP
|
||||||
|
Index: multipath-tools-130222/libmultipath/checkers.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/checkers.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/checkers.c
|
||||||
|
@@ -16,7 +16,8 @@ char *checker_state_names[] = {
|
||||||
|
"up",
|
||||||
|
"shaky",
|
||||||
|
"ghost",
|
||||||
|
- "pending"
|
||||||
|
+ "pending",
|
||||||
|
+ "delayed"
|
||||||
|
};
|
||||||
|
|
||||||
|
static LIST_HEAD(checkers);
|
||||||
|
Index: multipath-tools-130222/libmultipath/config.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/config.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/config.c
|
||||||
|
@@ -341,6 +341,8 @@ merge_hwe (struct hwentry * dst, struct
|
||||||
|
merge_num(retain_hwhandler);
|
||||||
|
merge_num(detect_prio);
|
||||||
|
merge_num(deferred_remove);
|
||||||
|
+ merge_num(delay_watch_checks);
|
||||||
|
+ merge_num(delay_wait_checks);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure features is consistent with
|
||||||
|
@@ -399,6 +401,8 @@ overwrite_hwe (struct hwentry * dst, str
|
||||||
|
overwrite_num(retain_hwhandler);
|
||||||
|
overwrite_num(detect_prio);
|
||||||
|
overwrite_num(deferred_remove);
|
||||||
|
+ overwrite_num(delay_watch_checks);
|
||||||
|
+ overwrite_num(delay_wait_checks);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure features is consistent with
|
28
0115-RHBZ-1198418-fix-double-free.patch
Normal file
28
0115-RHBZ-1198418-fix-double-free.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
multipathd/main.c | 13 +++++++++----
|
||||||
|
1 file changed, 9 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/multipathd/main.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipathd/main.c
|
||||||
|
+++ multipath-tools-130222/multipathd/main.c
|
||||||
|
@@ -310,10 +310,15 @@ ev_add_map (char * dev, char * alias, st
|
||||||
|
/*
|
||||||
|
* now we can register the map
|
||||||
|
*/
|
||||||
|
- if (map_present && (mpp = add_map_without_path(vecs, alias))) {
|
||||||
|
- sync_map_state(mpp);
|
||||||
|
- condlog(2, "%s: devmap %s registered", alias, dev);
|
||||||
|
- return 0;
|
||||||
|
+ if (map_present) {
|
||||||
|
+ if ((mpp = add_map_without_path(vecs, alias))) {
|
||||||
|
+ sync_map_state(mpp);
|
||||||
|
+ condlog(2, "%s: devmap %s registered", alias, dev);
|
||||||
|
+ return 0;
|
||||||
|
+ } else {
|
||||||
|
+ condlog(2, "%s: uev_add_map failed", dev);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
r = get_refwwid(dev, DEV_DEVMAP, vecs->pathvec, &refwwid);
|
||||||
|
|
83
0116-UPBZ-1188179-dell-36xxi.patch
Normal file
83
0116-UPBZ-1188179-dell-36xxi.patch
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 30 ++++++++++++++++++++++++++++++
|
||||||
|
multipath.conf.defaults | 26 ++++++++++++++++++++++++++
|
||||||
|
2 files changed, 56 insertions(+)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/hwtable.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/hwtable.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/hwtable.c
|
||||||
|
@@ -772,6 +772,36 @@ static struct hwentry default_hw[] = {
|
||||||
|
.prio_name = PRIO_RDAC,
|
||||||
|
.prio_args = NULL,
|
||||||
|
},
|
||||||
|
+ {
|
||||||
|
+ /* DELL MD36xxi */
|
||||||
|
+ .vendor = "DELL",
|
||||||
|
+ .product = "MD36xxi",
|
||||||
|
+ .bl_product = "Universal Xport",
|
||||||
|
+ .features = "2 pg_init_retries 50",
|
||||||
|
+ .hwhandler = "1 rdac",
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
+ .rr_weight = RR_WEIGHT_NONE,
|
||||||
|
+ .no_path_retry = 15,
|
||||||
|
+ .checker_name = RDAC,
|
||||||
|
+ .prio_name = PRIO_RDAC,
|
||||||
|
+ .prio_args = NULL,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ /* DELL MD36xxf */
|
||||||
|
+ .vendor = "DELL",
|
||||||
|
+ .product = "MD36xxf",
|
||||||
|
+ .bl_product = "Universal Xport",
|
||||||
|
+ .features = "2 pg_init_retries 50",
|
||||||
|
+ .hwhandler = "1 rdac",
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
+ .rr_weight = RR_WEIGHT_NONE,
|
||||||
|
+ .no_path_retry = 15,
|
||||||
|
+ .checker_name = RDAC,
|
||||||
|
+ .prio_name = PRIO_RDAC,
|
||||||
|
+ .prio_args = NULL,
|
||||||
|
+ },
|
||||||
|
/*
|
||||||
|
* NETAPP controller family
|
||||||
|
*
|
||||||
|
Index: multipath-tools-130222/multipath.conf.defaults
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath.conf.defaults
|
||||||
|
+++ multipath-tools-130222/multipath.conf.defaults
|
||||||
|
@@ -655,6 +655,32 @@
|
||||||
|
# no_path_retry 15
|
||||||
|
# }
|
||||||
|
# device {
|
||||||
|
+# vendor "DELL"
|
||||||
|
+# product "MD36xxi"
|
||||||
|
+# product_blacklist "Universal Xport"
|
||||||
|
+# path_grouping_policy "group_by_prio"
|
||||||
|
+# path_checker "rdac"
|
||||||
|
+# features "2 pg_init_retries 50"
|
||||||
|
+# hardware_handler "1 rdac"
|
||||||
|
+# prio "rdac"
|
||||||
|
+# failback "immediate"
|
||||||
|
+# rr_weight "uniform"
|
||||||
|
+# no_path_retry 15
|
||||||
|
+# }
|
||||||
|
+# device {
|
||||||
|
+# vendor "DELL"
|
||||||
|
+# product "MD36xxf"
|
||||||
|
+# product_blacklist "Universal Xport"
|
||||||
|
+# path_grouping_policy "group_by_prio"
|
||||||
|
+# path_checker "rdac"
|
||||||
|
+# features "2 pg_init_retries 50"
|
||||||
|
+# hardware_handler "1 rdac"
|
||||||
|
+# prio "rdac"
|
||||||
|
+# failback "immediate"
|
||||||
|
+# rr_weight "uniform"
|
||||||
|
+# no_path_retry 15
|
||||||
|
+# }
|
||||||
|
+# device {
|
||||||
|
# vendor "NETAPP"
|
||||||
|
# product "LUN.*"
|
||||||
|
# path_grouping_policy "group_by_prio"
|
31
0117-RHBZ-1198424-autodetect-clariion-alua.patch
Normal file
31
0117-RHBZ-1198424-autodetect-clariion-alua.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 2 ++
|
||||||
|
multipath.conf.defaults | 2 ++
|
||||||
|
2 files changed, 4 insertions(+)
|
||||||
|
|
||||||
|
Index: multipath-tools-130222/libmultipath/hwtable.c
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/libmultipath/hwtable.c
|
||||||
|
+++ multipath-tools-130222/libmultipath/hwtable.c
|
||||||
|
@@ -272,6 +272,8 @@ static struct hwentry default_hw[] = {
|
||||||
|
.checker_name = EMC_CLARIION,
|
||||||
|
.prio_name = PRIO_EMC,
|
||||||
|
.prio_args = NULL,
|
||||||
|
+ .retain_hwhandler = RETAIN_HWHANDLER_ON,
|
||||||
|
+ .detect_prio = DETECT_PRIO_ON,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.vendor = "EMC",
|
||||||
|
Index: multipath-tools-130222/multipath.conf.defaults
|
||||||
|
===================================================================
|
||||||
|
--- multipath-tools-130222.orig/multipath.conf.defaults
|
||||||
|
+++ multipath-tools-130222/multipath.conf.defaults
|
||||||
|
@@ -261,6 +261,8 @@
|
||||||
|
# failback immediate
|
||||||
|
# rr_weight "uniform"
|
||||||
|
# no_path_retry 60
|
||||||
|
+# retain_attached_hw_handler yes
|
||||||
|
+# detect_prio yes
|
||||||
|
# }
|
||||||
|
# device {
|
||||||
|
# vendor "EMC"
|
@ -1,7 +1,7 @@
|
|||||||
Summary: Tools to manage multipath devices using device-mapper
|
Summary: Tools to manage multipath devices using device-mapper
|
||||||
Name: device-mapper-multipath
|
Name: device-mapper-multipath
|
||||||
Version: 0.4.9
|
Version: 0.4.9
|
||||||
Release: 74%{?dist}
|
Release: 75%{?dist}
|
||||||
License: GPL+
|
License: GPL+
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
URL: http://christophe.varoqui.free.fr/
|
URL: http://christophe.varoqui.free.fr/
|
||||||
@ -118,6 +118,13 @@ Patch0107: 0107-RHBZ-1169935-no-new-devs.patch
|
|||||||
Patch0108: 0108-RHBZ-1153832-kpartx-remove-devs.patch
|
Patch0108: 0108-RHBZ-1153832-kpartx-remove-devs.patch
|
||||||
Patch0109: 0109-RH-read-only-bindings.patch
|
Patch0109: 0109-RH-read-only-bindings.patch
|
||||||
Patch0110: 0110-RHBZ-blacklist-vd-devs.patch
|
Patch0110: 0110-RHBZ-blacklist-vd-devs.patch
|
||||||
|
Patch0111: 0111-RH-dont-show-pg-timeout.patch
|
||||||
|
Patch0112: 0112-RHBZ-1194917-add-config_dir-option.patch
|
||||||
|
Patch0113: 0113-RHBZ-1194917-cleanup.patch
|
||||||
|
Patch0114: 0114-RHBZ-1196394-delayed-reintegration.patch
|
||||||
|
Patch0115: 0115-RHBZ-1198418-fix-double-free.patch
|
||||||
|
Patch0116: 0116-UPBZ-1188179-dell-36xxi.patch
|
||||||
|
Patch0117: 0117-RHBZ-1198424-autodetect-clariion-alua.patch
|
||||||
|
|
||||||
# runtime
|
# runtime
|
||||||
Requires: %{name}-libs = %{version}-%{release}
|
Requires: %{name}-libs = %{version}-%{release}
|
||||||
@ -281,6 +288,13 @@ kpartx manages partition creation and removal for device-mapper devices.
|
|||||||
%patch0108 -p1
|
%patch0108 -p1
|
||||||
%patch0109 -p1
|
%patch0109 -p1
|
||||||
%patch0110 -p1
|
%patch0110 -p1
|
||||||
|
%patch0111 -p1
|
||||||
|
%patch0112 -p1
|
||||||
|
%patch0113 -p1
|
||||||
|
%patch0114 -p1
|
||||||
|
%patch0115 -p1
|
||||||
|
%patch0116 -p1
|
||||||
|
%patch0117 -p1
|
||||||
cp %{SOURCE1} .
|
cp %{SOURCE1} .
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -388,6 +402,28 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||:
|
|||||||
%{_mandir}/man8/kpartx.8.gz
|
%{_mandir}/man8/kpartx.8.gz
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Mar 11 2015 Benjamin Marzinski <bmarzins@redhat.com> 0.4.9-75
|
||||||
|
- Add 0111-RH-dont-show-pg-timeout.patch
|
||||||
|
* The kernel doesn't support pg_timeout, so multipath shouldn't
|
||||||
|
bother to display it
|
||||||
|
- Add 0112-RHBZ-1194917-add-config_dir-option.patch
|
||||||
|
* multipath will now also read its configuration from files with
|
||||||
|
the .conf suffix in the directory specified by config_dir
|
||||||
|
which defaults to /etc/multipath/conf.d
|
||||||
|
- Add 0113-RHBZ-1194917-cleanup.patch
|
||||||
|
* cleanup some unnecessary code
|
||||||
|
- Add 0114-RHBZ-1196394-delayed-reintegration.patch
|
||||||
|
* Add "delay_watch_checks" and "delay_wait_checks" options to delay
|
||||||
|
reintegration of flakey paths.
|
||||||
|
- Add 0115-RHBZ-1198418-fix-double-free.patch
|
||||||
|
* multipath was freeing the multipath alias twice if it failed to create the
|
||||||
|
multipath device.
|
||||||
|
- Add 0116-UPBZ-1188179-dell-36xxi.patch
|
||||||
|
* new builtin configurations.
|
||||||
|
- Add 0117-RHBZ-1198424-autodetect-clariion-alua.patch
|
||||||
|
* configure multipath to automatically detect alua settings on clariion
|
||||||
|
devices.
|
||||||
|
|
||||||
* Thu Mar 05 2015 Adam Jackson <ajax@redhat.com> 0.4.9-74
|
* Thu Mar 05 2015 Adam Jackson <ajax@redhat.com> 0.4.9-74
|
||||||
- Drop sysvinit subpackage from F23+
|
- Drop sysvinit subpackage from F23+
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user