From 91daccef68640e2e9f9a30205f19dde324201e9a Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 28 Jun 2012 12:41:03 -0500 Subject: [PATCH] Updated to latest upstream 0.4.9 code : multipath-tools-120613.tgz (git commit id: cb0f7127ba90ab5e8e71fc534a0a16cdbe96a88f) Add 0001-RH-remove_callout.patch * multipath no longer uses the getuid callout. It now gets the wwid from the udev database or the environment variables Add 0004-RH-fix-cciss-names.patch * convert cciss device names from cciss/cXdY to sysfs style cciss!cXdY Split 0009-RH-add-find-multipaths.patch into 0002-RH-add-wwids-file.patch and 0010-RH-add-find-multipaths.patch Add 0016-RH-change-configs.patch * default fast_io_fail to 5 and don't set the path selector in the builtin configs. Resolves: bz #831978 --- .gitignore | 1 + 0001-RH-fix-async-tur.patch | 242 -------- 0001-RH-remove_callout.patch | 279 +++++++++ ...aths.patch => 0002-RH-add-wwids-file.patch | 458 +++++++-------- ...over.patch => 0003-RH-add-followover.patch | 137 ++++- 0004-RH-fix-cciss-names.patch | 34 ++ 0004-RH-update-init-script.patch | 76 --- 0005-RH-cciss_id.patch | 219 ------- ...=> 0005-RH-dont_start_with_no_config.patch | 0 ...les.patch => 0006-RH-multipath.rules.patch | 23 +- ...Make-build-system-RH-Fedora-friendly.patch | 65 ++- ...-multipathd-blacklist-all-by-default.patch | 20 +- ...hconf.patch => 0009-RH-add-mpathconf.patch | 102 +--- 0010-RH-add-find-multipaths.patch | 222 +++++++ 0010-RH-check-if-multipath-owns-path.patch | 119 ---- 0011-RH-add-hp_tur-checker.patch | 26 +- ...ch => 0012-RH-RHEL5-style-partitions.patch | 0 0012-RH-update-on-show-topology.patch | 141 ----- ...=> 0013-RH-dont-remove-map-on-enomem.patch | 8 +- 0013-RH-manpage-update.patch | 169 ------ ...ch => 0014-RH-deprecate-uid-gid-mode.patch | 0 ...es.patch => 0015-RH-use-sync-support.patch | 6 +- 0016-RH-change-configs.patch | 541 ++++++++++++++++++ 0017-RH-fix-shutdown-crash.patch | 69 --- 0018-RH-warn-on-bad-dev-loss-tmo.patch | 68 --- 0020-RH-dont-remove-map-twice.patch | 17 - 0021-RH-validate-guid-partitions.patch | 24 - 0022-RH-adjust-messages.patch | 32 -- 0023-RH-manpage-update.patch | 19 - 0024-RH-libudev-monitor.patch | 218 ------- device-mapper-multipath.spec | 86 +-- sources | 2 +- 32 files changed, 1533 insertions(+), 1890 deletions(-) delete mode 100644 0001-RH-fix-async-tur.patch create mode 100644 0001-RH-remove_callout.patch rename 0009-RH-add-find-multipaths.patch => 0002-RH-add-wwids-file.patch (62%) rename 0015-RH-add-followover.patch => 0003-RH-add-followover.patch (50%) create mode 100644 0004-RH-fix-cciss-names.patch delete mode 100644 0004-RH-update-init-script.patch delete mode 100644 0005-RH-cciss_id.patch rename 0002-RH-dont_start_with_no_config.patch => 0005-RH-dont_start_with_no_config.patch (100%) rename 0003-RH-multipath.rules.patch => 0006-RH-multipath.rules.patch (79%) rename 0006-RH-Make-build-system-RH-Fedora-friendly.patch => 0007-RH-Make-build-system-RH-Fedora-friendly.patch (54%) rename 0007-RH-multipathd-blacklist-all-by-default.patch => 0008-RH-multipathd-blacklist-all-by-default.patch (78%) rename 0008-RH-add-mpathconf.patch => 0009-RH-add-mpathconf.patch (83%) create mode 100644 0010-RH-add-find-multipaths.patch delete mode 100644 0010-RH-check-if-multipath-owns-path.patch rename 0014-RH-RHEL5-style-partitions.patch => 0012-RH-RHEL5-style-partitions.patch (100%) delete mode 100644 0012-RH-update-on-show-topology.patch rename 0016-RH-dont-remove-map-on-enomem.patch => 0013-RH-dont-remove-map-on-enomem.patch (69%) delete mode 100644 0013-RH-manpage-update.patch rename 0019-RH-deprecate-uid-gid-mode.patch => 0014-RH-deprecate-uid-gid-mode.patch (100%) rename 0025-RHBZ-822714-update-nodes.patch => 0015-RH-use-sync-support.patch (65%) create mode 100644 0016-RH-change-configs.patch delete mode 100644 0017-RH-fix-shutdown-crash.patch delete mode 100644 0018-RH-warn-on-bad-dev-loss-tmo.patch delete mode 100644 0020-RH-dont-remove-map-twice.patch delete mode 100644 0021-RH-validate-guid-partitions.patch delete mode 100644 0022-RH-adjust-messages.patch delete mode 100644 0023-RH-manpage-update.patch delete mode 100644 0024-RH-libudev-monitor.patch diff --git a/.gitignore b/.gitignore index b1123c3..dbde256 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ multipath-tools-091027.tar.gz /multipath-tools-120123.tgz +/multipath-tools-120613.tgz diff --git a/0001-RH-fix-async-tur.patch b/0001-RH-fix-async-tur.patch deleted file mode 100644 index fd51535..0000000 --- a/0001-RH-fix-async-tur.patch +++ /dev/null @@ -1,242 +0,0 @@ ---- - libmultipath/checkers/tur.c | 85 +++++++++++++++++++++++++++++++++----------- - libmultipath/discovery.c | 1 - 2 files changed, 65 insertions(+), 21 deletions(-) - -Index: multipath-tools-120123/libmultipath/checkers/tur.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/checkers/tur.c -+++ multipath-tools-120123/libmultipath/checkers/tur.c -@@ -35,10 +35,15 @@ struct tur_checker_context { - dev_t devt; - int state; - int running; -- time_t timeout; -+ int fd; -+ unsigned int timeout; -+ time_t time; - pthread_t thread; - pthread_mutex_t lock; - pthread_cond_t active; -+ pthread_spinlock_t hldr_lock; -+ int holders; -+ char message[CHECKER_MSG_LEN]; - }; - - #define TUR_DEVT(c) major((c)->devt), minor((c)->devt) -@@ -53,28 +58,49 @@ int libcheck_init (struct checker * c) - memset(ct, 0, sizeof(struct tur_checker_context)); - - ct->state = PATH_UNCHECKED; -+ ct->fd = -1; -+ ct->holders = 1; - pthread_cond_init(&ct->active, NULL); - pthread_mutex_init(&ct->lock, NULL); -+ pthread_spin_init(&ct->hldr_lock, PTHREAD_PROCESS_PRIVATE); - c->context = ct; - - return 0; - } - -+void cleanup_context(struct tur_checker_context *ct) -+{ -+ pthread_mutex_destroy(&ct->lock); -+ pthread_cond_destroy(&ct->active); -+ pthread_spin_destroy(&ct->hldr_lock); -+ free(ct); -+} -+ - void libcheck_free (struct checker * c) - { - if (c->context) { - struct tur_checker_context *ct = c->context; -+ int holders; -+ pthread_t thread; - -- pthread_mutex_destroy(&ct->lock); -- pthread_cond_destroy(&ct->active); -- free(c->context); -+ pthread_spin_lock(&ct->hldr_lock); -+ ct->holders--; -+ holders = ct->holders; -+ thread = ct->thread; -+ pthread_spin_unlock(&ct->hldr_lock); -+ if (holders) -+ pthread_cancel(thread); -+ else -+ cleanup_context(ct); - c->context = NULL; - } - return; - } - -+#define TUR_MSG(msg, fmt, args...) snprintf(msg, CHECKER_MSG_LEN, fmt, ##args); -+ - int --tur_check (struct checker * c) -+tur_check(int fd, unsigned int timeout, char *msg) - { - struct sg_io_hdr io_hdr; - unsigned char turCmdBlk[TUR_CMD_LEN] = { 0x00, 0, 0, 0, 0, 0 }; -@@ -90,10 +116,10 @@ tur_check (struct checker * c) - io_hdr.dxfer_direction = SG_DXFER_NONE; - io_hdr.cmdp = turCmdBlk; - io_hdr.sbp = sense_buffer; -- io_hdr.timeout = c->timeout; -+ io_hdr.timeout = timeout; - io_hdr.pack_id = 0; -- if (ioctl(c->fd, SG_IO, &io_hdr) < 0) { -- MSG(c, MSG_TUR_DOWN); -+ if (ioctl(fd, SG_IO, &io_hdr) < 0) { -+ TUR_MSG(msg, MSG_TUR_DOWN); - return PATH_DOWN; - } - if ((io_hdr.status & 0x7e) == 0x18) { -@@ -101,7 +127,7 @@ tur_check (struct checker * c) - * SCSI-3 arrays might return - * reservation conflict on TUR - */ -- MSG(c, MSG_TUR_UP); -+ TUR_MSG(msg, MSG_TUR_UP); - return PATH_UP; - } - if (io_hdr.info & SG_INFO_OK_MASK) { -@@ -146,14 +172,14 @@ tur_check (struct checker * c) - * LOGICAL UNIT NOT ACCESSIBLE, - * TARGET PORT IN STANDBY STATE - */ -- MSG(c, MSG_TUR_GHOST); -+ TUR_MSG(msg, MSG_TUR_GHOST); - return PATH_GHOST; - } - } -- MSG(c, MSG_TUR_DOWN); -+ TUR_MSG(msg, MSG_TUR_DOWN); - return PATH_DOWN; - } -- MSG(c, MSG_TUR_UP); -+ TUR_MSG(msg, MSG_TUR_UP); - return PATH_UP; - } - -@@ -162,18 +188,25 @@ tur_check (struct checker * c) - - void cleanup_func(void *data) - { -+ int holders; - struct tur_checker_context *ct = data; -+ pthread_spin_lock(&ct->hldr_lock); -+ ct->holders--; -+ holders = ct->holders; - ct->thread = 0; -+ pthread_spin_unlock(&ct->hldr_lock); -+ if (!holders) -+ cleanup_context(ct); - } - - void *tur_thread(void *ctx) - { -- struct checker *c = ctx; -- struct tur_checker_context *ct = c->context; -+ struct tur_checker_context *ct = ctx; - int state; - - condlog(3, "%d:%d: tur checker starting up", TUR_DEVT(ct)); - -+ ct->message[0] = '\0'; - /* This thread can be canceled, so setup clean up */ - tur_thread_cleanup_push(ct) - -@@ -182,7 +215,7 @@ void *tur_thread(void *ctx) - ct->state = PATH_PENDING; - pthread_mutex_unlock(&ct->lock); - -- state = tur_check(c); -+ state = tur_check(ct->fd, ct->timeout, ct->message); - - /* TUR checker done */ - pthread_mutex_lock(&ct->lock); -@@ -213,7 +246,7 @@ void tur_set_async_timeout(struct checke - struct timeval now; - - gettimeofday(&now, NULL); -- ct->timeout = now.tv_sec + c->timeout; -+ ct->time = now.tv_sec + c->timeout; - } - - int tur_check_async_timeout(struct checker *c) -@@ -222,7 +255,7 @@ int tur_check_async_timeout(struct check - struct timeval now; - - gettimeofday(&now, NULL); -- return (now.tv_sec > ct->timeout); -+ return (now.tv_sec > ct->time); - } - - extern int -@@ -242,7 +275,7 @@ libcheck_check (struct checker * c) - ct->devt = sb.st_rdev; - - if (c->sync) -- return tur_check(c); -+ return tur_check(c->fd, c->timeout, c->message); - - /* - * Async mode -@@ -276,6 +309,8 @@ libcheck_check (struct checker * c) - /* TUR checker done */ - ct->running = 0; - tur_status = ct->state; -+ strncpy(c->message, ct->message, CHECKER_MSG_LEN); -+ c->message[CHECKER_MSG_LEN - 1] = '\0'; - } - pthread_mutex_unlock(&ct->lock); - } else { -@@ -284,24 +319,32 @@ libcheck_check (struct checker * c) - pthread_mutex_unlock(&ct->lock); - condlog(3, "%d:%d: tur thread not responding, " - "using sync mode", TUR_DEVT(ct)); -- return tur_check(c); -+ return tur_check(c->fd, c->timeout, c->message); - } - /* Start new TUR checker */ - ct->state = PATH_UNCHECKED; -+ ct->fd = c->fd; -+ ct->timeout = c->timeout; -+ pthread_spin_lock(&ct->hldr_lock); -+ ct->holders++; -+ pthread_spin_unlock(&ct->hldr_lock); - tur_set_async_timeout(c); - setup_thread_attr(&attr, 32 * 1024, 1); -- r = pthread_create(&ct->thread, &attr, tur_thread, c); -+ r = pthread_create(&ct->thread, &attr, tur_thread, ct); - if (r) { - pthread_mutex_unlock(&ct->lock); - ct->thread = 0; -+ ct->holders--; - condlog(3, "%d:%d: failed to start tur thread, using" - " sync mode", TUR_DEVT(ct)); -- return tur_check(c); -+ return tur_check(c->fd, c->timeout, c->message); - } - pthread_attr_destroy(&attr); - tur_timeout(&tsp); - r = pthread_cond_timedwait(&ct->active, &ct->lock, &tsp); - tur_status = ct->state; -+ strncpy(c->message, ct->message,CHECKER_MSG_LEN); -+ c->message[CHECKER_MSG_LEN -1] = '\0'; - pthread_mutex_unlock(&ct->lock); - if (ct->thread && - (tur_status == PATH_PENDING || tur_status == PATH_UNCHECKED)) { -Index: multipath-tools-120123/libmultipath/discovery.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/discovery.c -+++ multipath-tools-120123/libmultipath/discovery.c -@@ -842,6 +842,7 @@ get_state (struct path * pp, int daemon) - } - checker_set_fd(c, pp->fd); - if (checker_init(c, pp->mpp?&pp->mpp->mpcontext:NULL)) { -+ memset(c, 0x0, sizeof(struct checker)); - condlog(3, "%s: checker init failed", pp->dev); - return PATH_UNCHECKED; - } diff --git a/0001-RH-remove_callout.patch b/0001-RH-remove_callout.patch new file mode 100644 index 0000000..0c03cc4 --- /dev/null +++ b/0001-RH-remove_callout.patch @@ -0,0 +1,279 @@ +--- + libmultipath/Makefile | 2 + libmultipath/callout.c | 217 ----------------------------------------------- + libmultipath/callout.h | 7 - + libmultipath/discovery.c | 1 + multipathd/main.c | 1 + 5 files changed, 1 insertion(+), 227 deletions(-) + +Index: multipath-tools-120518/libmultipath/Makefile +=================================================================== +--- multipath-tools-120518.orig/libmultipath/Makefile ++++ multipath-tools-120518/libmultipath/Makefile +@@ -9,7 +9,7 @@ DEVLIB = libmultipath.so + LIBS = $(DEVLIB).$(SONAME) + LIBDEPS = -lpthread -ldl -ldevmapper -ludev + +-OBJS = memory.o parser.o vector.o devmapper.o callout.o \ ++OBJS = memory.o parser.o vector.o devmapper.o \ + hwtable.o blacklist.o util.o dmparser.o config.o \ + structs.o discovery.o propsel.o dict.o \ + pgpolicies.o debug.o regex.o defaults.o uevent.o \ +Index: multipath-tools-120518/libmultipath/callout.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/callout.c ++++ /dev/null +@@ -1,217 +0,0 @@ +-/* +- * Source: copy of the udev package source file +- * +- * Copyrights of the source file apply +- * Copyright (c) 2004 Christophe Varoqui +- */ +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "checkers.h" +-#include "vector.h" +-#include "structs.h" +-#include "util.h" +-#include "debug.h" +- +-int execute_program(char *path, char *value, int len) +-{ +- int retval; +- int count; +- int status; +- int fds[2], null_fd; +- pid_t pid; +- char *pos; +- char arg[CALLOUT_MAX_SIZE]; +- int argc = sizeof(arg) / 2; +- char *argv[argc + 1]; +- int i; +- +- i = 0; +- +- if (strchr(path, ' ')) { +- strlcpy(arg, path, sizeof(arg)); +- pos = arg; +- while (pos != NULL && i < argc) { +- if (pos[0] == '\'') { +- /* don't separate if in apostrophes */ +- pos++; +- argv[i] = strsep(&pos, "\'"); +- while (pos[0] == ' ') +- pos++; +- } else { +- argv[i] = strsep(&pos, " "); +- } +- i++; +- } +- } else { +- argv[i++] = path; +- } +- argv[i] = NULL; +- +- retval = pipe(fds); +- +- if (retval != 0) { +- condlog(0, "error creating pipe for callout: %s", strerror(errno)); +- return -1; +- } +- +- pid = fork(); +- +- switch(pid) { +- case 0: +- /* child */ +- close(STDOUT_FILENO); +- +- /* dup write side of pipe to STDOUT */ +- if (dup(fds[1]) < 0) +- return -1; +- +- /* Ignore writes to stderr */ +- null_fd = open("/dev/null", O_WRONLY); +- if (null_fd > 0) { +- close(STDERR_FILENO); +- dup(null_fd); +- close(null_fd); +- } +- +- retval = execv(argv[0], argv); +- condlog(0, "error execing %s : %s", argv[0], strerror(errno)); +- exit(-1); +- case -1: +- condlog(0, "fork failed: %s", strerror(errno)); +- close(fds[0]); +- close(fds[1]); +- return -1; +- default: +- /* parent reads from fds[0] */ +- close(fds[1]); +- retval = 0; +- i = 0; +- while (1) { +- count = read(fds[0], value + i, len - i-1); +- if (count <= 0) +- break; +- +- i += count; +- if (i >= len-1) { +- condlog(0, "not enough space for response from %s", argv[0]); +- retval = -1; +- break; +- } +- } +- +- if (count < 0) { +- condlog(0, "no response from %s", argv[0]); +- retval = -1; +- } +- +- if (i > 0 && value[i-1] == '\n') +- i--; +- value[i] = '\0'; +- +- wait(&status); +- close(fds[0]); +- +- retval = -1; +- if (WIFEXITED(status)) { +- status = WEXITSTATUS(status); +- if (status == 0) +- retval = 0; +- else +- condlog(0, "%s exitted with %d", argv[0], status); +- } +- else if (WIFSIGNALED(status)) +- condlog(0, "%s was terminated by signal %d", argv[0], WTERMSIG(status)); +- else +- condlog(0, "%s terminated abnormally", argv[0]); +- } +- return retval; +-} +- +-extern int +-apply_format (char * string, char * cmd, struct path * pp) +-{ +- char * pos; +- char * dst; +- char * p; +- char * q; +- int len; +- int myfree; +- +- if (!string) +- return 1; +- +- if (!cmd) +- return 1; +- +- dst = cmd; +- p = dst; +- pos = strchr(string, '%'); +- myfree = CALLOUT_MAX_SIZE; +- +- if (!pos) { +- strcpy(dst, string); +- return 0; +- } +- +- len = (int) (pos - string) + 1; +- myfree -= len; +- +- if (myfree < 2) +- return 1; +- +- snprintf(p, len, "%s", string); +- p += len - 1; +- pos++; +- +- switch (*pos) { +- case 'n': +- len = strlen(pp->dev) + 1; +- myfree -= len; +- +- if (myfree < 2) +- return 1; +- +- snprintf(p, len, "%s", pp->dev); +- for (q = p; q < p + len; q++) { +- if (q && *q == '!') +- *q = '/'; +- } +- p += len - 1; +- break; +- case 'd': +- len = strlen(pp->dev_t) + 1; +- myfree -= len; +- +- if (myfree < 2) +- return 1; +- +- snprintf(p, len, "%s", pp->dev_t); +- p += len - 1; +- break; +- default: +- break; +- } +- pos++; +- +- if (!*pos) +- return 0; +- +- len = strlen(pos) + 1; +- myfree -= len; +- +- if (myfree < 2) +- return 1; +- +- snprintf(p, len, "%s", pos); +- condlog(3, "reformated callout = %s", dst); +- return 0; +-} +- +Index: multipath-tools-120518/libmultipath/callout.h +=================================================================== +--- multipath-tools-120518.orig/libmultipath/callout.h ++++ /dev/null +@@ -1,7 +0,0 @@ +-#ifndef _CALLOUT_H +-#define _CALLOUT_H +- +-int execute_program(char *, char *, int); +-int apply_format (char *, char *, struct path *); +- +-#endif /* _CALLOUT_H */ +Index: multipath-tools-120518/libmultipath/discovery.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/discovery.c ++++ multipath-tools-120518/libmultipath/discovery.c +@@ -20,7 +20,6 @@ + #include "structs.h" + #include "config.h" + #include "blacklist.h" +-#include "callout.h" + #include "debug.h" + #include "propsel.h" + #include "sg_include.h" +Index: multipath-tools-120518/multipathd/main.c +=================================================================== +--- multipath-tools-120518.orig/multipathd/main.c ++++ multipath-tools-120518/multipathd/main.c +@@ -35,7 +35,6 @@ + #include + #include + #include +-#include + #include + #include + #include diff --git a/0009-RH-add-find-multipaths.patch b/0002-RH-add-wwids-file.patch similarity index 62% rename from 0009-RH-add-find-multipaths.patch rename to 0002-RH-add-wwids-file.patch index b706687..f3014ba 100644 --- a/0009-RH-add-find-multipaths.patch +++ b/0002-RH-add-wwids-file.patch @@ -1,24 +1,21 @@ --- libmultipath/Makefile | 2 - libmultipath/alias.c | 151 --------------------------------------- + libmultipath/alias.c | 153 --------------------------------------- libmultipath/alias.h | 1 - libmultipath/config.c | 1 - libmultipath/config.h | 1 - libmultipath/configure.c | 14 +++ - libmultipath/defaults.h | 2 - libmultipath/dict.c | 34 ++++++++ - libmultipath/file.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++ + libmultipath/configure.c | 3 + libmultipath/defaults.h | 1 + libmultipath/discovery.c | 2 + libmultipath/file.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++ libmultipath/file.h | 11 ++ - libmultipath/finder.c | 165 +++++++++++++++++++++++++++++++++++++++++++ - libmultipath/finder.h | 18 ++++ - multipath/main.c | 4 - - multipathd/main.c | 6 + - 14 files changed, 437 insertions(+), 151 deletions(-) + libmultipath/wwids.c | 139 ++++++++++++++++++++++++++++++++++++ + libmultipath/wwids.h | 18 ++++ + multipath/main.c | 37 ++++++++- + 11 files changed, 389 insertions(+), 158 deletions(-) -Index: multipath-tools-111219/libmultipath/alias.c +Index: multipath-tools-120518/libmultipath/alias.c =================================================================== ---- multipath-tools-111219.orig/libmultipath/alias.c -+++ multipath-tools-111219/libmultipath/alias.c +--- multipath-tools-120518.orig/libmultipath/alias.c ++++ multipath-tools-120518/libmultipath/alias.c @@ -3,19 +3,16 @@ * Copyright (c) 2005 Benjamin Marzinski, Redhat */ @@ -40,7 +37,7 @@ Index: multipath-tools-111219/libmultipath/alias.c /* -@@ -36,148 +33,6 @@ +@@ -36,150 +33,6 @@ * See the file COPYING included with this distribution for more details. */ @@ -173,7 +170,9 @@ Index: multipath-tools-111219/libmultipath/alias.c - "Cannot write header to bindings file : %s", - strerror(errno)); - /* cleanup partially written header */ -- ftruncate(fd, 0); +- if (ftruncate(fd, 0)) +- condlog(0, "Cannot truncate the header : %s", +- strerror(errno)); - goto fail; - } - fsync(fd); @@ -189,7 +188,7 @@ Index: multipath-tools-111219/libmultipath/alias.c static int format_devname(char *name, int id, int len, char *prefix) -@@ -366,7 +221,7 @@ get_user_friendly_alias(char *wwid, char +@@ -370,7 +223,7 @@ get_user_friendly_alias(char *wwid, char return NULL; } @@ -198,7 +197,7 @@ Index: multipath-tools-111219/libmultipath/alias.c if (fd < 0) return NULL; -@@ -416,7 +271,7 @@ get_user_friendly_wwid(char *alias, char +@@ -414,7 +267,7 @@ get_user_friendly_wwid(char *alias, char return NULL; } @@ -207,40 +206,28 @@ Index: multipath-tools-111219/libmultipath/alias.c if (fd < 0) return NULL; -Index: multipath-tools-111219/libmultipath/alias.h +Index: multipath-tools-120518/libmultipath/alias.h =================================================================== ---- multipath-tools-111219.orig/libmultipath/alias.h -+++ multipath-tools-111219/libmultipath/alias.h +--- multipath-tools-120518.orig/libmultipath/alias.h ++++ multipath-tools-120518/libmultipath/alias.h @@ -1,4 +1,3 @@ -#define BINDINGS_FILE_TIMEOUT 30 #define BINDINGS_FILE_HEADER \ "# Multipath bindings, Version : 1.0\n" \ "# NOTE: this file is automatically maintained by the multipath program.\n" \ -Index: multipath-tools-111219/libmultipath/config.c +Index: multipath-tools-120518/libmultipath/configure.c =================================================================== ---- multipath-tools-111219.orig/libmultipath/config.c -+++ multipath-tools-111219/libmultipath/config.c -@@ -504,6 +504,7 @@ load_config (char * file) - conf->reassign_maps = DEFAULT_REASSIGN_MAPS; - conf->checkint = DEFAULT_CHECKINT; - conf->max_checkint = MAX_CHECKINT(conf->checkint); -+ conf->find_multipaths = DEFAULT_FIND_MULTIPATHS; - - /* - * preload default hwtable -Index: multipath-tools-111219/libmultipath/configure.c -=================================================================== ---- multipath-tools-111219.orig/libmultipath/configure.c -+++ multipath-tools-111219/libmultipath/configure.c -@@ -36,6 +36,7 @@ +--- multipath-tools-120518.orig/libmultipath/configure.c ++++ multipath-tools-120518/libmultipath/configure.c +@@ -37,6 +37,7 @@ #include "prio.h" #include "util.h" #include "uxsock.h" -+#include "finder.h" ++#include "wwids.h" extern int setup_map (struct multipath * mpp, char * params, int params_size) -@@ -405,6 +406,8 @@ domap (struct multipath * mpp, char * pa +@@ -407,6 +408,8 @@ domap (struct multipath * mpp, char * pa * DM_DEVICE_CREATE, DM_DEVICE_RENAME, or DM_DEVICE_RELOAD * succeeded */ @@ -249,114 +236,22 @@ Index: multipath-tools-111219/libmultipath/configure.c if (!conf->daemon) { /* multipath client mode */ dm_switchgroup(mpp->alias, mpp->bestpg); -@@ -492,6 +495,10 @@ coalesce_paths (struct vectors * vecs, v - - memset(empty_buff, 0, WWID_SIZE); - -+ /* ignore refwwid if it's empty */ -+ if (refwwid && !strlen(refwwid)) -+ refwwid = NULL; -+ - if (force_reload) { - vector_foreach_slot (pathvec, pp1, k) { - pp1->mpp = NULL; -@@ -521,6 +528,13 @@ coalesce_paths (struct vectors * vecs, v - if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE)) - continue; - -+ /* If find_multipaths was selected check if the path is valid */ -+ if (conf->find_multipaths && !refwwid && -+ !should_multipath(pp1, pathvec)) { -+ orphan_path(pp1); -+ continue; -+ } -+ - /* - * at this point, we know we really got a new mp - */ -Index: multipath-tools-111219/libmultipath/defaults.h +Index: multipath-tools-120518/libmultipath/defaults.h =================================================================== ---- multipath-tools-111219.orig/libmultipath/defaults.h -+++ multipath-tools-111219/libmultipath/defaults.h -@@ -15,6 +15,7 @@ - #define DEFAULT_USER_FRIENDLY_NAMES 0 - #define DEFAULT_VERBOSITY 2 - #define DEFAULT_REASSIGN_MAPS 1 -+#define DEFAULT_FIND_MULTIPATHS 0 - - #define DEFAULT_CHECKINT 5 - #define MAX_CHECKINT(a) (a << 2) -@@ -24,5 +25,6 @@ +--- multipath-tools-120518.orig/libmultipath/defaults.h ++++ multipath-tools-120518/libmultipath/defaults.h +@@ -24,5 +24,6 @@ #define DEFAULT_SOCKET "/var/run/multipathd.sock" #define DEFAULT_CONFIGFILE "/etc/multipath.conf" #define DEFAULT_BINDINGS_FILE "/etc/multipath/bindings" +#define DEFAULT_WWIDS_FILE "/etc/multipath/wwids" char * set_default (char * str); -Index: multipath-tools-111219/libmultipath/dict.c -=================================================================== ---- multipath-tools-111219.orig/libmultipath/dict.c -+++ multipath-tools-111219/libmultipath/dict.c -@@ -544,6 +544,27 @@ def_log_checker_err_handler(vector strve - } - - static int -+def_find_multipaths_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->find_multipaths = 0; -+ else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) || -+ (strlen(buff) == 1 && !strcmp(buff, "1"))) -+ conf->find_multipaths = 1; -+ -+ FREE(buff); -+ return 0; -+} -+ -+static int - names_handler(vector strvec) - { - char * buff; -@@ -2365,6 +2386,18 @@ snprint_def_log_checker_err (char * buff - } - - static int -+snprint_def_find_multipaths (char * buff, int len, void * data) -+{ -+ if (conf->find_multipaths == DEFAULT_FIND_MULTIPATHS) -+ return 0; -+ if (!conf->find_multipaths) -+ return snprintf(buff, len, "no"); -+ -+ return snprintf(buff, len, "yes"); -+} -+ -+ -+static int - snprint_def_user_friendly_names (char * buff, int len, void * data) - { - if (!conf->user_friendly_names) -@@ -2456,6 +2489,7 @@ init_keywords(void) - install_keyword("dev_loss_tmo", &def_dev_loss_handler, &snprint_def_dev_loss); - install_keyword("bindings_file", &bindings_file_handler, &snprint_def_bindings_file); - install_keyword("log_checker_err", &def_log_checker_err_handler, &snprint_def_log_checker_err); -+ install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths); - __deprecated install_keyword("default_selector", &def_selector_handler, NULL); - __deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL); - __deprecated install_keyword("default_getuid_callout", &def_getuid_callout_handler, NULL); -Index: multipath-tools-111219/libmultipath/file.c +Index: multipath-tools-120518/libmultipath/file.c =================================================================== --- /dev/null -+++ multipath-tools-111219/libmultipath/file.c -@@ -0,0 +1,178 @@ ++++ multipath-tools-120518/libmultipath/file.c +@@ -0,0 +1,180 @@ +/* + * Copyright (c) 2005 Christophe Varoqui + * Copyright (c) 2005 Benjamin Marzinski, Redhat @@ -522,7 +417,9 @@ Index: multipath-tools-111219/libmultipath/file.c + "Cannot write header to file %s : %s", file, + strerror(errno)); + /* cleanup partially written header */ -+ ftruncate(fd, 0); ++ if (ftruncate(fd, 0)) ++ condlog(0, "Cannot truncate header : %s", ++ strerror(errno)); + goto fail; + } + fsync(fd); @@ -535,10 +432,10 @@ Index: multipath-tools-111219/libmultipath/file.c + close(fd); + return -1; +} -Index: multipath-tools-111219/libmultipath/file.h +Index: multipath-tools-120518/libmultipath/file.h =================================================================== --- /dev/null -+++ multipath-tools-111219/libmultipath/file.h ++++ multipath-tools-120518/libmultipath/file.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) 2010 Benjamin Marzinski, Redhat @@ -551,11 +448,129 @@ Index: multipath-tools-111219/libmultipath/file.h +int open_file(char *file, int *can_write, char *header); + +#endif /* _FILE_H */ -Index: multipath-tools-111219/libmultipath/finder.c +Index: multipath-tools-120518/multipath/main.c +=================================================================== +--- multipath-tools-120518.orig/multipath/main.c ++++ multipath-tools-120518/multipath/main.c +@@ -53,6 +53,7 @@ + #include + #include + #include ++#include + #include "dev_t.h" + + int logsink; +@@ -82,7 +83,7 @@ usage (char * progname) + { + fprintf (stderr, VERSION_STRING); + fprintf (stderr, "Usage:\n"); +- fprintf (stderr, " %s [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname); ++ fprintf (stderr, " %s [-c] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname); + fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname); + fprintf (stderr, " %s -F [-v lvl]\n", progname); + fprintf (stderr, " %s -t\n", progname); +@@ -95,6 +96,7 @@ usage (char * progname) + " -ll show multipath topology (maximum info)\n" \ + " -f flush a multipath device map\n" \ + " -F flush all multipath device maps\n" \ ++ " -c check if a device should be a path in a multipath device\n" \ + " -q allow queue_if_no_path when multipathd is not running\n"\ + " -d dry run, do not create or update devmaps\n" \ + " -t dump internal hardware table\n" \ +@@ -209,6 +211,7 @@ get_dm_mpvec (vector curmp, vector pathv + + if (!conf->dry_run) + reinstate_paths(mpp); ++ remember_wwid(mpp->wwid); + } + return 0; + } +@@ -259,9 +262,13 @@ configure (void) + * if we have a blacklisted device parameter, exit early + */ + if (dev && +- (filter_devnode(conf->blist_devnode, conf->elist_devnode, dev) > 0)) +- goto out; +- ++ (filter_devnode(conf->blist_devnode, ++ conf->elist_devnode, dev) > 0)) { ++ if (conf->dry_run == 2) ++ printf("%s is not a valid multipath device path\n", ++ conf->dev); ++ goto out; ++ } + /* + * scope limiting must be translated into a wwid + * failing the translation is fatal (by policy) +@@ -277,6 +284,15 @@ configure (void) + if (filter_wwid(conf->blist_wwid, conf->elist_wwid, + refwwid) > 0) + goto out; ++ if (conf->dry_run == 2) { ++ if (check_wwids_file(refwwid, 0) == 0){ ++ printf("%s is a valid multipath device path\n", conf->dev); ++ r = 0; ++ } ++ else ++ printf("%s is not a valid multipath device path\n", conf->dev); ++ goto out; ++ } + } + + /* +@@ -412,7 +428,7 @@ main (int argc, char *argv[]) + if (load_config(DEFAULT_CONFIGFILE)) + exit(1); + +- while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:Brtq")) != EOF ) { ++ while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) { + switch(arg) { + case 1: printf("optarg : %s\n",optarg); + break; +@@ -434,8 +450,12 @@ main (int argc, char *argv[]) + case 'q': + conf->allow_queueing = 1; + break; ++ case 'c': ++ conf->dry_run = 2; ++ break; + case 'd': +- conf->dry_run = 1; ++ if (!conf->dry_run) ++ conf->dry_run = 1; + break; + case 'f': + conf->remove = FLUSH_ONE; +@@ -517,6 +537,11 @@ main (int argc, char *argv[]) + } + dm_init(); + ++ if (conf->dry_run == 2 && ++ (!conf->dev || conf->dev_type == DEV_DEVMAP)) { ++ condlog(0, "the -c option requires a path to check"); ++ goto out; ++ } + if (conf->remove == FLUSH_ONE) { + if (conf->dev_type == DEV_DEVMAP) + r = dm_flush_map(conf->dev); +Index: multipath-tools-120518/libmultipath/Makefile +=================================================================== +--- multipath-tools-120518.orig/libmultipath/Makefile ++++ multipath-tools-120518/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 ++ lock.o waiter.o file.o wwids.o + + LIBDM_API_FLUSH = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_no_flush' /usr/include/libdevmapper.h) + +Index: multipath-tools-120518/libmultipath/wwids.c =================================================================== --- /dev/null -+++ multipath-tools-111219/libmultipath/finder.c -@@ -0,0 +1,165 @@ ++++ multipath-tools-120518/libmultipath/wwids.c +@@ -0,0 +1,139 @@ +#include +#include +#include @@ -569,7 +584,7 @@ Index: multipath-tools-111219/libmultipath/finder.c +#include "debug.h" +#include "uxsock.h" +#include "file.h" -+#include "finder.h" ++#include "wwids.h" +#include "defaults.h" + +/* @@ -630,33 +645,27 @@ Index: multipath-tools-111219/libmultipath/finder.c + if (write_all(fd, buf, strlen(buf)) != strlen(buf)) { + condlog(0, "cannot write wwid to wwids file : %s", + strerror(errno)); -+ ftruncate(fd, offset); ++ if (ftruncate(fd, offset)) ++ condlog(0, "cannot truncate failed wwid write : %s", ++ strerror(errno)); + return -1; + } + return 1; +} + -+static int ++int +check_wwids_file(char *wwid, int write_wwid) +{ -+ int scan_fd, fd, can_write, found, ret; ++ int fd, can_write, found, ret; + FILE *f; + fd = open_file(DEFAULT_WWIDS_FILE, &can_write, WWIDS_FILE_HEADER); + if (fd < 0) + return -1; + -+ scan_fd = dup(fd); -+ if (scan_fd < 0) { -+ condlog(0, "can't dup wwids file descriptor : %s", -+ strerror(errno)); -+ close(fd); -+ return -1; -+ } -+ f = fdopen(scan_fd, "r"); ++ f = fdopen(fd, "r"); + if (!f) { + condlog(0,"can't fdopen wwids file : %s", strerror(errno)); + close(fd); -+ close(scan_fd); + return -1; + } + found = lookup_wwid(f, wwid); @@ -673,41 +682,21 @@ Index: multipath-tools-111219/libmultipath/finder.c + ret = -1; + goto out; + } ++ ++ if (fflush(f) != 0) { ++ condlog(0, "cannot fflush wwids file stream : %s", ++ strerror(errno)); ++ ret = -1; ++ goto out; ++ } ++ + ret = write_out_wwid(fd, wwid); +out: + fclose(f); -+ close(scan_fd); -+ close(fd); + return ret; +} + +int -+should_multipath(struct path *pp1, vector pathvec) -+{ -+ int i; -+ struct path *pp2; -+ -+ condlog(4, "checking if %s should be multipathed", pp1->dev); -+ vector_foreach_slot(pathvec, pp2, i) { -+ if (pp1->dev == pp2->dev) -+ continue; -+ if (strncmp(pp1->wwid, pp2->wwid, WWID_SIZE) == 0) { -+ condlog(3, "found multiple paths with wwid %s, " -+ "multipathing %s", pp1->wwid, pp1->dev); -+ return 1; -+ } -+ } -+ if (check_wwids_file(pp1->wwid, 0) < 0) { -+ condlog(3, "wwid %s not in wwids file, skipping %s", -+ pp1->wwid, pp1->dev); -+ return 0; -+ } -+ condlog(3, "found wwid %s in wwids file, multipathing %s", pp1->wwid, -+ pp1->dev); -+ return 1; -+} -+ -+int +remember_wwid(char *wwid) +{ + int ret = check_wwids_file(wwid, 1); @@ -721,17 +710,17 @@ Index: multipath-tools-111219/libmultipath/finder.c + condlog(4, "wwid %s already in wwids file", wwid); + return 0; +} -Index: multipath-tools-111219/libmultipath/finder.h +Index: multipath-tools-120518/libmultipath/wwids.h =================================================================== --- /dev/null -+++ multipath-tools-111219/libmultipath/finder.h ++++ multipath-tools-120518/libmultipath/wwids.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2010 Benjamin Marzinski, Redhat + */ + -+#ifndef _FINDER_H -+#define _FINDER_H ++#ifndef _WWIDS_H ++#define _WWIDS_H + +#define WWIDS_FILE_HEADER \ +"# Multipath wwids, Version : 1.0\n" \ @@ -740,85 +729,20 @@ Index: multipath-tools-111219/libmultipath/finder.h +"#\n" \ +"# Valid WWIDs:\n" + -+int should_multipath(struct path *pp, vector pathvec); +int remember_wwid(char *wwid); ++int check_wwids_file(char *wwid, int write_wwid); + -+#endif /* _FINDER_H */ -Index: multipath-tools-111219/multipath/main.c ++#endif /* _WWIDS_H */ +Index: multipath-tools-120518/libmultipath/discovery.c =================================================================== ---- multipath-tools-111219.orig/multipath/main.c -+++ multipath-tools-111219/multipath/main.c -@@ -53,6 +53,7 @@ - #include - #include - #include -+#include - #include "dev_t.h" +--- multipath-tools-120518.orig/libmultipath/discovery.c ++++ multipath-tools-120518/libmultipath/discovery.c +@@ -810,6 +810,8 @@ get_uid (struct path * pp) - int logsink; -@@ -209,6 +210,7 @@ get_dm_mpvec (vector curmp, vector pathv + memset(pp->wwid, 0, WWID_SIZE); + value = udev_device_get_property_value(pp->udev, pp->uid_attribute); ++ if ((!value || strlen(value) == 0) && conf->dry_run == 2) ++ value = getenv(pp->uid_attribute); + if (value && strlen(value)) { + size_t len = WWID_SIZE; - if (!conf->dry_run) - reinstate_paths(mpp); -+ remember_wwid(mpp->wwid); - } - return 0; - } -@@ -316,7 +318,7 @@ configure (void) - /* - * core logic entry point - */ -- r = coalesce_paths(&vecs, NULL, NULL, conf->force_reload); -+ r = coalesce_paths(&vecs, NULL, refwwid, conf->force_reload); - - out: - if (refwwid) -Index: multipath-tools-111219/multipathd/main.c -=================================================================== ---- multipath-tools-111219.orig/multipathd/main.c -+++ multipath-tools-111219/multipathd/main.c -@@ -48,6 +48,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -471,6 +472,11 @@ rescan: - return 1; - } - -+ if (conf->find_multipaths && -+ !should_multipath(pp, vecs->pathvec)) { -+ orphan_path(pp); -+ return 0; -+ } - condlog(4,"%s: creating new map", pp->dev); - if ((mpp = add_map_with_path(vecs, pp, 1))) { - mpp->action = ACT_CREATE; -Index: multipath-tools-111219/libmultipath/Makefile -=================================================================== ---- multipath-tools-111219.orig/libmultipath/Makefile -+++ multipath-tools-111219/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 -+ lock.o waiter.o file.o finder.o - - LIBDM_API_FLUSH = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_no_flush' /usr/include/libdevmapper.h) - -Index: multipath-tools-111219/libmultipath/config.h -=================================================================== ---- multipath-tools-111219.orig/libmultipath/config.h -+++ multipath-tools-111219/libmultipath/config.h -@@ -95,6 +95,7 @@ struct config { - unsigned int dev_loss; - int log_checker_err; - int allow_queueing; -+ int find_multipaths; - uid_t uid; - gid_t gid; - mode_t mode; diff --git a/0015-RH-add-followover.patch b/0003-RH-add-followover.patch similarity index 50% rename from 0015-RH-add-followover.patch rename to 0003-RH-add-followover.patch index 9f28342..9aeecf4 100644 --- a/0015-RH-add-followover.patch +++ b/0003-RH-add-followover.patch @@ -1,16 +1,18 @@ --- libmultipath/dict.c | 12 ++++++++++++ + libmultipath/discovery.c | 6 +++--- libmultipath/print.c | 2 ++ - libmultipath/structs.h | 3 ++- + libmultipath/structs.h | 4 +++- + multipath/main.c | 2 +- multipath/multipath.conf.5 | 5 +++++ - multipathd/main.c | 29 ++++++++++++++++++++++++++++- - 5 files changed, 49 insertions(+), 2 deletions(-) + multipathd/main.c | 35 ++++++++++++++++++++++++++++++++++- + 7 files changed, 60 insertions(+), 6 deletions(-) -Index: multipath-tools-120123/libmultipath/dict.c +Index: multipath-tools-120518/libmultipath/dict.c =================================================================== ---- multipath-tools-120123.orig/libmultipath/dict.c -+++ multipath-tools-120123/libmultipath/dict.c -@@ -406,6 +406,8 @@ default_failback_handler(vector strvec) +--- multipath-tools-120518.orig/libmultipath/dict.c ++++ multipath-tools-120518/libmultipath/dict.c +@@ -398,6 +398,8 @@ default_failback_handler(vector strvec) conf->pgfailback = -FAILBACK_MANUAL; else if (strlen(buff) == 9 && !strcmp(buff, "immediate")) conf->pgfailback = -FAILBACK_IMMEDIATE; @@ -19,7 +21,7 @@ Index: multipath-tools-120123/libmultipath/dict.c else conf->pgfailback = atoi(buff); -@@ -1031,6 +1033,8 @@ hw_failback_handler(vector strvec) +@@ -1053,6 +1055,8 @@ hw_failback_handler(vector strvec) hwe->pgfailback = -FAILBACK_MANUAL; else if (strlen(buff) == 9 && !strcmp(buff, "immediate")) hwe->pgfailback = -FAILBACK_IMMEDIATE; @@ -28,7 +30,7 @@ Index: multipath-tools-120123/libmultipath/dict.c else hwe->pgfailback = atoi(buff); -@@ -1303,6 +1307,8 @@ mp_failback_handler(vector strvec) +@@ -1351,6 +1355,8 @@ mp_failback_handler(vector strvec) mpe->pgfailback = -FAILBACK_MANUAL; else if (strlen(buff) == 9 && !strcmp(buff, "immediate")) mpe->pgfailback = -FAILBACK_IMMEDIATE; @@ -37,7 +39,7 @@ Index: multipath-tools-120123/libmultipath/dict.c else mpe->pgfailback = atoi(buff); -@@ -1646,6 +1652,8 @@ snprint_mp_failback (char * buff, int le +@@ -1769,6 +1775,8 @@ snprint_mp_failback (char * buff, int le return snprintf(buff, len, "manual"); case -FAILBACK_IMMEDIATE: return snprintf(buff, len, "immediate"); @@ -46,7 +48,7 @@ Index: multipath-tools-120123/libmultipath/dict.c default: return snprintf(buff, len, "%i", mpe->pgfailback); } -@@ -1985,6 +1993,8 @@ snprint_hw_failback (char * buff, int le +@@ -2130,6 +2138,8 @@ snprint_hw_failback (char * buff, int le return snprintf(buff, len, "manual"); case -FAILBACK_IMMEDIATE: return snprintf(buff, len, "immediate"); @@ -55,7 +57,7 @@ Index: multipath-tools-120123/libmultipath/dict.c default: return snprintf(buff, len, "%i", hwe->pgfailback); } -@@ -2243,6 +2253,8 @@ snprint_def_failback (char * buff, int l +@@ -2394,6 +2404,8 @@ snprint_def_failback (char * buff, int l return snprintf(buff, len, "manual"); case -FAILBACK_IMMEDIATE: return snprintf(buff, len, "immediate"); @@ -64,10 +66,10 @@ Index: multipath-tools-120123/libmultipath/dict.c default: return snprintf(buff, len, "%i", conf->pgfailback); } -Index: multipath-tools-120123/libmultipath/print.c +Index: multipath-tools-120518/libmultipath/print.c =================================================================== ---- multipath-tools-120123.orig/libmultipath/print.c -+++ multipath-tools-120123/libmultipath/print.c +--- multipath-tools-120518.orig/libmultipath/print.c ++++ multipath-tools-120518/libmultipath/print.c @@ -143,6 +143,8 @@ snprint_failback (char * buff, size_t le { if (mpp->pgfailback == -FAILBACK_IMMEDIATE) @@ -77,10 +79,10 @@ Index: multipath-tools-120123/libmultipath/print.c if (!mpp->failback_tick) return snprintf(buff, len, "-"); -Index: multipath-tools-120123/libmultipath/structs.h +Index: multipath-tools-120518/libmultipath/structs.h =================================================================== ---- multipath-tools-120123.orig/libmultipath/structs.h -+++ multipath-tools-120123/libmultipath/structs.h +--- multipath-tools-120518.orig/libmultipath/structs.h ++++ multipath-tools-120518/libmultipath/structs.h @@ -39,7 +39,8 @@ enum rr_weight_mode { enum failback_mode { FAILBACK_UNDEF, @@ -91,11 +93,19 @@ Index: multipath-tools-120123/libmultipath/structs.h }; enum sysfs_buses { -Index: multipath-tools-120123/multipathd/main.c +@@ -151,6 +152,7 @@ struct path { + int offline; + int state; + int dmstate; ++ int chkrstate; + int failcount; + int priority; + int pgindex; +Index: multipath-tools-120518/multipathd/main.c =================================================================== ---- multipath-tools-120123.orig/multipathd/main.c -+++ multipath-tools-120123/multipathd/main.c -@@ -1011,6 +1011,32 @@ mpvec_garbage_collector (struct vectors +--- multipath-tools-120518.orig/multipathd/main.c ++++ multipath-tools-120518/multipathd/main.c +@@ -995,6 +995,32 @@ mpvec_garbage_collector (struct vectors } } @@ -119,7 +129,7 @@ Index: multipath-tools-120123/multipathd/main.c + vector_foreach_slot(pgp->paths, pp1, i) { + if (pp1 == pp) + continue; -+ if (pp1->state != PATH_DOWN && pp1->state != PATH_SHAKY) ++ if (pp1->chkrstate != PATH_DOWN && pp1->chkrstate != PATH_SHAKY) + return 0; + } + return 1; @@ -128,21 +138,48 @@ Index: multipath-tools-120123/multipathd/main.c static void defered_failback_tick (vector mpvec) { -@@ -1238,7 +1264,8 @@ check_path (struct vectors * vecs, struc +@@ -1092,6 +1118,8 @@ check_path (struct vectors * vecs, struc + { + int newstate; + int new_path_up = 0; ++ int chkr_new_path_up = 0; ++ int oldchkrstate = pp->chkrstate; + + if (!pp->mpp) + return; +@@ -1130,6 +1158,7 @@ check_path (struct vectors * vecs, struc + pp->dev); + pp->dmstate = PSTATE_UNDEF; + } ++ pp->chkrstate = newstate; + if (newstate != pp->state) { + int oldstate = pp->state; + pp->state = newstate; +@@ -1182,6 +1211,9 @@ check_path (struct vectors * vecs, struc + + new_path_up = 1; + ++ if (oldchkrstate != PATH_UP && oldchkrstate != PATH_GHOST) ++ chkr_new_path_up = 1; ++ + /* + * if at least one path is up in a group, and + * the group is disabled, re-enable it +@@ -1233,7 +1265,8 @@ check_path (struct vectors * vecs, struc (new_path_up || pp->mpp->failback_tick <= 0)) pp->mpp->failback_tick = pp->mpp->pgfailback + 1; - else if (pp->mpp->pgfailback == -FAILBACK_IMMEDIATE) + else if (pp->mpp->pgfailback == -FAILBACK_IMMEDIATE || -+ followover_should_failback(pp)) ++ (chkr_new_path_up && followover_should_failback(pp))) switch_pathgroup(pp->mpp); } } -Index: multipath-tools-120123/multipath/multipath.conf.5 +Index: multipath-tools-120518/multipath/multipath.conf.5 =================================================================== ---- multipath-tools-120123.orig/multipath/multipath.conf.5 -+++ multipath-tools-120123/multipath/multipath.conf.5 -@@ -258,6 +258,11 @@ active paths. +--- multipath-tools-120518.orig/multipath/multipath.conf.5 ++++ multipath-tools-120518/multipath/multipath.conf.5 +@@ -254,6 +254,11 @@ active paths. .B manual Do not perform automatic failback. .TP @@ -154,3 +191,45 @@ Index: multipath-tools-120123/multipath/multipath.conf.5 .B values > 0 deferred failback (time to defer in seconds) .TP +Index: multipath-tools-120518/libmultipath/discovery.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/discovery.c ++++ multipath-tools-120518/libmultipath/discovery.c +@@ -878,13 +878,13 @@ pathinfo (struct path *pp, vector hwtabl + + if (mask & DI_CHECKER) { + if (path_state == PATH_UP) { +- pp->state = get_state(pp, 0); ++ pp->chkrstate = pp->state = get_state(pp, 0); + if (pp->state == PATH_UNCHECKED || + pp->state == PATH_WILD) + goto blank; + } else { + condlog(3, "%s: path inaccessible", pp->dev); +- pp->state = path_state; ++ pp->chkrstate = pp->state = path_state; + } + } + +@@ -912,7 +912,7 @@ blank: + * Recoverable error, for example faulty or offline path + */ + memset(pp->wwid, 0, WWID_SIZE); +- pp->state = PATH_DOWN; ++ pp->chkrstate = pp->state = PATH_DOWN; + + return 0; + } +Index: multipath-tools-120518/multipath/main.c +=================================================================== +--- multipath-tools-120518.orig/multipath/main.c ++++ multipath-tools-120518/multipath/main.c +@@ -144,7 +144,7 @@ update_paths (struct multipath * mpp) + /* + * path is not in sysfs anymore + */ +- pp->state = PATH_DOWN; ++ pp->chkrstate = pp->state = PATH_DOWN; + continue; + } + pp->mpp = mpp; diff --git a/0004-RH-fix-cciss-names.patch b/0004-RH-fix-cciss-names.patch new file mode 100644 index 0000000..890a483 --- /dev/null +++ b/0004-RH-fix-cciss-names.patch @@ -0,0 +1,34 @@ +--- + multipath/main.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +Index: multipath-tools-120518/multipath/main.c +=================================================================== +--- multipath-tools-120518.orig/multipath/main.c ++++ multipath-tools-120518/multipath/main.c +@@ -409,6 +409,16 @@ get_dev_type(char *dev) { + return DEV_DEVMAP; + } + ++static void ++convert_dev(char *dev) ++{ ++ char *ptr = strstr(dev, "cciss/"); ++ if (ptr) { ++ ptr += 5; ++ *ptr = '!'; ++ } ++} ++ + int + main (int argc, char *argv[]) + { +@@ -514,6 +524,8 @@ main (int argc, char *argv[]) + + strncpy(conf->dev, argv[optind], FILE_NAME_SIZE); + conf->dev_type = get_dev_type(conf->dev); ++ if (conf->dev_type == DEV_DEVNODE) ++ convert_dev(conf->dev); + } + conf->daemon = 0; + diff --git a/0004-RH-update-init-script.patch b/0004-RH-update-init-script.patch deleted file mode 100644 index a0b99ac..0000000 --- a/0004-RH-update-init-script.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- - multipathd/multipathd.init.redhat | 27 ++++++--------------------- - 1 file changed, 6 insertions(+), 21 deletions(-) - -Index: multipath-tools-111219/multipathd/multipathd.init.redhat -=================================================================== ---- multipath-tools-111219.orig/multipathd/multipathd.init.redhat -+++ multipath-tools-111219/multipathd/multipathd.init.redhat -@@ -73,14 +73,6 @@ start() { - echo - } - --force_stop() { -- echo -n $"Stopping $prog daemon: " -- killproc $DAEMON -- RETVAL=$? -- [ $RETVAL -eq 0 ] && rm -f $lockdir/$prog -- echo --} -- - stop() { - root_dev=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/mtab) - dm_num=`dmsetup info -c --noheadings -o minor $root_dev 2> /dev/null` -@@ -89,7 +81,11 @@ stop() { - [ -d $syspath/$root_dm_device ] && teardown_slaves $syspath/$root_dm_device - fi - -- force_stop -+ echo -n $"Stopping $prog daemon: " -+ killproc $DAEMON -+ RETVAL=$? -+ [ $RETVAL -eq 0 ] && rm -f $lockdir/$prog -+ echo - } - - restart() { -@@ -97,11 +93,6 @@ restart() { - start - } - --force_restart() { -- force_stop -- start --} -- - reload() { - echo -n "Reloading $prog: " - trap "" SIGHUP -@@ -117,18 +108,12 @@ start) - stop) - stop - ;; --force-stop) -- force_stop -- ;; - force-reload|reload) - reload - ;; - restart) - restart - ;; --force-restart) -- force_restart -- ;; - condrestart|try-restart) - if [ -f $lockdir/$prog ]; then - restart -@@ -139,7 +124,7 @@ status) - RETVAL=$? - ;; - *) -- echo $"Usage: $0 {start|stop|force-stop|status|restart|force-restart|condrestart|reload}" -+ echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}" - RETVAL=2 - esac - diff --git a/0005-RH-cciss_id.patch b/0005-RH-cciss_id.patch deleted file mode 100644 index bf61664..0000000 --- a/0005-RH-cciss_id.patch +++ /dev/null @@ -1,219 +0,0 @@ -From a3db7def912c2fd3756cfd99c1165db075281caa Mon Sep 17 00:00:00 2001 -From: Fabio M. Di Nitto -Date: Tue, 13 Oct 2009 09:26:02 +0200 -Subject: [PATCH 05/12] RH: cciss_id - -Signed-off-by: Fabio M. Di Nitto ---- -:100644 100644 54be0a5... 7e4b7b1... M Makefile -:000000 100644 0000000... 6db12a4... A cciss_id/Makefile -:000000 100644 0000000... 091b5fe... A cciss_id/cciss_id.c - Makefile | 3 +- - cciss_id/Makefile | 47 +++++++++++++++++++ - cciss_id/cciss_id.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 177 insertions(+), 1 deletions(-) - -diff --git a/Makefile b/Makefile -index 54be0a5..7e4b7b1 100644 ---- a/Makefile -+++ b/Makefile -@@ -25,7 +25,8 @@ BUILDDIRS = \ - libmultipath/checkers \ - multipath \ - multipathd \ -- kpartx -+ kpartx \ -+ cciss_id - - ifeq ($(MULTIPATH_VERSION),) - VERSION = $(shell basename ${PWD} | cut -d'-' -f3) -diff --git a/cciss_id/Makefile b/cciss_id/Makefile -new file mode 100644 -index 0000000..6db12a4 ---- /dev/null -+++ b/cciss_id/Makefile -@@ -0,0 +1,47 @@ -+ -+# ***************************************************************************** -+# * * -+# * (C) Copyright 2007 Hewlett-Packard Development Company, L.P * -+# * * -+# * This program is free software; you can redistribute it and/or modify it * -+# * under the terms of the GNU General Public License as published by the Free* -+# * Software Foundation; either version 2 of the License, or (at your option)* -+# * any later version. * -+# * * -+# * This program is distributed in the hope that it will be useful, but * -+# * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY* -+# * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * -+# * for more details. * -+# * * -+# * You should have received a copy of the GNU General Public License along * -+# * with this program; if not, write to the Free Software Foundation, Inc., * -+# * 675 Mass Ave, Cambridge, MA 02139, USA. * -+# * * -+# * * -+# * * -+# * * -+# ***************************************************************************** -+ -+include ../Makefile.inc -+ -+OBJS = cciss_id.o -+CFLAGS = -pipe -g -Wall -Wunused -Wstrict-prototypes -+ -+LDFLAGS = -ldevmapper -+ -+EXEC = cciss_id -+ -+all: $(EXEC) -+ -+$(EXEC): $(OBJS) -+ $(CC) $(OBJS) -o $(EXEC) $(LDFLAGS) -+ -+install: -+ $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) -+ $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ -+ -+uninstall: -+ rm $(DESTDIR)$(bindir)/$(EXEC) -+ -+clean: -+ rm -f core.* *.o $(EXEC) *.gz -diff --git a/cciss_id/cciss_id.c b/cciss_id/cciss_id.c -new file mode 100644 -index 0000000..091b5fe ---- /dev/null -+++ b/cciss_id/cciss_id.c -@@ -0,0 +1,128 @@ -+/* -+ ***************************************************************************** -+ * * -+ * (C) Copyright 2007 Hewlett-Packard Development Company, L.P * -+ * * -+ * This program is free software; you can redistribute it and/or modify it * -+ * under the terms of the GNU General Public License as published by the Free* -+ * Software Foundation; either version 2 of the License, or (at your option)* -+ * any later version. * -+ * * -+ * This program is distributed in the hope that it will be useful, but * -+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY* -+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * -+ * for more details. * -+ * * -+ * You should have received a copy of the GNU General Public License along * -+ * with this program; if not, write to the Free Software Foundation, Inc., * -+ * 675 Mass Ave, Cambridge, MA 02139, USA. * -+ * * -+ * * -+ * * -+ * * -+ ***************************************************************************** -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#define LEN_PAGE83_CCISSDEV 0x20 /* Page length of 83h for cciss devices */ -+#define LEN_DEVICEFILE 255 /* Length of device file name */ -+#define PATH_CCISSDEV "/dev/cciss/" /* Path of CCISS devices */ -+int main(int argc, char *argv[]) -+{ -+ const int resp_len = LEN_PAGE83_CCISSDEV; -+ unsigned char resp[resp_len+1]; -+ char dev_name[LEN_DEVICEFILE] = "\0" ; -+ unsigned int lun_id = 0; -+ int fd, status, i; -+ struct stat file_stat; -+ -+ LogvolInfo_struct lvi; // logical "volume" info -+ IOCTL_Command_struct cic; // cciss ioctl command -+ -+ if(argc < 2) { -+ fprintf(stderr, "Usage: %s /dev/cciss/cNdN\n", argv[0]); -+ return -1; -+ } -+ -+ if ( strncmp(PATH_CCISSDEV, argv[1], strlen(PATH_CCISSDEV) ) != 0 ) { -+ if ( strchr(argv[1], '!') ) { -+ sprintf(dev_name, "%s%s", PATH_CCISSDEV, -+ strchr(argv[1], '!')+1); -+ } -+ //fprintf(stderr, "dev_name is: -%s-", dev_name); -+ } else { -+ sprintf(dev_name, "%s", argv[1]); -+ } -+ -+ if (stat(dev_name, &file_stat) < 0) { -+ fprintf (stderr, "Stat failed for file %s. Errno=%d\n", dev_name, errno); -+ return -1; -+ } -+ if (!S_ISBLK(file_stat.st_mode)) { -+ fprintf (stderr, "File %s is not a block device. \n", dev_name); -+ return -1; -+ } -+ -+ -+ if((fd = open(dev_name, O_RDWR)) < 0) { -+ fprintf(stderr, "Open failed for file %s. Errno=%d\n", dev_name, errno); -+ return -1; -+ } -+ -+ if (ioctl(fd, CCISS_GETLUNINFO, &lvi) < 0) { -+ fprintf(stderr, "IOCTL failure CCISS_GETLUNINFO for file %s Errno=%d\n", dev_name, errno); -+ close(fd); -+ return -1; -+ } else { -+ lun_id = lvi.LunID; -+ } -+ -+ memset(&cic, 0, sizeof(IOCTL_Command_struct)); -+ memset(resp, 0, resp_len+1); -+ cic.LUN_info.LogDev.Mode = 0x01; /* logical volume addressing */ -+ cic.LUN_info.LogDev.VolId = lun_id & 0x3FFFFFFF; -+ cic.Request.CDBLen = 6; -+ cic.Request.Type.Type = TYPE_CMD; // It is a command. -+ cic.Request.Type.Attribute = ATTR_SIMPLE; -+ cic.Request.Type.Direction = XFER_READ; // Read -+ cic.Request.Timeout = 0; // Don't time out -+ cic.Request.CDB[0] = 0x12; -+ cic.Request.CDB[1] = 0x01; /* EVPD (enable vital product data) */ -+ cic.Request.CDB[2] = 0x83; -+ cic.Request.CDB[4] = resp_len & 0xFF; -+ cic.buf_size = resp_len; -+ cic.buf = resp; -+ status = ioctl(fd, CCISS_PASSTHRU, &cic); -+ if(status) { -+ fprintf(stderr, "IOCTL failure CCISS_PASSTHRU for file %s Errno=%d\n", dev_name, errno); -+ close(fd); -+ return -1; -+ } -+ else { -+ if ((cic.error_info.CommandStatus | cic.error_info.ScsiStatus )) { -+ fprintf(stderr, "CCISS command status error for Inquiry on %s\n", -+ dev_name); -+ close(fd); -+ return -1; -+ } -+ printf("3"); -+ for(i=8; i<24; i++) -+ /* printf("Buff[%d] =%x\n", i, resp[i]); */ -+ printf("%02x", resp[i]); -+ printf("\n"); -+ } -+ -+ close(fd); -+ return 0; -+} --- -1.6.5.1 - diff --git a/0002-RH-dont_start_with_no_config.patch b/0005-RH-dont_start_with_no_config.patch similarity index 100% rename from 0002-RH-dont_start_with_no_config.patch rename to 0005-RH-dont_start_with_no_config.patch diff --git a/0003-RH-multipath.rules.patch b/0006-RH-multipath.rules.patch similarity index 79% rename from 0003-RH-multipath.rules.patch rename to 0006-RH-multipath.rules.patch index 97e5397..bfcfc98 100644 --- a/0003-RH-multipath.rules.patch +++ b/0006-RH-multipath.rules.patch @@ -1,13 +1,13 @@ --- multipath/Makefile | 6 +++--- - multipath/multipath.rules | 29 +++++++++++++++++++++++------ - 2 files changed, 26 insertions(+), 9 deletions(-) + multipath/multipath.rules | 30 ++++++++++++++++++++++++------ + 2 files changed, 27 insertions(+), 9 deletions(-) -Index: multipath-tools-111219/multipath/multipath.rules +Index: multipath-tools-120613/multipath/multipath.rules =================================================================== ---- multipath-tools-111219.orig/multipath/multipath.rules -+++ multipath-tools-111219/multipath/multipath.rules -@@ -1,7 +1,24 @@ +--- multipath-tools-120613.orig/multipath/multipath.rules ++++ multipath-tools-120613/multipath/multipath.rules +@@ -1,7 +1,25 @@ -# -# udev rules for multipathing. -# The persistent symlinks are created with the kpartx rules @@ -23,6 +23,7 @@ Index: multipath-tools-111219/multipath/multipath.rules + +ACTION=="add", ENV{DEVTYPE}!="partition", \ + ENV{DM_MULTIPATH_DEVICE_PATH}!="1", \ ++ TEST=="/etc/multipath.conf", \ + PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \ + ENV{DM_MULTIPATH_DEVICE_PATH}="1" + @@ -38,10 +39,10 @@ Index: multipath-tools-111219/multipath/multipath.rules +ENV{DM_ACTION}=="PATH_FAILED", GOTO="end_mpath" +RUN+="$env{MPATH_SBIN_PATH}/kpartx -a -p p $tempnode" +LABEL="end_mpath" -Index: multipath-tools-111219/multipath/Makefile +Index: multipath-tools-120613/multipath/Makefile =================================================================== ---- multipath-tools-111219.orig/multipath/Makefile -+++ multipath-tools-111219/multipath/Makefile +--- multipath-tools-120613.orig/multipath/Makefile ++++ multipath-tools-120613/multipath/Makefile @@ -21,15 +21,15 @@ $(EXEC): $(OBJS) install: $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) @@ -49,7 +50,7 @@ Index: multipath-tools-111219/multipath/Makefile - $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d - $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/etc/udev/rules.d/ + $(INSTALL_PROGRAM) -d $(DESTDIR)/lib/udev/rules.d -+ $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/40-multipath.rules ++ $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/62-multipath.rules $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) $(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) @@ -57,7 +58,7 @@ Index: multipath-tools-111219/multipath/Makefile uninstall: - rm $(DESTDIR)/etc/udev/rules.d/multipath.rules -+ rm $(DESTDIR)/lib/udev/rules.d/40-multipath.rules ++ rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules rm $(DESTDIR)$(bindir)/$(EXEC) rm $(DESTDIR)$(mandir)/$(EXEC).8.gz rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz diff --git a/0006-RH-Make-build-system-RH-Fedora-friendly.patch b/0007-RH-Make-build-system-RH-Fedora-friendly.patch similarity index 54% rename from 0006-RH-Make-build-system-RH-Fedora-friendly.patch rename to 0007-RH-Make-build-system-RH-Fedora-friendly.patch index 7d5db31..bc5d17d 100644 --- a/0006-RH-Make-build-system-RH-Fedora-friendly.patch +++ b/0007-RH-Make-build-system-RH-Fedora-friendly.patch @@ -8,29 +8,30 @@ Signed-off-by: Fabio M. Di Nitto :100644 100644 7ec25d5... 06fb625... M Makefile.inc :100644 100644 21e4ad4... 06d79c0... M kpartx/Makefile :100644 100644 32d9ef5... 25e1483... M multipathd/Makefile - Makefile.inc | 2 +- - kpartx/Makefile | 8 ++++---- - libmultipath/Makefile | 2 ++ - multipathd/Makefile | 1 + - 4 files changed, 8 insertions(+), 5 deletions(-) + Makefile.inc | 2 +- + kpartx/Makefile | 8 ++++---- + libmpathpersist/Makefile | 7 ++----- + libmultipath/Makefile | 2 ++ + multipathd/Makefile | 1 + + 5 files changed, 10 insertions(+), 10 deletions(-) -Index: multipath-tools-120123/Makefile.inc +Index: multipath-tools-120613/Makefile.inc =================================================================== ---- multipath-tools-120123.orig/Makefile.inc -+++ multipath-tools-120123/Makefile.inc -@@ -28,7 +28,7 @@ libudevdir = ${prefix}/lib/udev - multipathdir = $(TOPDIR)/libmultipath +--- multipath-tools-120613.orig/Makefile.inc ++++ multipath-tools-120613/Makefile.inc +@@ -29,7 +29,7 @@ multipathdir = $(TOPDIR)/libmultipath mandir = $(prefix)/usr/share/man/man8 man5dir = $(prefix)/usr/share/man/man5 + man3dir = $(prefix)/usr/share/man/man3 -rcdir = $(prefix)/etc/init.d +rcdir = $(prefix)/etc/rc.d/init.d syslibdir = $(prefix)/$(LIB) libdir = $(prefix)/$(LIB)/multipath unitdir = $(prefix)/lib/systemd/system -Index: multipath-tools-120123/kpartx/Makefile +Index: multipath-tools-120613/kpartx/Makefile =================================================================== ---- multipath-tools-120123.orig/kpartx/Makefile -+++ multipath-tools-120123/kpartx/Makefile +--- multipath-tools-120613.orig/kpartx/Makefile ++++ multipath-tools-120613/kpartx/Makefile @@ -26,10 +26,10 @@ $(EXEC): $(OBJS) install: $(EXEC) $(EXEC).8 $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) @@ -46,10 +47,10 @@ Index: multipath-tools-120123/kpartx/Makefile $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) -Index: multipath-tools-120123/multipathd/Makefile +Index: multipath-tools-120613/multipathd/Makefile =================================================================== ---- multipath-tools-120123.orig/multipathd/Makefile -+++ multipath-tools-120123/multipathd/Makefile +--- multipath-tools-120613.orig/multipathd/Makefile ++++ multipath-tools-120613/multipathd/Makefile @@ -35,6 +35,7 @@ install: $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) @@ -58,11 +59,11 @@ Index: multipath-tools-120123/multipathd/Makefile $(INSTALL_PROGRAM) -d $(DESTDIR)$(unitdir) $(INSTALL_PROGRAM) -m 644 $(EXEC).service $(DESTDIR)$(unitdir) $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) -Index: multipath-tools-120123/libmultipath/Makefile +Index: multipath-tools-120613/libmultipath/Makefile =================================================================== ---- multipath-tools-120123.orig/libmultipath/Makefile -+++ multipath-tools-120123/libmultipath/Makefile -@@ -39,9 +39,11 @@ install: +--- multipath-tools-120613.orig/libmultipath/Makefile ++++ multipath-tools-120613/libmultipath/Makefile +@@ -46,9 +46,11 @@ install: $(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir) $(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS) $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(libdir) @@ -74,3 +75,27 @@ Index: multipath-tools-120123/libmultipath/Makefile clean: rm -f core *.a *.o *.gz *.so *.so.* +Index: multipath-tools-120613/libmpathpersist/Makefile +=================================================================== +--- multipath-tools-120613.orig/libmpathpersist/Makefile ++++ multipath-tools-120613/libmpathpersist/Makefile +@@ -28,17 +28,14 @@ $(LIBS): + install: $(LIBS) + $(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir) + $(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS) +- $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(syslibdir) + $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(man3dir) +- $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)/usr/include/ +- $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)/usr/share/doc/mpathpersist/ +- ln -sf $(DESTDIR)$(syslibdir)/$(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB) ++ ln -sf $(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB) + install -m 644 mpath_persistent_reserve_in.3.gz $(DESTDIR)$(man3dir) + install -m 644 mpath_persistent_reserve_out.3.gz $(DESTDIR)$(man3dir) +- install -m 644 mpath_persist.h $(DESTDIR)/usr/include/ + + uninstall: + rm -f $(DESTDIR)$(syslibdir)/$(LIBS) ++ rm -f $(DESTDIR)$(syslibdir)/$(DEVLIB) + rm $(DESTDIR)$(mandir)/mpath_persistent_reserve_in.3.gz + rm $(DESTDIR)$(mandir)/mpath_persistent_reserve_out.3.gz + diff --git a/0007-RH-multipathd-blacklist-all-by-default.patch b/0008-RH-multipathd-blacklist-all-by-default.patch similarity index 78% rename from 0007-RH-multipathd-blacklist-all-by-default.patch rename to 0008-RH-multipathd-blacklist-all-by-default.patch index 6e64237..5bbf3ca 100644 --- a/0007-RH-multipathd-blacklist-all-by-default.patch +++ b/0008-RH-multipathd-blacklist-all-by-default.patch @@ -16,11 +16,11 @@ Signed-off-by: Fabio M. Di Nitto libmultipath/config.h | 1 + 2 files changed, 17 insertions(+) -Index: multipath-tools-111219/libmultipath/config.c +Index: multipath-tools-120518/libmultipath/config.c =================================================================== ---- multipath-tools-111219.orig/libmultipath/config.c -+++ multipath-tools-111219/libmultipath/config.c -@@ -20,6 +20,7 @@ +--- multipath-tools-120518.orig/libmultipath/config.c ++++ multipath-tools-120518/libmultipath/config.c +@@ -21,6 +21,7 @@ #include "defaults.h" #include "prio.h" #include "devmapper.h" @@ -28,7 +28,7 @@ Index: multipath-tools-111219/libmultipath/config.c static int hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2) -@@ -539,6 +540,21 @@ load_config (char * file) +@@ -549,6 +550,21 @@ load_config (char * file) } else { init_keywords(); @@ -50,15 +50,15 @@ Index: multipath-tools-111219/libmultipath/config.c } /* -Index: multipath-tools-111219/libmultipath/config.h +Index: multipath-tools-120518/libmultipath/config.h =================================================================== ---- multipath-tools-111219.orig/libmultipath/config.h -+++ multipath-tools-111219/libmultipath/config.h +--- multipath-tools-120518.orig/libmultipath/config.h ++++ multipath-tools-120518/libmultipath/config.h @@ -6,6 +6,7 @@ #define ORIGIN_DEFAULT 0 #define ORIGIN_CONFIG 1 +#define ORIGIN_NO_CONFIG 2 - enum devtypes { - DEV_NONE, + /* + * In kernel, fast_io_fail == 0 means immediate failure on rport delete. diff --git a/0008-RH-add-mpathconf.patch b/0009-RH-add-mpathconf.patch similarity index 83% rename from 0008-RH-add-mpathconf.patch rename to 0009-RH-add-mpathconf.patch index 800c113..2a5bec8 100644 --- a/0008-RH-add-mpathconf.patch +++ b/0009-RH-add-mpathconf.patch @@ -2,15 +2,15 @@ libmultipath/config.c | 1 multipath/Makefile | 5 multipath/main.c | 4 - multipath/mpathconf | 351 ++++++++++++++++++++++++++++++++++++++++++++++++++ - multipath/mpathconf.8 | 116 ++++++++++++++++ - 5 files changed, 475 insertions(+), 2 deletions(-) + multipath/mpathconf | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++ + multipath/mpathconf.8 | 103 ++++++++++++++++ + 5 files changed, 423 insertions(+), 2 deletions(-) -Index: multipath-tools-111219/libmultipath/config.c +Index: multipath-tools-120613/libmultipath/config.c =================================================================== ---- multipath-tools-111219.orig/libmultipath/config.c -+++ multipath-tools-111219/libmultipath/config.c -@@ -543,6 +543,7 @@ load_config (char * file) +--- multipath-tools-120613.orig/libmultipath/config.c ++++ multipath-tools-120613/libmultipath/config.c +@@ -553,6 +553,7 @@ load_config (char * file) 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)); @@ -18,10 +18,10 @@ Index: multipath-tools-111219/libmultipath/config.c if (conf->blist_devnode == NULL) { conf->blist_devnode = vector_alloc(); if (!conf->blist_devnode) { -Index: multipath-tools-111219/multipath/Makefile +Index: multipath-tools-120613/multipath/Makefile =================================================================== ---- multipath-tools-111219.orig/multipath/Makefile -+++ multipath-tools-111219/multipath/Makefile +--- multipath-tools-120613.orig/multipath/Makefile ++++ multipath-tools-120613/multipath/Makefile @@ -17,22 +17,27 @@ $(EXEC): $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) $(GZIP) $(EXEC).8 > $(EXEC).8.gz @@ -33,7 +33,7 @@ Index: multipath-tools-111219/multipath/Makefile $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ + $(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/ $(INSTALL_PROGRAM) -d $(DESTDIR)/lib/udev/rules.d - $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/40-multipath.rules + $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/62-multipath.rules $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) $(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) @@ -41,7 +41,7 @@ Index: multipath-tools-111219/multipath/Makefile + $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(mandir) uninstall: - rm $(DESTDIR)/lib/udev/rules.d/40-multipath.rules + rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules rm $(DESTDIR)$(bindir)/$(EXEC) + rm $(DESTDIR)$(bindir)/mpathconf rm $(DESTDIR)$(mandir)/$(EXEC).8.gz @@ -50,11 +50,11 @@ Index: multipath-tools-111219/multipath/Makefile clean: rm -f core *.o $(EXEC) *.gz -Index: multipath-tools-111219/multipath/main.c +Index: multipath-tools-120613/multipath/main.c =================================================================== ---- multipath-tools-111219.orig/multipath/main.c -+++ multipath-tools-111219/multipath/main.c -@@ -406,10 +406,10 @@ main (int argc, char *argv[]) +--- multipath-tools-120613.orig/multipath/main.c ++++ multipath-tools-120613/multipath/main.c +@@ -432,10 +432,10 @@ main (int argc, char *argv[]) exit(1); } @@ -66,12 +66,12 @@ Index: multipath-tools-111219/multipath/main.c + if (dm_prereq()) exit(1); - if (sysfs_init(conf->sysfs_dir, FILE_NAME_SIZE)) { -Index: multipath-tools-111219/multipath/mpathconf + while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) { +Index: multipath-tools-120613/multipath/mpathconf =================================================================== --- /dev/null -+++ multipath-tools-111219/multipath/mpathconf -@@ -0,0 +1,351 @@ ++++ multipath-tools-120613/multipath/mpathconf +@@ -0,0 +1,312 @@ +#!/bin/sh +# +# Copyright (C) 2010 Red Hat, Inc. All rights reserved. @@ -91,7 +91,7 @@ Index: multipath-tools-111219/multipath/mpathconf +# This program was largely ripped off from lvmconf +# + -+unset ENABLE FIND FRIENDLY MODULE MULTIPATHD CHKCONFIG HAVE_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_DEFAULTS HAVE_FRIENDLY HAVE_MULTIPATHD HAVE_CHKCONFIG HAVE_MODULE SHOW_STATUS CHANGED_CONFIG ++unset ENABLE FIND FRIENDLY MODULE MULTIPATHD HAVE_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_DEFAULTS HAVE_FRIENDLY HAVE_MULTIPATHD HAVE_MODULE SHOW_STATUS CHANGED_CONFIG + +DEFAULT_CONFIGFILE="/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf" +CONFIGFILE="/etc/multipath.conf" @@ -109,7 +109,6 @@ Index: multipath-tools-111219/multipath/mpathconf + echo "Set find_multipaths (Default n): --find_multipaths " + echo "Load the dm-multipath modules on enable (Default y): --with_module " + echo "start/stop/reload multipathd (Default n): --with_multipathd " -+ echo "chkconfig on/off multipathd (Default y): --with_chkconfig " + echo "" +} + @@ -161,15 +160,6 @@ Index: multipath-tools-111219/multipath/mpathconf + exit 1 + fi + ;; -+ --with_chkconfig) -+ if [ -n "$2" ]; then -+ CHKCONFIG=$2 -+ shift 2 -+ else -+ usage -+ exit 1 -+ fi -+ ;; + *) + usage + exit @@ -204,10 +194,6 @@ Index: multipath-tools-111219/multipath/mpathconf + echo "--with_multipathd must be either 'y' or 'n'" + exit 1 + fi -+ if [ -n "$CHKCONFIG" ] && [ "$CHKCONFIG" != "y" -a "$CHKCONFIG" != "n" ]; then -+ echo "--with_chkconfig must be either 'y' or 'n'" -+ exit 1 -+ fi +} + +umask 0077 @@ -254,18 +240,6 @@ Index: multipath-tools-111219/multipath/mpathconf + fi +fi + -+if [ -z "$CHKCONFIG" -o "$CHKCONFIG" = "y" ]; then -+ chkconfig --list multipathd > /dev/null 2>&1 -+ if [ $? != 0 ]; then -+ chkconfig --add multipathd -+ fi -+ if chkconfig --list multipathd | grep -q "on" ; then -+ HAVE_CHKCONFIG=1 -+ else -+ HAVE_CHKCONFIG=0 -+ fi -+fi -+ +if [ "$HAVE_BLACKLIST" = "1" ]; then + if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode \"\.\?\*\"" ; then + HAVE_DISABLE=1 @@ -313,13 +287,6 @@ Index: multipath-tools-111219/multipath/mpathconf + if [ -n "$HAVE_MULTIPATHD" ]; then + service multipathd status + fi -+ if [ -n "$HAVE_CHKCONFIG" ]; then -+ if [ "$HAVE_CHKCONFIG" = 1 ]; then -+ echo "multipathd is chkconfiged on" -+ else -+ echo "multipathd is chkconfiged off" -+ fi -+ fi + exit 0 +fi + @@ -410,24 +377,18 @@ Index: multipath-tools-111219/multipath/mpathconf + if [ "$HAVE_MULTIPATHD" = 0 ]; then + service multipathd start + fi -+ if [ "$HAVE_CHKCONFIG" = 0 ]; then -+ chkconfig multipathd on -+ fi +elif [ "$ENABLE" = 0 ]; then + if [ "$HAVE_MULTIPATHD" = 1 ]; then + service multipathd stop + fi -+ if [ "$HAVE_CHKCONFIG" = 1 ]; then -+ chkconfig multipathd off -+ fi +elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then + service multipathd reload +fi -Index: multipath-tools-111219/multipath/mpathconf.8 +Index: multipath-tools-120613/multipath/mpathconf.8 =================================================================== --- /dev/null -+++ multipath-tools-111219/multipath/mpathconf.8 -@@ -0,0 +1,116 @@ ++++ multipath-tools-120613/multipath/mpathconf.8 +@@ -0,0 +1,103 @@ +.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual" +.SH NAME +mpathconf - A tool for configuring device-mapper-multipath @@ -453,15 +414,11 @@ Index: multipath-tools-111219/multipath/mpathconf.8 + +The default options for mpathconf are +.B --with_module -+and -+.B --with_chkconfig. +The +.B --with_multipathd +option is not set by default. Enabling multipathing will load the +.B dm_multipath -+module and chkconfig -+.B multipathd -+to start on the next boot, but it will not immediately start it. This is so ++module but it will not immediately start it. This is so +that users can manually edit their config file if necessary, before starting +.B multipathd. + @@ -525,19 +482,10 @@ Index: multipath-tools-111219/multipath/mpathconf.8 +to reconfigure multipathd on \fB--user_frindly_names\fP and +\fB--find_multipaths\fP. +This option is set to \fBn\fP by default. -+.TP -+.B --with_chkconfig { \fBy\fP | \fBn\fP } -+If set to \fBy\fP, this runs -+.B chkconfig multipathd on -+to set multipathd to start automatically on \fB--enable\fP and -+.B chkconfig multipathd off -+to stop multipathd for starting automatically on \fB--disable\fP. -+This option is set to \fBy\fP by default. +.SH FILES +.BR /etc/multipath.conf +.SH "SEE ALSO" +.BR multipath.conf (5), -+.BR chkconfig (8), +.BR modprobe (8), +.BR multipath (8), +.BR multipathd (8), diff --git a/0010-RH-add-find-multipaths.patch b/0010-RH-add-find-multipaths.patch new file mode 100644 index 0000000..57eb0a8 --- /dev/null +++ b/0010-RH-add-find-multipaths.patch @@ -0,0 +1,222 @@ +--- + libmultipath/config.c | 1 + + libmultipath/config.h | 1 + + libmultipath/configure.c | 11 +++++++++++ + libmultipath/defaults.h | 1 + + libmultipath/dict.c | 34 ++++++++++++++++++++++++++++++++++ + libmultipath/wwids.c | 26 ++++++++++++++++++++++++++ + libmultipath/wwids.h | 1 + + multipath/main.c | 2 +- + multipathd/main.c | 6 ++++++ + 9 files changed, 82 insertions(+), 1 deletion(-) + +Index: multipath-tools-120518/libmultipath/config.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/config.c ++++ multipath-tools-120518/libmultipath/config.c +@@ -514,6 +514,7 @@ load_config (char * file) + conf->reassign_maps = DEFAULT_REASSIGN_MAPS; + conf->checkint = DEFAULT_CHECKINT; + conf->max_checkint = MAX_CHECKINT(conf->checkint); ++ conf->find_multipaths = DEFAULT_FIND_MULTIPATHS; + + /* + * preload default hwtable +Index: multipath-tools-120518/libmultipath/configure.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/configure.c ++++ multipath-tools-120518/libmultipath/configure.c +@@ -497,6 +497,10 @@ coalesce_paths (struct vectors * vecs, v + + memset(empty_buff, 0, WWID_SIZE); + ++ /* ignore refwwid if it's empty */ ++ if (refwwid && !strlen(refwwid)) ++ refwwid = NULL; ++ + if (force_reload) { + vector_foreach_slot (pathvec, pp1, k) { + pp1->mpp = NULL; +@@ -526,6 +530,13 @@ coalesce_paths (struct vectors * vecs, v + if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE)) + continue; + ++ /* If find_multipaths was selected check if the path is valid */ ++ if (conf->find_multipaths && !refwwid && ++ !should_multipath(pp1, pathvec)) { ++ orphan_path(pp1); ++ continue; ++ } ++ + /* + * at this point, we know we really got a new mp + */ +Index: multipath-tools-120518/libmultipath/defaults.h +=================================================================== +--- multipath-tools-120518.orig/libmultipath/defaults.h ++++ multipath-tools-120518/libmultipath/defaults.h +@@ -15,6 +15,7 @@ + #define DEFAULT_USER_FRIENDLY_NAMES 0 + #define DEFAULT_VERBOSITY 2 + #define DEFAULT_REASSIGN_MAPS 1 ++#define DEFAULT_FIND_MULTIPATHS 0 + + #define DEFAULT_CHECKINT 5 + #define MAX_CHECKINT(a) (a << 2) +Index: multipath-tools-120518/libmultipath/dict.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/dict.c ++++ multipath-tools-120518/libmultipath/dict.c +@@ -585,6 +585,27 @@ def_reservation_key_handler(vector strve + } + + static int ++def_find_multipaths_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->find_multipaths = 0; ++ else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) || ++ (strlen(buff) == 1 && !strcmp(buff, "1"))) ++ conf->find_multipaths = 1; ++ ++ FREE(buff); ++ return 0; ++} ++ ++static int + def_names_handler(vector strvec) + { + char * buff; +@@ -2549,6 +2570,18 @@ snprint_def_log_checker_err (char * buff + } + + static int ++snprint_def_find_multipaths (char * buff, int len, void * data) ++{ ++ if (conf->find_multipaths == DEFAULT_FIND_MULTIPATHS) ++ return 0; ++ if (!conf->find_multipaths) ++ return snprintf(buff, len, "no"); ++ ++ return snprintf(buff, len, "yes"); ++} ++ ++ ++static int + snprint_def_user_friendly_names (char * buff, int len, void * data) + { + if (conf->user_friendly_names == USER_FRIENDLY_NAMES_ON) +@@ -2646,6 +2679,7 @@ init_keywords(void) + install_keyword("bindings_file", &bindings_file_handler, &snprint_def_bindings_file); + install_keyword("log_checker_err", &def_log_checker_err_handler, &snprint_def_log_checker_err); + install_keyword("reservation_key", &def_reservation_key_handler, &snprint_def_reservation_key); ++ install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths); + __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-120518/libmultipath/wwids.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/wwids.c ++++ multipath-tools-120518/libmultipath/wwids.c +@@ -124,6 +124,32 @@ out: + } + + int ++should_multipath(struct path *pp1, vector pathvec) ++{ ++ int i; ++ struct path *pp2; ++ ++ condlog(4, "checking if %s should be multipathed", pp1->dev); ++ vector_foreach_slot(pathvec, pp2, i) { ++ if (pp1->dev == pp2->dev) ++ continue; ++ if (strncmp(pp1->wwid, pp2->wwid, WWID_SIZE) == 0) { ++ condlog(3, "found multiple paths with wwid %s, " ++ "multipathing %s", pp1->wwid, pp1->dev); ++ return 1; ++ } ++ } ++ if (check_wwids_file(pp1->wwid, 0) < 0) { ++ condlog(3, "wwid %s not in wwids file, skipping %s", ++ pp1->wwid, pp1->dev); ++ return 0; ++ } ++ condlog(3, "found wwid %s in wwids file, multipathing %s", pp1->wwid, ++ pp1->dev); ++ return 1; ++} ++ ++int + remember_wwid(char *wwid) + { + int ret = check_wwids_file(wwid, 1); +Index: multipath-tools-120518/libmultipath/wwids.h +=================================================================== +--- multipath-tools-120518.orig/libmultipath/wwids.h ++++ multipath-tools-120518/libmultipath/wwids.h +@@ -12,6 +12,7 @@ + "#\n" \ + "# Valid WWIDs:\n" + ++int should_multipath(struct path *pp, vector pathvec); + int remember_wwid(char *wwid); + int check_wwids_file(char *wwid, int write_wwid); + +Index: multipath-tools-120518/multipath/main.c +=================================================================== +--- multipath-tools-120518.orig/multipath/main.c ++++ multipath-tools-120518/multipath/main.c +@@ -332,7 +332,7 @@ configure (void) + /* + * core logic entry point + */ +- r = coalesce_paths(&vecs, NULL, NULL, conf->force_reload); ++ r = coalesce_paths(&vecs, NULL, refwwid, conf->force_reload); + + out: + if (refwwid) +Index: multipath-tools-120518/multipathd/main.c +=================================================================== +--- multipath-tools-120518.orig/multipathd/main.c ++++ multipath-tools-120518/multipathd/main.c +@@ -49,6 +49,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -473,6 +474,11 @@ rescan: + return 1; + } + ++ if (conf->find_multipaths && ++ !should_multipath(pp, vecs->pathvec)) { ++ orphan_path(pp); ++ return 0; ++ } + condlog(4,"%s: creating new map", pp->dev); + if ((mpp = add_map_with_path(vecs, pp, 1))) { + mpp->action = ACT_CREATE; +Index: multipath-tools-120518/libmultipath/config.h +=================================================================== +--- multipath-tools-120518.orig/libmultipath/config.h ++++ multipath-tools-120518/libmultipath/config.h +@@ -104,6 +104,7 @@ struct config { + unsigned int dev_loss; + int log_checker_err; + int allow_queueing; ++ int find_multipaths; + uid_t uid; + gid_t gid; + mode_t mode; diff --git a/0010-RH-check-if-multipath-owns-path.patch b/0010-RH-check-if-multipath-owns-path.patch deleted file mode 100644 index 36e423a..0000000 --- a/0010-RH-check-if-multipath-owns-path.patch +++ /dev/null @@ -1,119 +0,0 @@ ---- - libmultipath/finder.c | 2 +- - libmultipath/finder.h | 1 + - multipath/main.c | 35 +++++++++++++++++++++++++++++------ - 3 files changed, 31 insertions(+), 7 deletions(-) - -Index: multipath-tools-111219/libmultipath/finder.c -=================================================================== ---- multipath-tools-111219.orig/libmultipath/finder.c -+++ multipath-tools-111219/libmultipath/finder.c -@@ -78,7 +78,7 @@ write_out_wwid(int fd, char *wwid) { - return 1; - } - --static int -+int - check_wwids_file(char *wwid, int write_wwid) - { - int scan_fd, fd, can_write, found, ret; -Index: multipath-tools-111219/libmultipath/finder.h -=================================================================== ---- multipath-tools-111219.orig/libmultipath/finder.h -+++ multipath-tools-111219/libmultipath/finder.h -@@ -14,5 +14,6 @@ - - int should_multipath(struct path *pp, vector pathvec); - int remember_wwid(char *wwid); -+int check_wwids_file(char *wwid, int write_wwid); - - #endif /* _FINDER_H */ -Index: multipath-tools-111219/multipath/main.c -=================================================================== ---- multipath-tools-111219.orig/multipath/main.c -+++ multipath-tools-111219/multipath/main.c -@@ -83,7 +83,7 @@ usage (char * progname) - { - fprintf (stderr, VERSION_STRING); - fprintf (stderr, "Usage:\n"); -- fprintf (stderr, " %s [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname); -+ fprintf (stderr, " %s [-c] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname); - fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname); - fprintf (stderr, " %s -F [-v lvl]\n", progname); - fprintf (stderr, " %s -t\n", progname); -@@ -96,6 +96,7 @@ usage (char * progname) - " -ll show multipath topology (maximum info)\n" \ - " -f flush a multipath device map\n" \ - " -F flush all multipath device maps\n" \ -+ " -c check if a device should be a path in a multipath device\n" \ - " -q allow queue_if_no_path when multipathd is not running\n"\ - " -d dry run, do not create or update devmaps\n" \ - " -t dump internal hardware table\n" \ -@@ -261,9 +262,13 @@ configure (void) - * if we have a blacklisted device parameter, exit early - */ - if (dev && -- (filter_devnode(conf->blist_devnode, conf->elist_devnode, dev) > 0)) -- goto out; -- -+ (filter_devnode(conf->blist_devnode, -+ conf->elist_devnode, dev) > 0)) { -+ if (conf->dry_run == 2) -+ printf("%s is not a valid multipath device path\n", -+ conf->dev); -+ goto out; -+ } - /* - * scope limiting must be translated into a wwid - * failing the translation is fatal (by policy) -@@ -279,6 +284,15 @@ configure (void) - if (filter_wwid(conf->blist_wwid, conf->elist_wwid, - refwwid) > 0) - goto out; -+ if (conf->dry_run == 2) { -+ if (check_wwids_file(refwwid, 0) == 0){ -+ printf("%s is a valid multipath device path\n", conf->dev); -+ r = 0; -+ } -+ else -+ printf("%s is not a valid multipath device path\n", conf->dev); -+ goto out; -+ } - } - - /* -@@ -418,7 +432,7 @@ main (int argc, char *argv[]) - condlog(0, "multipath tools need sysfs mounted"); - exit(1); - } -- while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:Brtq")) != EOF ) { -+ while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) { - switch(arg) { - case 1: printf("optarg : %s\n",optarg); - break; -@@ -440,8 +454,12 @@ main (int argc, char *argv[]) - case 'q': - conf->allow_queueing = 1; - break; -+ case 'c': -+ conf->dry_run = 2; -+ break; - case 'd': -- conf->dry_run = 1; -+ if (!conf->dry_run) -+ conf->dry_run = 1; - break; - case 'f': - conf->remove = FLUSH_ONE; -@@ -523,6 +541,11 @@ main (int argc, char *argv[]) - } - dm_init(); - -+ if (conf->dry_run == 2 && -+ (!conf->dev || conf->dev_type == DEV_DEVMAP)) { -+ condlog(0, "the -c option requires a path to check"); -+ goto out; -+ } - if (conf->remove == FLUSH_ONE) { - if (conf->dev_type == DEV_DEVMAP) - r = dm_flush_map(conf->dev); diff --git a/0011-RH-add-hp_tur-checker.patch b/0011-RH-add-hp_tur-checker.patch index dadf392..bc8d73b 100644 --- a/0011-RH-add-hp_tur-checker.patch +++ b/0011-RH-add-hp_tur-checker.patch @@ -5,10 +5,10 @@ multipath.conf.annotated | 5 + 4 files changed, 128 insertions(+), 7 deletions(-) -Index: multipath-tools-111219/libmultipath/checkers.h +Index: multipath-tools-120613/libmultipath/checkers.h =================================================================== ---- multipath-tools-111219.orig/libmultipath/checkers.h -+++ multipath-tools-111219/libmultipath/checkers.h +--- multipath-tools-120613.orig/libmultipath/checkers.h ++++ multipath-tools-120613/libmultipath/checkers.h @@ -60,6 +60,7 @@ enum path_check_state { #define DIRECTIO "directio" @@ -33,10 +33,10 @@ Index: multipath-tools-111219/libmultipath/checkers.h void * context; /* store for persistent data */ void ** mpcontext; /* store for persistent data shared multipath-wide. Use MALLOC if -Index: multipath-tools-111219/libmultipath/checkers/Makefile +Index: multipath-tools-120613/libmultipath/checkers/Makefile =================================================================== ---- multipath-tools-111219.orig/libmultipath/checkers/Makefile -+++ multipath-tools-111219/libmultipath/checkers/Makefile +--- multipath-tools-120613.orig/libmultipath/checkers/Makefile ++++ multipath-tools-120613/libmultipath/checkers/Makefile @@ -8,6 +8,7 @@ LIBS= \ libcheckcciss_tur.so \ libcheckreadsector0.so \ @@ -55,10 +55,10 @@ Index: multipath-tools-111219/libmultipath/checkers/Makefile install: $(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(libdir) -Index: multipath-tools-111219/libmultipath/checkers/tur.c +Index: multipath-tools-120613/libmultipath/checkers/tur.c =================================================================== ---- multipath-tools-111219.orig/libmultipath/checkers/tur.c -+++ multipath-tools-111219/libmultipath/checkers/tur.c +--- multipath-tools-120613.orig/libmultipath/checkers/tur.c ++++ multipath-tools-120613/libmultipath/checkers/tur.c @@ -24,12 +24,101 @@ #define TUR_CMD_LEN 6 #define HEAVY_CHECK_COUNT 10 @@ -249,10 +249,10 @@ Index: multipath-tools-111219/libmultipath/checkers/tur.c } pthread_attr_destroy(&attr); tur_timeout(&tsp); -Index: multipath-tools-111219/multipath.conf.annotated +Index: multipath-tools-120613/multipath.conf.annotated =================================================================== ---- multipath-tools-111219.orig/multipath.conf.annotated -+++ multipath-tools-111219/multipath.conf.annotated +--- multipath-tools-120613.orig/multipath.conf.annotated ++++ multipath-tools-120613/multipath.conf.annotated @@ -96,7 +96,8 @@ # # name : path_checker, checker # # scope : multipath & multipathd @@ -265,7 +265,7 @@ Index: multipath-tools-111219/multipath.conf.annotated # path_checker directio @@ -493,7 +494,7 @@ # # scope : multipathd & multipathd - # # desc : path checking alorithm to use to check path state + # # desc : path checking algorithm to use to check path state # # values : readsector0|tur|emc_clariion|hp_sw|directio|rdac| -# # cciss_tur +# # cciss_tur|hp_tur diff --git a/0014-RH-RHEL5-style-partitions.patch b/0012-RH-RHEL5-style-partitions.patch similarity index 100% rename from 0014-RH-RHEL5-style-partitions.patch rename to 0012-RH-RHEL5-style-partitions.patch diff --git a/0012-RH-update-on-show-topology.patch b/0012-RH-update-on-show-topology.patch deleted file mode 100644 index 24cc6de..0000000 --- a/0012-RH-update-on-show-topology.patch +++ /dev/null @@ -1,141 +0,0 @@ ---- - libmultipath/structs_vec.c | 18 ++++++++++-------- - libmultipath/structs_vec.h | 6 ++++-- - libmultipath/waiter.c | 2 +- - multipathd/cli_handlers.c | 14 +++++++++++--- - 4 files changed, 26 insertions(+), 14 deletions(-) - -Index: multipath-tools-120123/multipathd/cli_handlers.c -=================================================================== ---- multipath-tools-120123.orig/multipathd/cli_handlers.c -+++ multipath-tools-120123/multipathd/cli_handlers.c -@@ -68,13 +68,16 @@ show_paths (char ** r, int * len, struct - } - - int --show_map_topology (char ** r, int * len, struct multipath * mpp) -+show_map_topology (char ** r, int * len, struct multipath * mpp, -+ struct vectors * vecs) - { - char * c; - char * reply; - unsigned int maxlen = INITIAL_REPLY_LEN; - int again = 1; - -+ if (update_multipath(vecs, mpp->alias, 0)) -+ return 1; - reply = MALLOC(maxlen); - - while (again) { -@@ -112,9 +115,14 @@ show_maps_topology (char ** r, int * len - - c = reply; - -- vector_foreach_slot(vecs->mpvec, mpp, i) -+ vector_foreach_slot(vecs->mpvec, mpp, i) { -+ if (update_multipath(vecs, mpp->alias, 0)) { -+ i--; -+ continue; -+ } - c += snprint_multipath_topology(c, reply + maxlen - c, - mpp, 2); -+ } - - again = ((c - reply) == (maxlen - 1)); - -@@ -232,7 +240,7 @@ cli_list_map_topology (void * v, char ** - - condlog(3, "list multipath %s (operator)", param); - -- return show_map_topology(reply, len, mpp); -+ return show_map_topology(reply, len, mpp, vecs); - } - - int -Index: multipath-tools-120123/libmultipath/structs_vec.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/structs_vec.c -+++ multipath-tools-120123/libmultipath/structs_vec.c -@@ -324,7 +324,7 @@ set_no_path_retry(struct multipath *mpp) - } - - extern int --setup_multipath (struct vectors * vecs, struct multipath * mpp) -+__setup_multipath (struct vectors * vecs, struct multipath * mpp, int reset) - { - if (dm_get_info(mpp->alias, &mpp->dmi)) { - /* Error accessing table */ -@@ -353,11 +353,13 @@ setup_multipath (struct vectors * vecs, - condlog(3, "%s: no hardware entry found, using defaults", - mpp->alias); - } -- select_rr_weight(mpp); -- select_pgfailback(mpp); -- set_no_path_retry(mpp); -- select_pg_timeout(mpp); -- select_flush_on_last_del(mpp); -+ if (reset) { -+ select_rr_weight(mpp); -+ select_pgfailback(mpp); -+ set_no_path_retry(mpp); -+ select_pg_timeout(mpp); -+ select_flush_on_last_del(mpp); -+ } - - return 0; - out: -@@ -479,7 +481,7 @@ verify_paths(struct multipath * mpp, str - return count; - } - --int update_multipath (struct vectors *vecs, char *mapname) -+int update_multipath (struct vectors *vecs, char *mapname, int reset) - { - struct multipath *mpp; - struct pathgroup *pgp; -@@ -496,7 +498,7 @@ int update_multipath (struct vectors *ve - free_pgvec(mpp->pg, KEEP_PATHS); - mpp->pg = NULL; - -- if (setup_multipath(vecs, mpp)) -+ if (__setup_multipath(vecs, mpp, reset)) - return 1; /* mpp freed in setup_multipath */ - - adopt_paths(vecs->pathvec, mpp, 0); -Index: multipath-tools-120123/libmultipath/structs_vec.h -=================================================================== ---- multipath-tools-120123.orig/libmultipath/structs_vec.h -+++ multipath-tools-120123/libmultipath/structs_vec.h -@@ -21,7 +21,9 @@ void orphan_path (struct path * pp); - - int verify_paths(struct multipath * mpp, struct vectors * vecs, vector rpvec); - int update_mpp_paths(struct multipath * mpp, vector pathvec); --int setup_multipath (struct vectors * vecs, struct multipath * mpp); -+int __setup_multipath (struct vectors * vecs, struct multipath * mpp, -+ int reset); -+#define setup_multipath(vecs, mpp) __setup_multipath(vecs, mpp, 1) - int update_multipath_strings (struct multipath *mpp, vector pathvec); - - void remove_map (struct multipath * mpp, struct vectors * vecs, int purge_vec); -@@ -32,7 +34,7 @@ void remove_maps_and_stop_waiters (struc - struct multipath * add_map_without_path (struct vectors * vecs, char * alias); - struct multipath * add_map_with_path (struct vectors * vecs, - struct path * pp, int add_vec); --int update_multipath (struct vectors *vecs, char *mapname); -+int update_multipath (struct vectors *vecs, char *mapname, int reset); - void update_queue_mode_del_path(struct multipath *mpp); - void update_queue_mode_add_path(struct multipath *mpp); - -Index: multipath-tools-120123/libmultipath/waiter.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/waiter.c -+++ multipath-tools-120123/libmultipath/waiter.c -@@ -157,7 +157,7 @@ int waiteventloop (struct event_thread * - */ - pthread_cleanup_push(cleanup_lock, &waiter->vecs->lock); - lock(waiter->vecs->lock); -- r = update_multipath(waiter->vecs, waiter->mapname); -+ r = update_multipath(waiter->vecs, waiter->mapname, 1); - lock_cleanup_pop(waiter->vecs->lock); - - if (r) { diff --git a/0016-RH-dont-remove-map-on-enomem.patch b/0013-RH-dont-remove-map-on-enomem.patch similarity index 69% rename from 0016-RH-dont-remove-map-on-enomem.patch rename to 0013-RH-dont-remove-map-on-enomem.patch index 5b54a4a..b7ee42c 100644 --- a/0016-RH-dont-remove-map-on-enomem.patch +++ b/0013-RH-dont-remove-map-on-enomem.patch @@ -2,11 +2,11 @@ multipathd/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -Index: multipath-tools-120123/multipathd/main.c +Index: multipath-tools-120518/multipathd/main.c =================================================================== ---- multipath-tools-120123.orig/multipathd/main.c -+++ multipath-tools-120123/multipathd/main.c -@@ -1003,7 +1003,8 @@ mpvec_garbage_collector (struct vectors +--- multipath-tools-120518.orig/multipathd/main.c ++++ multipath-tools-120518/multipathd/main.c +@@ -993,7 +993,8 @@ mpvec_garbage_collector (struct vectors return; vector_foreach_slot (vecs->mpvec, mpp, i) { diff --git a/0013-RH-manpage-update.patch b/0013-RH-manpage-update.patch deleted file mode 100644 index dbcc408..0000000 --- a/0013-RH-manpage-update.patch +++ /dev/null @@ -1,169 +0,0 @@ ---- - multipath/multipath.conf.5 | 79 ++++++++++++++++++++++++++++++++++++--------- - 1 file changed, 64 insertions(+), 15 deletions(-) - -Index: multipath-tools-120123/multipath/multipath.conf.5 -=================================================================== ---- multipath-tools-120123.orig/multipath/multipath.conf.5 -+++ multipath-tools-120123/multipath/multipath.conf.5 -@@ -82,6 +82,11 @@ maximal interval between two path checks - directory where udev creates its device nodes; default is - .I /dev - .TP -+.B multipath_dir -+directory where the dynamic shared objects are stored; default is system -+dependent, commonly -+.I /lib/multipath -+.TP - .B verbosity - default verbosity. Higher values increase the verbosity level. Valid - levels are between 0 and 6; default is -@@ -141,7 +146,7 @@ Default value is \fImultibus\fR. - The default program and args to callout to obtain a unique path - identifier. Should be specified with an absolute path. Default value - is --.I /lib/udev/scsi_id --whitelisted --device=/dev/%n -+.I /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/%n - .TP - .B prio - The name of the path priority routine. The specified routine -@@ -177,17 +182,22 @@ Generate the path priority for Hitachi H - .B random - Generate a random priority between 1 and 10. - .TP 12 --.B weightedpath ... --.I hbtl --regex can be of SCSI H:B:T:L format Ex: 1:0:.:. , *:0:0:. --.I devname --regex can be of device name format Ex: sda , sd.e -+.B weightedpath - Generate the path priority based on the regular expression and the --priority provided as argument. -+priority provided as argument. requires prio_args keyword. - .TP - Default value is \fBnone\fR. - .RE - .TP -+.B prio_args -+Arguments to pass to to the prio function. Currently only used with -+.I weighted, which needs a value of the form -+.I " ..." -+.I hbtl -+regex can be of SCSI H:B:T:L format Ex: 1:0:.:. , *:0:0:. -+.I devname -+regex can be of device name format Ex: sda , sd.e -+.TP - .B features - Specify any device-mapper features to be used. Syntax is - .I num list -@@ -238,19 +248,33 @@ Default value is \fIdirectio\fR. - .RE - .TP - .B failback --Tell the daemon to manage path group failback, or not to. 0 or --.I immediate --means immediate failback, values >0 means deferred failback (in --seconds). --.I manual --means no failback. Default value is --.I manual -+Tell multipathd how to manage path group failback. -+.RS -+.TP 12 -+.B immediate -+Immediately failback to the highest priority pathgroup that contains -+active paths. -+.TP -+.B manual -+Do not perform automatic failback. -+.TP -+.B values > 0 -+deferred failback (time to defer in seconds) -+.TP -+Default value is \fImanual\fR. -+.RE - .TP - .B rr_min_io - The number of IO to route to a path before switching to the next in --the same path group. Default is -+the same path group. This is only for BIO based multipath. Default is - .I 1000 - .TP -+.B rr_min_io_q -+The number of IO requests to route to a path before switching to the -+next in the same path group. This is only for request based multipath. -+Default is -+.I 1 -+.TP - .B rr_weight - If set to \fIpriorities\fR the multipath configurator will assign - path weights as "path prio * rr_min_io". Possible values are -@@ -280,6 +304,13 @@ be overriden by any specific aliases in - Default is - .I no - .TP -+.B flush_on_last_del -+If set to -+.I yes -+, multipathd will disable queueing when the last path to a device has been -+deleted. Default is -+.I no -+.TP - .B max_fds - Specify the maximum number of file descriptors that can be opened by multipath - and multipathd. This is equivalent to ulimit -n. A value of \fImax\fR will set -@@ -413,12 +444,20 @@ section: - .TP - .B prio - .TP -+.B prio_args -+.TP - .B failback - .TP -+.B rr_weight -+.TP -+.B flush_on_last_del -+.TP - .B no_path_retry - .TP - .B rr_min_io - .TP -+.B rr_min_io_q -+.TP - .B features - .RE - .PD -@@ -446,6 +485,10 @@ subsection recognizes the following attr - .B product_blacklist - (Optional) Product strings to blacklist for this vendor - .TP -+.B alias_prefix -+(Optional) The user_friendly_names prefix to use for this -+device type, instead of the default "mpath" -+.TP - .B hardware_handler - (Optional) The hardware handler to use for this device type. - The following hardware handler are implemented: -@@ -483,6 +526,8 @@ section: - .TP - .B prio - .TP -+.B prio_args -+.TP - .B features - .TP - .B failback -@@ -493,9 +538,13 @@ section: - .TP - .B rr_min_io - .TP -+.B rr_min_io_rq -+.TP - .B fast_io_fail_tmo - .TP - .B dev_loss_tmo -+.TP -+.B flush_on_last_del - .RE - .PD - .LP diff --git a/0019-RH-deprecate-uid-gid-mode.patch b/0014-RH-deprecate-uid-gid-mode.patch similarity index 100% rename from 0019-RH-deprecate-uid-gid-mode.patch rename to 0014-RH-deprecate-uid-gid-mode.patch diff --git a/0025-RHBZ-822714-update-nodes.patch b/0015-RH-use-sync-support.patch similarity index 65% rename from 0025-RHBZ-822714-update-nodes.patch rename to 0015-RH-use-sync-support.patch index 52e652b..c5dee9d 100644 --- a/0025-RHBZ-822714-update-nodes.patch +++ b/0015-RH-use-sync-support.patch @@ -2,10 +2,10 @@ libmultipath/devmapper.c | 2 ++ 1 file changed, 2 insertions(+) -Index: multipath-tools-120123/libmultipath/devmapper.c +Index: multipath-tools-120518/libmultipath/devmapper.c =================================================================== ---- multipath-tools-120123.orig/libmultipath/devmapper.c -+++ multipath-tools-120123/libmultipath/devmapper.c +--- multipath-tools-120518.orig/libmultipath/devmapper.c ++++ multipath-tools-120518/libmultipath/devmapper.c @@ -1272,6 +1272,8 @@ dm_rename (char * old, char * new) goto out; if (!dm_task_run(dmt)) diff --git a/0016-RH-change-configs.patch b/0016-RH-change-configs.patch new file mode 100644 index 0000000..7942ea8 --- /dev/null +++ b/0016-RH-change-configs.patch @@ -0,0 +1,541 @@ +--- + libmultipath/config.c | 1 + libmultipath/hwtable.c | 65 ------------------------------------------------- + 2 files changed, 1 insertion(+), 65 deletions(-) + +Index: multipath-tools-120613/libmultipath/config.c +=================================================================== +--- multipath-tools-120613.orig/libmultipath/config.c ++++ multipath-tools-120613/libmultipath/config.c +@@ -515,6 +515,7 @@ load_config (char * file) + conf->checkint = DEFAULT_CHECKINT; + conf->max_checkint = MAX_CHECKINT(conf->checkint); + conf->find_multipaths = DEFAULT_FIND_MULTIPATHS; ++ conf->fast_io_fail = 5; + + /* + * preload default hwtable +Index: multipath-tools-120613/libmultipath/hwtable.c +=================================================================== +--- multipath-tools-120613.orig/libmultipath/hwtable.c ++++ multipath-tools-120613/libmultipath/hwtable.c +@@ -28,7 +28,6 @@ static struct hwentry default_hw[] = { + .product = "Compellent Vol", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -50,7 +49,6 @@ static struct hwentry default_hw[] = { + .product = "Xserve RAID ", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -72,7 +70,6 @@ static struct hwentry default_hw[] = { + .product = "VV", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -88,7 +85,6 @@ static struct hwentry default_hw[] = { + .product = "HSG80", + .features = "1 queue_if_no_path", + .hwhandler = "1 hp_sw", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -104,7 +100,6 @@ static struct hwentry default_hw[] = { + .product = "A6189A", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -121,7 +116,6 @@ static struct hwentry default_hw[] = { + .product = "(MSA|HSV)1.0.*", + .features = "1 queue_if_no_path", + .hwhandler = "1 hp_sw", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -137,7 +131,6 @@ static struct hwentry default_hw[] = { + .product = "MSA VOLUME", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -153,7 +146,6 @@ static struct hwentry default_hw[] = { + .product = "HSV1[01]1|HSV2[01]0|HSV300|HSV4[05]0", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -169,7 +161,6 @@ static struct hwentry default_hw[] = { + .product = "MSA2[02]12fc|MSA2012i", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -185,7 +176,6 @@ static struct hwentry default_hw[] = { + .product = "MSA2012sa|MSA23(12|24)(fc|i|sa)|MSA2000s VOLUME", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -202,7 +192,6 @@ static struct hwentry default_hw[] = { + .product = "HSVX700", + .features = DEFAULT_FEATURES, + .hwhandler = "1 alua", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -219,7 +208,6 @@ static struct hwentry default_hw[] = { + .product = "LOGICAL VOLUME.*", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -236,7 +224,6 @@ static struct hwentry default_hw[] = { + .product = "P2000 G3 FC|P2000G3 FC/iSCSI|P2000 G3 SAS|P2000 G3 iSCSI", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -258,7 +245,6 @@ static struct hwentry default_hw[] = { + .product = "SAN DataDirector", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -280,7 +266,6 @@ static struct hwentry default_hw[] = { + .product = "SYMMETRIX", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -297,7 +282,6 @@ static struct hwentry default_hw[] = { + .bl_product = "LUNZ", + .features = "1 queue_if_no_path", + .hwhandler = "1 emc", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -314,7 +298,6 @@ static struct hwentry default_hw[] = { + .bl_product = "LUNZ", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -336,7 +319,6 @@ static struct hwentry default_hw[] = { + .product = "CentricStor", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_SERIAL, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -352,7 +334,6 @@ static struct hwentry default_hw[] = { + .product = "ETERNUS_DX(L|400|8000)", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -373,7 +354,6 @@ static struct hwentry default_hw[] = { + .product = "OPEN-.*", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -389,7 +369,6 @@ static struct hwentry default_hw[] = { + .product = "DF.*", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -411,7 +390,6 @@ static struct hwentry default_hw[] = { + .product = "ProFibre 4000R", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -429,7 +407,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "1 queue_if_no_path", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -447,7 +424,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "1 queue_if_no_path", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -465,7 +441,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "1 queue_if_no_path", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -483,7 +458,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -500,7 +474,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -518,7 +491,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -536,7 +508,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -554,7 +525,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -572,7 +542,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -589,7 +558,6 @@ static struct hwentry default_hw[] = { + .product = "^3542", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_SERIAL, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -606,7 +574,6 @@ static struct hwentry default_hw[] = { + .product = "^2105800", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_SERIAL, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -623,7 +590,6 @@ static struct hwentry default_hw[] = { + .product = "^2105F20", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_SERIAL, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -640,7 +606,6 @@ static struct hwentry default_hw[] = { + .product = "^1750500", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -657,7 +622,6 @@ static struct hwentry default_hw[] = { + .product = "^2107900", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -674,7 +638,6 @@ static struct hwentry default_hw[] = { + .product = "^2145", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -693,7 +656,6 @@ static struct hwentry default_hw[] = { + .uid_attribute = "ID_UID", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -712,7 +674,6 @@ static struct hwentry default_hw[] = { + .uid_attribute = "ID_UID", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -729,7 +690,6 @@ static struct hwentry default_hw[] = { + .product = "^IPR.*", + .features = "1 queue_if_no_path", + .hwhandler = "1 alua", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -746,7 +706,6 @@ static struct hwentry default_hw[] = { + .product = "1820N00", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -763,7 +722,6 @@ static struct hwentry default_hw[] = { + .product = "2810XIV", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = 15, + .rr_weight = RR_WEIGHT_NONE, +@@ -786,7 +744,6 @@ static struct hwentry default_hw[] = { + .product = "VDASD", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -803,7 +760,6 @@ static struct hwentry default_hw[] = { + .product = "3303 NVDISK", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = FAILOVER, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -820,7 +776,6 @@ static struct hwentry default_hw[] = { + .product = "NVDISK", + .features = DEFAULT_FEATURES, + .hwhandler = "1 alua", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -838,7 +793,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -856,7 +810,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -874,7 +827,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -892,7 +844,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -914,7 +865,6 @@ static struct hwentry default_hw[] = { + .product = "LUN.*", + .features = "3 queue_if_no_path pg_init_retries 50", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .flush_on_last_del = FLUSH_ENABLED, +@@ -936,7 +886,6 @@ static struct hwentry default_hw[] = { + .product = "COMSTAR", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_SERIAL, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -957,7 +906,6 @@ static struct hwentry default_hw[] = { + .product = "Nseries.*", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -978,7 +926,6 @@ static struct hwentry default_hw[] = { + .product = "Axiom.*", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -1001,7 +948,6 @@ static struct hwentry default_hw[] = { + .product = "TP9[13]00", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -1018,7 +964,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1035,7 +980,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1052,7 +996,6 @@ static struct hwentry default_hw[] = { + .product = "DISK ARRAY", + .features = DEFAULT_FEATURES, + .hwhandler = "1 alua", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1075,7 +1018,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1097,7 +1039,6 @@ static struct hwentry default_hw[] = { + .product = "(StorEdge 3510|T4)", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -1113,7 +1054,6 @@ static struct hwentry default_hw[] = { + .product = "FC2502", + .features = DEFAULT_FEATURES, + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -1135,7 +1075,6 @@ static struct hwentry default_hw[] = { + .product = "RAIGE VOLUME", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, +- .selector = DEFAULT_SELECTOR, + .pgpolicy = MULTIBUS, + .pgfailback = FAILBACK_UNDEF, + .rr_weight = RR_WEIGHT_NONE, +@@ -1151,7 +1090,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1169,7 +1107,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1187,7 +1124,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = "2 pg_init_retries 50", + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, +@@ -1204,7 +1140,6 @@ static struct hwentry default_hw[] = { + .bl_product = "Universal Xport", + .features = DEFAULT_FEATURES, + .hwhandler = "1 rdac", +- .selector = DEFAULT_SELECTOR, + .pgpolicy = GROUP_BY_PRIO, + .pgfailback = -FAILBACK_IMMEDIATE, + .rr_weight = RR_WEIGHT_NONE, diff --git a/0017-RH-fix-shutdown-crash.patch b/0017-RH-fix-shutdown-crash.patch deleted file mode 100644 index 0e4f345..0000000 --- a/0017-RH-fix-shutdown-crash.patch +++ /dev/null @@ -1,69 +0,0 @@ ---- - libmultipath/log_pthread.c | 1 + - libmultipath/waiter.c | 1 + - multipathd/main.c | 6 +++++- - 3 files changed, 7 insertions(+), 1 deletion(-) - -Index: multipath-tools-120123/multipathd/main.c -=================================================================== ---- multipath-tools-120123.orig/multipathd/main.c -+++ multipath-tools-120123/multipathd/main.c -@@ -735,6 +735,7 @@ uxsock_trigger (char * str, char ** repl - - pthread_cleanup_push(cleanup_lock, &vecs->lock); - lock(vecs->lock); -+ pthread_testcancel(); - - r = parse_cmd(str, reply, len, vecs); - -@@ -787,7 +788,9 @@ uev_trigger (struct uevent * uev, void * - if (uev_discard(uev->devpath)) - return 0; - -+ pthread_cleanup_push(cleanup_lock, &vecs->lock); - lock(vecs->lock); -+ pthread_testcancel(); - - /* - * device map event -@@ -827,7 +830,7 @@ uev_trigger (struct uevent * uev, void * - } - - out: -- unlock(vecs->lock); -+ lock_cleanup_pop(vecs->lock); - return r; - } - -@@ -1295,6 +1298,7 @@ checkerloop (void *ap) - block_signal(SIGHUP, &old); - pthread_cleanup_push(cleanup_lock, &vecs->lock); - lock(vecs->lock); -+ pthread_testcancel(); - condlog(4, "tick"); - - if (vecs->pathvec) { -Index: multipath-tools-120123/libmultipath/waiter.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/waiter.c -+++ multipath-tools-120123/libmultipath/waiter.c -@@ -157,6 +157,7 @@ int waiteventloop (struct event_thread * - */ - pthread_cleanup_push(cleanup_lock, &waiter->vecs->lock); - lock(waiter->vecs->lock); -+ pthread_testcancel(); - r = update_multipath(waiter->vecs, waiter->mapname, 1); - lock_cleanup_pop(waiter->vecs->lock); - -Index: multipath-tools-120123/libmultipath/log_pthread.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/log_pthread.c -+++ multipath-tools-120123/libmultipath/log_pthread.c -@@ -87,6 +87,7 @@ void log_thread_stop (void) - pthread_mutex_lock(logq_lock); - pthread_cancel(log_thr); - pthread_mutex_unlock(logq_lock); -+ pthread_join(log_thr, NULL); - - flush_logqueue(); - diff --git a/0018-RH-warn-on-bad-dev-loss-tmo.patch b/0018-RH-warn-on-bad-dev-loss-tmo.patch deleted file mode 100644 index 508a02a..0000000 --- a/0018-RH-warn-on-bad-dev-loss-tmo.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- - libmultipath/discovery.c | 22 +++++++++++++++------- - libmultipath/structs_vec.c | 5 ----- - 2 files changed, 15 insertions(+), 12 deletions(-) - -Index: multipath-tools-120123/libmultipath/discovery.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/discovery.c -+++ multipath-tools-120123/libmultipath/discovery.c -@@ -299,17 +299,17 @@ sysfs_set_scsi_tmo (struct multipath *mp - no_path_retry_tmo = MAX_DEV_LOSS_TMO; - if (no_path_retry_tmo > dev_loss_tmo) - dev_loss_tmo = no_path_retry_tmo; -- condlog(3, "%s: update dev_loss_tmo to %d\n", -+ condlog(3, "%s: update dev_loss_tmo to %d", - mpp->alias, dev_loss_tmo); - } else if (mpp->no_path_retry == NO_PATH_RETRY_QUEUE) { - dev_loss_tmo = MAX_DEV_LOSS_TMO; -- condlog(4, "%s: update dev_loss_tmo to %d\n", -+ condlog(3, "%s: update dev_loss_tmo to %d", - mpp->alias, dev_loss_tmo); - } - mpp->dev_loss = dev_loss_tmo; -- if (mpp->fast_io_fail > mpp->dev_loss) { -+ if (mpp->fast_io_fail > (int)mpp->dev_loss) { - mpp->fast_io_fail = mpp->dev_loss; -- condlog(3, "%s: update fast_io_fail to %d\n", -+ condlog(3, "%s: update fast_io_fail to %d", - mpp->alias, mpp->fast_io_fail); - } - if (!mpp->dev_loss && !mpp->fast_io_fail) -@@ -333,9 +333,17 @@ sysfs_set_scsi_tmo (struct multipath *mp - snprintf(value, 11, "%u", mpp->dev_loss); - if (sysfs_attr_set_value(attr_path, "dev_loss_tmo", - value, 11) < 0) { -- condlog(0, "%s failed to set %s/dev_loss_tmo", -- mpp->alias, attr_path); -- return 1; -+ int err = 1; -+ if (mpp->fast_io_fail <= 0 && mpp->dev_loss > 600) { -+ strncpy(value, "600", 4); -+ condlog(3, "%s: limiting dev_loss_tmo to 600, since fast_io_fail is not set", mpp->alias); -+ if (sysfs_attr_set_value(attr_path, "dev_loss_tmo", value, 11) >= 0) -+ err = 0; -+ } -+ if (err) { -+ condlog(0, "%s failed to set %s/dev_loss_tmo", mpp->alias, attr_path); -+ return 1; -+ } - } - } - if (mpp->fast_io_fail){ -Index: multipath-tools-120123/libmultipath/structs_vec.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/structs_vec.c -+++ multipath-tools-120123/libmultipath/structs_vec.c -@@ -441,11 +441,6 @@ verify_paths(struct multipath * mpp, str - if (!mpp) - return 0; - -- select_features(mpp); -- select_no_path_retry(mpp); -- select_dev_loss(mpp); -- sysfs_set_scsi_tmo(mpp); -- - vector_foreach_slot (mpp->paths, pp, i) { - /* - * see if path is in sysfs diff --git a/0020-RH-dont-remove-map-twice.patch b/0020-RH-dont-remove-map-twice.patch deleted file mode 100644 index 559ec1e..0000000 --- a/0020-RH-dont-remove-map-twice.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- - multipathd/main.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Index: multipath-tools-120123/multipathd/main.c -=================================================================== ---- multipath-tools-120123.orig/multipathd/main.c -+++ multipath-tools-120123/multipathd/main.c -@@ -524,7 +524,7 @@ rescan: - * update our state from kernel regardless of create or reload - */ - if (setup_multipath(vecs, mpp)) -- goto fail_map; -+ goto fail; /* if setup_multipath fails, it removes the map */ - - sync_map_state(mpp); - diff --git a/0021-RH-validate-guid-partitions.patch b/0021-RH-validate-guid-partitions.patch deleted file mode 100644 index 19040d3..0000000 --- a/0021-RH-validate-guid-partitions.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- - kpartx/gpt.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -Index: multipath-tools-120123/kpartx/gpt.c -=================================================================== ---- multipath-tools-120123.orig/kpartx/gpt.c -+++ multipath-tools-120123/kpartx/gpt.c -@@ -367,6 +367,15 @@ is_gpt_valid(int fd, uint64_t lba, - } - - -+ /* Check that sizeof_partition_entry has the correct value */ -+ if (__le32_to_cpu((*gpt)->sizeof_partition_entry) != sizeof(gpt_entry)) { -+ // printf("GUID partition entry size check failed.\n"); -+ free(*gpt); -+ *gpt = NULL; -+ return 0; -+ } -+ -+ - if (!(*ptes = alloc_read_gpt_entries(fd, *gpt))) { - free(*gpt); - *gpt = NULL; diff --git a/0022-RH-adjust-messages.patch b/0022-RH-adjust-messages.patch deleted file mode 100644 index d7b021a..0000000 --- a/0022-RH-adjust-messages.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- - libmultipath/configure.c | 3 +++ - libmultipath/discovery.c | 2 +- - 2 files changed, 4 insertions(+), 1 deletion(-) - -Index: multipath-tools-120123/libmultipath/configure.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/configure.c -+++ multipath-tools-120123/libmultipath/configure.c -@@ -590,6 +590,9 @@ coalesce_paths (struct vectors * vecs, v - "for create/reload map", - mpp->alias, r); - if (r == DOMAP_FAIL) { -+ condlog(2, "%s: %s map", -+ mpp->alias, (mpp->action == ACT_CREATE)? -+ "ignoring" : "removing"); - remove_map(mpp, vecs, 0); - continue; - } else /* if (r == DOMAP_RETRY) */ -Index: multipath-tools-120123/libmultipath/discovery.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/discovery.c -+++ multipath-tools-120123/libmultipath/discovery.c -@@ -318,7 +318,7 @@ sysfs_set_scsi_tmo (struct multipath *mp - vector_foreach_slot(mpp->paths, pp, i) { - rport_id = find_rport_id(pp); - if (rport_id < 0) { -- condlog(0, "failed to find rport_id for target%d:%d:%d", pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id); -+ condlog(3, "failed to find rport_id for target%d:%d:%d", pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.scsi_id); - return 1; - } - diff --git a/0023-RH-manpage-update.patch b/0023-RH-manpage-update.patch deleted file mode 100644 index 475ad41..0000000 --- a/0023-RH-manpage-update.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- - multipath/multipath.conf.5 | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -Index: multipath-tools-120123/multipath/multipath.conf.5 -=================================================================== ---- multipath-tools-120123.orig/multipath/multipath.conf.5 -+++ multipath-tools-120123/multipath/multipath.conf.5 -@@ -338,7 +338,9 @@ will disable the timeout. - .TP - .B dev_loss_tmo - Specify the number of seconds the scsi layer will wait after a problem has --been detected on a FC remote port before removing it from the system. -+been detected on a FC remote port before removing it from the system. This -+can be set to "infinity" which sets it to the max value of 2147483647 -+seconds, or 68 years. - .TP - .B queue_without_daemon - If set to diff --git a/0024-RH-libudev-monitor.patch b/0024-RH-libudev-monitor.patch deleted file mode 100644 index 6792aa3..0000000 --- a/0024-RH-libudev-monitor.patch +++ /dev/null @@ -1,218 +0,0 @@ ---- - libmultipath/Makefile | 2 - libmultipath/uevent.c | 151 ++++++++++++++++++++++++++++++++++++++++------ - multipath/multipath.rules | 1 - 3 files changed, 134 insertions(+), 20 deletions(-) - -Index: multipath-tools-120123/libmultipath/Makefile -=================================================================== ---- multipath-tools-120123.orig/libmultipath/Makefile -+++ multipath-tools-120123/libmultipath/Makefile -@@ -7,7 +7,7 @@ include ../Makefile.inc - SONAME=0 - DEVLIB = libmultipath.so - LIBS = $(DEVLIB).$(SONAME) --LIBDEPS = -lpthread -ldl -ldevmapper -+LIBDEPS = -lpthread -ldl -ldevmapper -ludev - - OBJS = memory.o parser.o vector.o devmapper.o callout.o \ - hwtable.o blacklist.o util.o dmparser.o config.o \ -Index: multipath-tools-120123/libmultipath/uevent.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/uevent.c -+++ multipath-tools-120123/libmultipath/uevent.c -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include - #include - - #include "memory.h" -@@ -161,7 +162,7 @@ int uevent_dispatch(int (*uev_trigger)(s - return 0; - } - --int uevent_listen(void) -+int failback_listen(void) - { - int sock; - struct sockaddr_nl snl; -@@ -173,20 +174,6 @@ int uevent_listen(void) - int rcvszsz = sizeof(rcvsz); - unsigned int *prcvszsz = (unsigned int *)&rcvszsz; - const int feature_on = 1; -- -- /* -- * Queue uevents for service by dedicated thread so that the uevent -- * listening thread does not block on multipathd locks (vecs->lock) -- * thereby not getting to empty the socket's receive buffer queue -- * often enough. -- */ -- INIT_LIST_HEAD(&uevq); -- -- pthread_mutex_init(uevq_lockp, NULL); -- pthread_cond_init(uev_condp, NULL); -- -- pthread_cleanup_push(uevq_stop, NULL); -- - /* - * First check whether we have a udev socket - */ -@@ -382,13 +369,141 @@ int uevent_listen(void) - - exit: - close(sock); -+ return 1; -+} - -- pthread_cleanup_pop(1); -+int uevent_listen(void) -+{ -+ int err; -+ struct udev *udev = NULL; -+ struct udev_monitor *monitor = NULL; -+ int fd, socket_flags; -+ int need_failback = 0; -+ /* -+ * Queue uevents for service by dedicated thread so that the uevent -+ * listening thread does not block on multipathd locks (vecs->lock) -+ * thereby not getting to empty the socket's receive buffer queue -+ * often enough. -+ */ -+ INIT_LIST_HEAD(&uevq); -+ -+ pthread_mutex_init(uevq_lockp, NULL); -+ pthread_cond_init(uev_condp, NULL); -+ pthread_cleanup_push(uevq_stop, NULL); -+ -+ udev = udev_new(); -+ if (!udev) { -+ condlog(2, "failed to create udev context"); -+ need_failback = 1; -+ goto out; -+ } -+ monitor = udev_monitor_new_from_netlink(udev, "udev"); -+ if (!monitor) { -+ condlog(2, "failed to create udev monitor"); -+ need_failback = 1; -+ goto out; -+ } -+ if (udev_monitor_set_receive_buffer_size(monitor, 128 * 1024 * 1024)) -+ condlog(2, "failed to increase buffer size"); -+ fd = udev_monitor_get_fd(monitor); -+ socket_flags = fcntl(fd, F_GETFL); -+ if (socket_flags < 0) { -+ condlog(2, "failed to get monitor socket flags : %s", -+ strerror(errno)); -+ need_failback = 1; -+ goto out; -+ } -+ if (fcntl(fd, F_SETFL, socket_flags & ~O_NONBLOCK) < 0) { -+ condlog(2, "failed to set monitor socket flags : %s", -+ strerror(errno)); -+ need_failback = 1; -+ goto out; -+ } -+ err = udev_monitor_filter_add_match_subsystem_devtype(monitor, "block", -+ NULL); -+ if (err) -+ condlog(2, "failed to create filter : %s\n", strerror(-err)); -+ err = udev_monitor_enable_receiving(monitor); -+ if (err) { -+ condlog(2, "failed to enable receiving : %s\n", strerror(-err)); -+ need_failback = 1; -+ goto out; -+ } -+ while (1) { -+ int i = 0; -+ char *pos, *end; -+ struct uevent *uev; -+ struct udev_device *dev; -+ struct udev_list_entry *list_entry; -+ -+ dev = udev_monitor_receive_device(monitor); -+ if (!dev) { -+ condlog(0, "failed getting udev device"); -+ continue; -+ } - -+ uev = alloc_uevent(); -+ if (!uev) { -+ condlog(1, "lost uevent, oom"); -+ continue; -+ } -+ pos = uev->buffer; -+ end = pos + HOTPLUG_BUFFER_SIZE + OBJECT_SIZE - 1; -+ udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(dev)) { -+ const char *name, *value; -+ int bytes; -+ -+ name = udev_list_entry_get_name(list_entry); -+ value = udev_list_entry_get_value(list_entry); -+ bytes = snprintf(pos, end - pos, "%s=%s", name, -+ value); -+ if (pos + bytes >= end) { -+ condlog(2, "buffer overflow for uevent"); -+ break; -+ } -+ uev->envp[i] = pos; -+ pos += bytes; -+ *pos = '\0'; -+ pos++; -+ if (strcmp(name, "DEVPATH") == 0) -+ uev->devpath = uev->envp[i] + 8; -+ if (strcmp(name, "ACTION") == 0) -+ uev->action = uev->envp[i] + 7; -+ i++; -+ if (i == HOTPLUG_NUM_ENVP - 1) -+ break; -+ } -+ udev_device_unref(dev); -+ uev->envp[i] = NULL; -+ -+ condlog(3, "uevent '%s' from '%s'", uev->action, uev->devpath); -+ uev->kernel = strrchr(uev->devpath, '/'); -+ if (uev->kernel) -+ uev->kernel++; -+ -+ /* print payload environment */ -+ for (i = 0; uev->envp[i] != NULL; i++) -+ condlog(5, "%s", uev->envp[i]); -+ -+ /* -+ * Queue uevent and poke service pthread. -+ */ -+ pthread_mutex_lock(uevq_lockp); -+ list_add_tail(&uev->node, &uevq); -+ pthread_cond_signal(uev_condp); -+ pthread_mutex_unlock(uevq_lockp); -+ } -+out: -+ if (monitor) -+ udev_monitor_unref(monitor); -+ if (udev) -+ udev_unref(udev); -+ if (need_failback) -+ err = failback_listen(); -+ pthread_cleanup_pop(1); - pthread_mutex_destroy(uevq_lockp); - pthread_cond_destroy(uev_condp); -- -- return 1; -+ return err; - } - - extern int -Index: multipath-tools-120123/multipath/multipath.rules -=================================================================== ---- multipath-tools-120123.orig/multipath/multipath.rules -+++ multipath-tools-120123/multipath/multipath.rules -@@ -13,7 +13,6 @@ ACTION=="add", ENV{DEVTYPE}!="partition" - ENV{DM_MULTIPATH_DEVICE_PATH}=="1", ENV{DEVTYPE}!="partition", \ - RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}" - --RUN+="socket:/org/kernel/dm/multipath_event" - KERNEL!="dm-*", GOTO="end_mpath" - ACTION!="change", GOTO="end_mpath" - ENV{DM_UUID}=="mpath-?*|part[0-9]*-mpath-?*", OPTIONS+="link_priority=10" diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index c1a7c3b..9dee44f 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,44 +1,35 @@ Summary: Tools to manage multipath devices using device-mapper Name: device-mapper-multipath Version: 0.4.9 -Release: 26%{?dist} +Release: 27%{?dist} License: GPL+ Group: System Environment/Base URL: http://christophe.varoqui.free.fr/ -Source0: multipath-tools-120123.tgz +Source0: multipath-tools-120613.tgz Source1: multipath.conf -Patch0001: 0001-RH-fix-async-tur.patch -Patch0002: 0002-RH-dont_start_with_no_config.patch -Patch0003: 0003-RH-multipath.rules.patch -Patch0004: 0004-RH-update-init-script.patch -Patch0005: 0005-RH-cciss_id.patch -Patch0006: 0006-RH-Make-build-system-RH-Fedora-friendly.patch -Patch0007: 0007-RH-multipathd-blacklist-all-by-default.patch -Patch0008: 0008-RH-add-mpathconf.patch -Patch0009: 0009-RH-add-find-multipaths.patch -Patch0010: 0010-RH-check-if-multipath-owns-path.patch +Patch0001: 0001-RH-remove_callout.patch +Patch0002: 0002-RH-add-wwids-file.patch +Patch0003: 0003-RH-add-followover.patch +Patch0004: 0004-RH-fix-cciss-names.patch +Patch0005: 0005-RH-dont_start_with_no_config.patch +Patch0006: 0006-RH-multipath.rules.patch +Patch0007: 0007-RH-Make-build-system-RH-Fedora-friendly.patch +Patch0008: 0008-RH-multipathd-blacklist-all-by-default.patch +Patch0009: 0009-RH-add-mpathconf.patch +Patch0010: 0010-RH-add-find-multipaths.patch Patch0011: 0011-RH-add-hp_tur-checker.patch -Patch0012: 0012-RH-update-on-show-topology.patch -Patch0013: 0013-RH-manpage-update.patch -Patch0014: 0014-RH-RHEL5-style-partitions.patch -Patch0015: 0015-RH-add-followover.patch -Patch0016: 0016-RH-dont-remove-map-on-enomem.patch -Patch0017: 0017-RH-fix-shutdown-crash.patch -Patch0018: 0018-RH-warn-on-bad-dev-loss-tmo.patch -Patch0019: 0019-RH-deprecate-uid-gid-mode.patch -Patch0020: 0020-RH-dont-remove-map-twice.patch -Patch0021: 0021-RH-validate-guid-partitions.patch -Patch0022: 0022-RH-adjust-messages.patch -Patch0023: 0023-RH-manpage-update.patch -Patch0024: 0024-RH-libudev-monitor.patch -Patch0025: 0025-RHBZ-822714-update-nodes.patch +Patch0012: 0012-RH-RHEL5-style-partitions.patch +Patch0013: 0013-RH-dont-remove-map-on-enomem.patch +Patch0014: 0014-RH-deprecate-uid-gid-mode.patch +Patch0015: 0015-RH-use-sync-support.patch +Patch0016: 0016-RH-change-configs.patch # runtime Requires: %{name}-libs = %{version}-%{release} Requires: kpartx = %{version}-%{release} Requires: device-mapper >= 1.02.39-1 -Requires: udev initscripts libudev +Requires: initscripts Requires(post): systemd-units systemd-sysv chkconfig Requires(preun): systemd-units Requires(postun): systemd-units @@ -47,7 +38,7 @@ Requires(postun): systemd-units BuildRequires: libaio-devel, device-mapper-devel >= 1.02.39-1 BuildRequires: libselinux-devel, libsepol-devel BuildRequires: readline-devel, ncurses-devel -BuildRequires: systemd-units, libudev-devel +BuildRequires: systemd-units, systemd-devel BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) @@ -84,7 +75,7 @@ Group: System Environment/Base kpartx manages partition creation and removal for device-mapper devices. %prep -%setup -q -n multipath-tools-120123 +%setup -q -n multipath-tools-120613 %patch0001 -p1 %patch0002 -p1 %patch0003 -p1 @@ -101,15 +92,6 @@ kpartx manages partition creation and removal for device-mapper devices. %patch0014 -p1 %patch0015 -p1 %patch0016 -p1 -%patch0017 -p1 -%patch0018 -p1 -%patch0019 -p1 -%patch0020 -p1 -%patch0021 -p1 -%patch0022 -p1 -%patch0023 -p1 -%patch0024 -p1 -%patch0025 -p1 cp %{SOURCE1} . %build @@ -166,17 +148,19 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||: %defattr(-,root,root,-) %{_sbindir}/multipath %{_sbindir}/multipathd -%{_sbindir}/cciss_id %{_sbindir}/mpathconf +%{_sbindir}/mpathpersist %{_unitdir}/multipathd.service +%{_mandir}/man3/mpath_persistent_reserve_in.3.gz +%{_mandir}/man3/mpath_persistent_reserve_out.3.gz %{_mandir}/man5/multipath.conf.5.gz %{_mandir}/man8/multipath.8.gz %{_mandir}/man8/multipathd.8.gz %{_mandir}/man8/mpathconf.8.gz -%config /lib/udev/rules.d/40-multipath.rules +%{_mandir}/man8/mpathpersist.8.gz +%config /lib/udev/rules.d/62-multipath.rules %doc AUTHOR COPYING FAQ -%doc multipath.conf multipath.conf.annotated -%doc multipath.conf.defaults multipath.conf.synthetic +%doc multipath.conf %dir /etc/multipath %files libs @@ -184,6 +168,8 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||: %doc AUTHOR COPYING %{_libdir}/libmultipath.so %{_libdir}/libmultipath.so.* +%{_libdir}/libmpathpersist.so +%{_libdir}/libmpathpersist.so.* %dir %{_libmpathdir} %{_libmpathdir}/* @@ -200,6 +186,22 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||: %{_mandir}/man8/kpartx.8.gz %changelog +* Thu Jun 28 2012 Benjamin Marzinski 0.4.9-27 +- Updated to latest upstream 0.4.9 code : multipath-tools-120613.tgz + (git commit id: cb0f7127ba90ab5e8e71fc534a0a16cdbe96a88f) +- Add 0001-RH-remove_callout.patch + * multipath no longer uses the getuid callout. It now gets the + wwid from the udev database or the environment variables +- Add 0004-RH-fix-cciss-names.patch + * convert cciss device names from cciss/cXdY to sysfs style cciss!cXdY +- Split 0009-RH-add-find-multipaths.patch into 0002-RH-add-wwids-file.patch + and 0010-RH-add-find-multipaths.patch +- Add 0016-RH-change-configs.patch + * default fast_io_fail to 5 and don't set the path selector in the + builtin configs. +Resolves: bz #831978 + + * Mon May 18 2012 Benjamin Marzinski 0.4.9-26 - Add 0025-RHBZ-822714-update-nodes.patch - Resolves: bz #822714 diff --git a/sources b/sources index 2329d3d..38f8bfd 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -7cea74ff9f3b494d1cba6884617d08fd multipath-tools-120123.tgz +84632b08dbca9fa04179edd8c469c92a multipath-tools-120613.tgz