From 91daccef68640e2e9f9a30205f19dde324201e9a Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Jun 28 2012 17:41:03 +0000 Subject: 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 --- 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/0002-RH-add-wwids-file.patch b/0002-RH-add-wwids-file.patch new file mode 100644 index 0000000..f3014ba --- /dev/null +++ b/0002-RH-add-wwids-file.patch @@ -0,0 +1,748 @@ +--- + libmultipath/Makefile | 2 + libmultipath/alias.c | 153 --------------------------------------- + libmultipath/alias.h | 1 + libmultipath/configure.c | 3 + libmultipath/defaults.h | 1 + libmultipath/discovery.c | 2 + libmultipath/file.c | 180 +++++++++++++++++++++++++++++++++++++++++++++++ + libmultipath/file.h | 11 ++ + libmultipath/wwids.c | 139 ++++++++++++++++++++++++++++++++++++ + libmultipath/wwids.h | 18 ++++ + multipath/main.c | 37 ++++++++- + 11 files changed, 389 insertions(+), 158 deletions(-) + +Index: multipath-tools-120518/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 + */ + #include +-#include +-#include +-#include + #include + #include + #include + #include + #include +-#include + + #include "debug.h" + #include "uxsock.h" + #include "alias.h" ++#include "file.h" + + + /* +@@ -36,150 +33,6 @@ + * See the file COPYING included with this distribution for more details. + */ + +-static int +-ensure_directories_exist(char *str, mode_t dir_mode) +-{ +- char *pathname; +- char *end; +- int err; +- +- pathname = strdup(str); +- if (!pathname){ +- condlog(0, "Cannot copy bindings file pathname : %s", +- strerror(errno)); +- return -1; +- } +- end = pathname; +- /* skip leading slashes */ +- while (end && *end && (*end == '/')) +- end++; +- +- while ((end = strchr(end, '/'))) { +- /* if there is another slash, make the dir. */ +- *end = '\0'; +- err = mkdir(pathname, dir_mode); +- if (err && errno != EEXIST) { +- condlog(0, "Cannot make directory [%s] : %s", +- pathname, strerror(errno)); +- free(pathname); +- return -1; +- } +- if (!err) +- condlog(3, "Created dir [%s]", pathname); +- *end = '/'; +- end++; +- } +- free(pathname); +- return 0; +-} +- +-static void +-sigalrm(int sig) +-{ +- /* do nothing */ +-} +- +-static int +-lock_bindings_file(int fd) +-{ +- struct sigaction act, oldact; +- sigset_t set, oldset; +- struct flock lock; +- int err; +- +- memset(&lock, 0, sizeof(lock)); +- lock.l_type = F_WRLCK; +- lock.l_whence = SEEK_SET; +- +- act.sa_handler = sigalrm; +- sigemptyset(&act.sa_mask); +- act.sa_flags = 0; +- sigemptyset(&set); +- sigaddset(&set, SIGALRM); +- +- sigaction(SIGALRM, &act, &oldact); +- sigprocmask(SIG_UNBLOCK, &set, &oldset); +- +- alarm(BINDINGS_FILE_TIMEOUT); +- err = fcntl(fd, F_SETLKW, &lock); +- alarm(0); +- +- if (err) { +- if (errno != EINTR) +- condlog(0, "Cannot lock bindings file : %s", +- strerror(errno)); +- else +- condlog(0, "Bindings file is locked. Giving up."); +- } +- +- sigprocmask(SIG_SETMASK, &oldset, NULL); +- sigaction(SIGALRM, &oldact, NULL); +- return err; +- +-} +- +- +-static int +-open_bindings_file(char *file, int *can_write) +-{ +- int fd; +- struct stat s; +- +- if (ensure_directories_exist(file, 0700)) +- return -1; +- *can_write = 1; +- fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); +- if (fd < 0) { +- if (errno == EROFS) { +- *can_write = 0; +- condlog(3, "Cannot open bindings file [%s] read/write. " +- " trying readonly", file); +- fd = open(file, O_RDONLY); +- if (fd < 0) { +- condlog(0, "Cannot open bindings file [%s] " +- "readonly : %s", file, strerror(errno)); +- return -1; +- } +- } +- else { +- condlog(0, "Cannot open bindings file [%s] : %s", file, +- strerror(errno)); +- return -1; +- } +- } +- if (*can_write && lock_bindings_file(fd) < 0) +- goto fail; +- +- memset(&s, 0, sizeof(s)); +- if (fstat(fd, &s) < 0){ +- condlog(0, "Cannot stat bindings file : %s", strerror(errno)); +- goto fail; +- } +- if (s.st_size == 0) { +- if (*can_write == 0) +- goto fail; +- /* If bindings file is empty, write the header */ +- size_t len = strlen(BINDINGS_FILE_HEADER); +- if (write_all(fd, BINDINGS_FILE_HEADER, len) != len) { +- condlog(0, +- "Cannot write header to bindings file : %s", +- strerror(errno)); +- /* cleanup partially written header */ +- if (ftruncate(fd, 0)) +- condlog(0, "Cannot truncate the header : %s", +- strerror(errno)); +- goto fail; +- } +- fsync(fd); +- condlog(3, "Initialized new bindings file [%s]", file); +- } +- +- return fd; +- +-fail: +- close(fd); +- return -1; +-} + + static int + format_devname(char *name, int id, int len, char *prefix) +@@ -370,7 +223,7 @@ get_user_friendly_alias(char *wwid, char + return NULL; + } + +- fd = open_bindings_file(file, &can_write); ++ fd = open_file(file, &can_write, BINDINGS_FILE_HEADER); + if (fd < 0) + return NULL; + +@@ -414,7 +267,7 @@ get_user_friendly_wwid(char *alias, char + return NULL; + } + +- fd = open_bindings_file(file, &unused); ++ fd = open_file(file, &unused, BINDINGS_FILE_HEADER); + if (fd < 0) + return NULL; + +Index: multipath-tools-120518/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-120518/libmultipath/configure.c +=================================================================== +--- 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 "wwids.h" + + extern int + setup_map (struct multipath * mpp, char * params, int params_size) +@@ -407,6 +408,8 @@ domap (struct multipath * mpp, char * pa + * DM_DEVICE_CREATE, DM_DEVICE_RENAME, or DM_DEVICE_RELOAD + * succeeded + */ ++ if (mpp->action == ACT_CREATE) ++ remember_wwid(mpp->wwid); + if (!conf->daemon) { + /* multipath client mode */ + dm_switchgroup(mpp->alias, mpp->bestpg); +Index: multipath-tools-120518/libmultipath/defaults.h +=================================================================== +--- 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-120518/libmultipath/file.c +=================================================================== +--- /dev/null ++++ multipath-tools-120518/libmultipath/file.c +@@ -0,0 +1,180 @@ ++/* ++ * Copyright (c) 2005 Christophe Varoqui ++ * Copyright (c) 2005 Benjamin Marzinski, Redhat ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "file.h" ++#include "debug.h" ++#include "uxsock.h" ++ ++ ++/* ++ * significant parts of this file were taken from iscsi-bindings.c of the ++ * linux-iscsi project. ++ * Copyright (C) 2002 Cisco Systems, Inc. ++ * ++ * 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. ++ * ++ * See the file COPYING included with this distribution for more details. ++ */ ++ ++static int ++ensure_directories_exist(char *str, mode_t dir_mode) ++{ ++ char *pathname; ++ char *end; ++ int err; ++ ++ pathname = strdup(str); ++ if (!pathname){ ++ condlog(0, "Cannot copy file pathname %s : %s", ++ str, strerror(errno)); ++ return -1; ++ } ++ end = pathname; ++ /* skip leading slashes */ ++ while (end && *end && (*end == '/')) ++ end++; ++ ++ while ((end = strchr(end, '/'))) { ++ /* if there is another slash, make the dir. */ ++ *end = '\0'; ++ err = mkdir(pathname, dir_mode); ++ if (err && errno != EEXIST) { ++ condlog(0, "Cannot make directory [%s] : %s", ++ pathname, strerror(errno)); ++ free(pathname); ++ return -1; ++ } ++ if (!err) ++ condlog(3, "Created dir [%s]", pathname); ++ *end = '/'; ++ end++; ++ } ++ free(pathname); ++ return 0; ++} ++ ++static void ++sigalrm(int sig) ++{ ++ /* do nothing */ ++} ++ ++static int ++lock_file(int fd, char *file_name) ++{ ++ struct sigaction act, oldact; ++ sigset_t set, oldset; ++ struct flock lock; ++ int err; ++ ++ memset(&lock, 0, sizeof(lock)); ++ lock.l_type = F_WRLCK; ++ lock.l_whence = SEEK_SET; ++ ++ act.sa_handler = sigalrm; ++ sigemptyset(&act.sa_mask); ++ act.sa_flags = 0; ++ sigemptyset(&set); ++ sigaddset(&set, SIGALRM); ++ ++ sigaction(SIGALRM, &act, &oldact); ++ sigprocmask(SIG_UNBLOCK, &set, &oldset); ++ ++ alarm(FILE_TIMEOUT); ++ err = fcntl(fd, F_SETLKW, &lock); ++ alarm(0); ++ ++ if (err) { ++ if (errno != EINTR) ++ condlog(0, "Cannot lock %s : %s", file_name, ++ strerror(errno)); ++ else ++ condlog(0, "%s is locked. Giving up.", file_name); ++ } ++ ++ sigprocmask(SIG_SETMASK, &oldset, NULL); ++ sigaction(SIGALRM, &oldact, NULL); ++ return err; ++} ++ ++int ++open_file(char *file, int *can_write, char *header) ++{ ++ int fd; ++ struct stat s; ++ ++ if (ensure_directories_exist(file, 0700)) ++ return -1; ++ *can_write = 1; ++ fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); ++ if (fd < 0) { ++ if (errno == EROFS) { ++ *can_write = 0; ++ condlog(3, "Cannot open file [%s] read/write. " ++ " trying readonly", file); ++ fd = open(file, O_RDONLY); ++ if (fd < 0) { ++ condlog(0, "Cannot open file [%s] " ++ "readonly : %s", file, strerror(errno)); ++ return -1; ++ } ++ } ++ else { ++ condlog(0, "Cannot open file [%s] : %s", file, ++ strerror(errno)); ++ return -1; ++ } ++ } ++ if (*can_write && lock_file(fd, file) < 0) ++ goto fail; ++ ++ memset(&s, 0, sizeof(s)); ++ if (fstat(fd, &s) < 0){ ++ condlog(0, "Cannot stat file %s : %s", file, strerror(errno)); ++ goto fail; ++ } ++ if (s.st_size == 0) { ++ if (*can_write == 0) ++ goto fail; ++ /* If file is empty, write the header */ ++ size_t len = strlen(header); ++ if (write_all(fd, header, len) != len) { ++ condlog(0, ++ "Cannot write header to file %s : %s", file, ++ strerror(errno)); ++ /* cleanup partially written header */ ++ if (ftruncate(fd, 0)) ++ condlog(0, "Cannot truncate header : %s", ++ strerror(errno)); ++ goto fail; ++ } ++ fsync(fd); ++ condlog(3, "Initialized new file [%s]", file); ++ } ++ ++ return fd; ++ ++fail: ++ close(fd); ++ return -1; ++} +Index: multipath-tools-120518/libmultipath/file.h +=================================================================== +--- /dev/null ++++ multipath-tools-120518/libmultipath/file.h +@@ -0,0 +1,11 @@ ++/* ++ * Copyright (c) 2010 Benjamin Marzinski, Redhat ++ */ ++ ++#ifndef _FILE_H ++#define _FILE_H ++ ++#define FILE_TIMEOUT 30 ++int open_file(char *file, int *can_write, char *header); ++ ++#endif /* _FILE_H */ +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-120518/libmultipath/wwids.c +@@ -0,0 +1,139 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "checkers.h" ++#include "vector.h" ++#include "structs.h" ++#include "debug.h" ++#include "uxsock.h" ++#include "file.h" ++#include "wwids.h" ++#include "defaults.h" ++ ++/* ++ * Copyright (c) 2010 Benjamin Marzinski, Redhat ++ */ ++ ++static int ++lookup_wwid(FILE *f, char *wwid) { ++ int c; ++ char buf[LINE_MAX]; ++ int count; ++ ++ while ((c = fgetc(f)) != EOF){ ++ if (c != '/') { ++ if (fgets(buf, LINE_MAX, f) == NULL) ++ return 0; ++ else ++ continue; ++ } ++ count = 0; ++ while ((c = fgetc(f)) != '/') { ++ if (c == EOF) ++ return 0; ++ if (count >= WWID_SIZE - 1) ++ goto next; ++ if (wwid[count] == '\0') ++ goto next; ++ if (c != wwid[count++]) ++ goto next; ++ } ++ if (wwid[count] == '\0') ++ return 1; ++next: ++ if (fgets(buf, LINE_MAX, f) == NULL) ++ return 0; ++ } ++ return 0; ++} ++ ++static int ++write_out_wwid(int fd, char *wwid) { ++ int ret; ++ off_t offset; ++ char buf[WWID_SIZE + 3]; ++ ++ ret = snprintf(buf, WWID_SIZE + 3, "/%s/\n", wwid); ++ if (ret >= (WWID_SIZE + 3) || ret < 0){ ++ condlog(0, "can't format wwid for writing (%d) : %s", ++ ret, strerror(errno)); ++ return -1; ++ } ++ offset = lseek(fd, 0, SEEK_END); ++ if (offset < 0) { ++ condlog(0, "can't seek to the end of wwids file : %s", ++ strerror(errno)); ++ return -1; ++ } ++ if (write_all(fd, buf, strlen(buf)) != strlen(buf)) { ++ condlog(0, "cannot write wwid to wwids file : %s", ++ strerror(errno)); ++ if (ftruncate(fd, offset)) ++ condlog(0, "cannot truncate failed wwid write : %s", ++ strerror(errno)); ++ return -1; ++ } ++ return 1; ++} ++ ++int ++check_wwids_file(char *wwid, int write_wwid) ++{ ++ int fd, can_write, found, ret; ++ FILE *f; ++ fd = open_file(DEFAULT_WWIDS_FILE, &can_write, WWIDS_FILE_HEADER); ++ if (fd < 0) ++ return -1; ++ ++ f = fdopen(fd, "r"); ++ if (!f) { ++ condlog(0,"can't fdopen wwids file : %s", strerror(errno)); ++ close(fd); ++ return -1; ++ } ++ found = lookup_wwid(f, wwid); ++ if (found) { ++ ret = 0; ++ goto out; ++ } ++ if (!write_wwid) { ++ ret = -1; ++ goto out; ++ } ++ if (!can_write) { ++ condlog(0, "wwids file is read-only. Can't write wwid"); ++ 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); ++ return ret; ++} ++ ++int ++remember_wwid(char *wwid) ++{ ++ int ret = check_wwids_file(wwid, 1); ++ if (ret < 0){ ++ condlog(3, "failed writing wwid %s to wwids file", wwid); ++ return -1; ++ } ++ if (ret == 1) ++ condlog(3, "wrote wwid %s to wwids file", wwid); ++ else ++ condlog(4, "wwid %s already in wwids file", wwid); ++ return 0; ++} +Index: multipath-tools-120518/libmultipath/wwids.h +=================================================================== +--- /dev/null ++++ multipath-tools-120518/libmultipath/wwids.h +@@ -0,0 +1,18 @@ ++/* ++ * Copyright (c) 2010 Benjamin Marzinski, Redhat ++ */ ++ ++#ifndef _WWIDS_H ++#define _WWIDS_H ++ ++#define WWIDS_FILE_HEADER \ ++"# Multipath wwids, Version : 1.0\n" \ ++"# NOTE: This file is automatically maintained by multipath and multipathd.\n" \ ++"# You should not need to edit this file in normal circumstances.\n" \ ++"#\n" \ ++"# Valid WWIDs:\n" ++ ++int remember_wwid(char *wwid); ++int check_wwids_file(char *wwid, int write_wwid); ++ ++#endif /* _WWIDS_H */ +Index: multipath-tools-120518/libmultipath/discovery.c +=================================================================== +--- multipath-tools-120518.orig/libmultipath/discovery.c ++++ multipath-tools-120518/libmultipath/discovery.c +@@ -810,6 +810,8 @@ get_uid (struct path * pp) + + 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; + diff --git a/0002-RH-dont_start_with_no_config.patch b/0002-RH-dont_start_with_no_config.patch deleted file mode 100644 index 7efd925..0000000 --- a/0002-RH-dont_start_with_no_config.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- - multipathd/multipathd.service | 1 + - 1 file changed, 1 insertion(+) - -Index: multipath-tools-110916/multipathd/multipathd.service -=================================================================== ---- multipath-tools-110916.orig/multipathd/multipathd.service -+++ multipath-tools-110916/multipathd/multipathd.service -@@ -2,6 +2,7 @@ - Description=Device-Mapper Multipath Device Controller - Before=iscsi.service iscsid.service - After=syslog.target -+ConditionPathExists=/etc/multipath.conf - - [Service] - Type=forking diff --git a/0003-RH-add-followover.patch b/0003-RH-add-followover.patch new file mode 100644 index 0000000..9aeecf4 --- /dev/null +++ b/0003-RH-add-followover.patch @@ -0,0 +1,235 @@ +--- + libmultipath/dict.c | 12 ++++++++++++ + libmultipath/discovery.c | 6 +++--- + libmultipath/print.c | 2 ++ + libmultipath/structs.h | 4 +++- + multipath/main.c | 2 +- + multipath/multipath.conf.5 | 5 +++++ + multipathd/main.c | 35 ++++++++++++++++++++++++++++++++++- + 7 files changed, 60 insertions(+), 6 deletions(-) + +Index: multipath-tools-120518/libmultipath/dict.c +=================================================================== +--- 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; ++ else if (strlen(buff) == 10 && !strcmp(buff, "followover")) ++ conf->pgfailback = -FAILBACK_FOLLOWOVER; + else + conf->pgfailback = atoi(buff); + +@@ -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; ++ else if (strlen(buff) == 10 && !strcmp(buff, "followover")) ++ hwe->pgfailback = -FAILBACK_FOLLOWOVER; + else + hwe->pgfailback = atoi(buff); + +@@ -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; ++ else if (strlen(buff) == 10 && !strcmp(buff, "followover")) ++ mpe->pgfailback = -FAILBACK_FOLLOWOVER; + else + mpe->pgfailback = atoi(buff); + +@@ -1769,6 +1775,8 @@ snprint_mp_failback (char * buff, int le + return snprintf(buff, len, "manual"); + case -FAILBACK_IMMEDIATE: + return snprintf(buff, len, "immediate"); ++ case -FAILBACK_FOLLOWOVER: ++ return snprintf(buff, len, "followover"); + default: + return snprintf(buff, len, "%i", mpe->pgfailback); + } +@@ -2130,6 +2138,8 @@ snprint_hw_failback (char * buff, int le + return snprintf(buff, len, "manual"); + case -FAILBACK_IMMEDIATE: + return snprintf(buff, len, "immediate"); ++ case -FAILBACK_FOLLOWOVER: ++ return snprintf(buff, len, "followover"); + default: + return snprintf(buff, len, "%i", hwe->pgfailback); + } +@@ -2394,6 +2404,8 @@ snprint_def_failback (char * buff, int l + return snprintf(buff, len, "manual"); + case -FAILBACK_IMMEDIATE: + return snprintf(buff, len, "immediate"); ++ case -FAILBACK_FOLLOWOVER: ++ return snprintf(buff, len, "followover"); + default: + return snprintf(buff, len, "%i", conf->pgfailback); + } +Index: multipath-tools-120518/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) + return snprintf(buff, len, "immediate"); ++ if (mpp->pgfailback == -FAILBACK_FOLLOWOVER) ++ return snprintf(buff, len, "followover"); + + if (!mpp->failback_tick) + return snprintf(buff, len, "-"); +Index: multipath-tools-120518/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, + FAILBACK_MANUAL, +- FAILBACK_IMMEDIATE ++ FAILBACK_IMMEDIATE, ++ FAILBACK_FOLLOWOVER + }; + + enum sysfs_buses { +@@ -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-120518.orig/multipathd/main.c ++++ multipath-tools-120518/multipathd/main.c +@@ -995,6 +995,32 @@ mpvec_garbage_collector (struct vectors + } + } + ++/* This is called after a path has started working again. It the multipath ++ * device for this path uses the followover failback type, and this is the ++ * best pathgroup, and this is the first path in the pathgroup to come back ++ * up, then switch to this pathgroup */ ++static int ++followover_should_failback(struct path * pp) ++{ ++ struct pathgroup * pgp; ++ struct path *pp1; ++ int i; ++ ++ if (pp->mpp->pgfailback != -FAILBACK_FOLLOWOVER || ++ !pp->mpp->pg || !pp->pgindex || ++ pp->pgindex != pp->mpp->bestpg) ++ return 0; ++ ++ pgp = VECTOR_SLOT(pp->mpp->pg, pp->pgindex - 1); ++ vector_foreach_slot(pgp->paths, pp1, i) { ++ if (pp1 == pp) ++ continue; ++ if (pp1->chkrstate != PATH_DOWN && pp1->chkrstate != PATH_SHAKY) ++ return 0; ++ } ++ return 1; ++} ++ + static void + defered_failback_tick (vector mpvec) + { +@@ -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 || ++ (chkr_new_path_up && followover_should_failback(pp))) + switch_pathgroup(pp->mpp); + } + } +Index: multipath-tools-120518/multipath/multipath.conf.5 +=================================================================== +--- 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 ++.B followover ++Only perform automatic failback when the first path of a pathgroup ++becomes active. This keeps a node from automatically failing back when ++another node requested the failover. ++.TP + .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/0003-RH-multipath.rules.patch b/0003-RH-multipath.rules.patch deleted file mode 100644 index 97e5397..0000000 --- a/0003-RH-multipath.rules.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- - multipath/Makefile | 6 +++--- - multipath/multipath.rules | 29 +++++++++++++++++++++++------ - 2 files changed, 26 insertions(+), 9 deletions(-) - -Index: multipath-tools-111219/multipath/multipath.rules -=================================================================== ---- multipath-tools-111219.orig/multipath/multipath.rules -+++ multipath-tools-111219/multipath/multipath.rules -@@ -1,7 +1,24 @@ --# --# udev rules for multipathing. --# The persistent symlinks are created with the kpartx rules --# -+# multipath wants the devmaps presented as meaninglful device names -+# so name them after their devmap name -+SUBSYSTEM!="block", GOTO="end_mpath" - --# socket for uevents --SUBSYSTEM=="block", RUN+="socket:/org/kernel/dm/multipath_event" -+ENV{MPATH_SBIN_PATH}="/sbin" -+TEST!="$env{MPATH_SBIN_PATH}/multipath", ENV{MPATH_SBIN_PATH}="/usr/sbin" -+ -+ACTION=="add", ENV{DEVTYPE}!="partition", \ -+ ENV{DM_MULTIPATH_DEVICE_PATH}!="1", \ -+ PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \ -+ ENV{DM_MULTIPATH_DEVICE_PATH}="1" -+ -+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" -+ENV{DM_UUID}!="mpath-?*", GOTO="end_mpath" -+ENV{DM_SUSPENDED}=="1", GOTO="end_mpath" -+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 -=================================================================== ---- multipath-tools-111219.orig/multipath/Makefile -+++ multipath-tools-111219/multipath/Makefile -@@ -21,15 +21,15 @@ $(EXEC): $(OBJS) - install: - $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) - $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ -- $(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) -d $(DESTDIR)$(mandir) - $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) - $(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) - $(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir) - - uninstall: -- rm $(DESTDIR)/etc/udev/rules.d/multipath.rules -+ rm $(DESTDIR)/lib/udev/rules.d/40-multipath.rules - rm $(DESTDIR)$(bindir)/$(EXEC) - rm $(DESTDIR)$(mandir)/$(EXEC).8.gz - rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz 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/0005-RH-dont_start_with_no_config.patch b/0005-RH-dont_start_with_no_config.patch new file mode 100644 index 0000000..7efd925 --- /dev/null +++ b/0005-RH-dont_start_with_no_config.patch @@ -0,0 +1,16 @@ +--- + multipathd/multipathd.service | 1 + + 1 file changed, 1 insertion(+) + +Index: multipath-tools-110916/multipathd/multipathd.service +=================================================================== +--- multipath-tools-110916.orig/multipathd/multipathd.service ++++ multipath-tools-110916/multipathd/multipathd.service +@@ -2,6 +2,7 @@ + Description=Device-Mapper Multipath Device Controller + Before=iscsi.service iscsid.service + After=syslog.target ++ConditionPathExists=/etc/multipath.conf + + [Service] + Type=forking diff --git a/0006-RH-Make-build-system-RH-Fedora-friendly.patch b/0006-RH-Make-build-system-RH-Fedora-friendly.patch deleted file mode 100644 index 7d5db31..0000000 --- a/0006-RH-Make-build-system-RH-Fedora-friendly.patch +++ /dev/null @@ -1,76 +0,0 @@ -From f5e11246063b07d6dce6d37d3b74662475baa981 Mon Sep 17 00:00:00 2001 -From: Fabio M. Di Nitto -Date: Thu, 15 Oct 2009 04:39:27 +0200 -Subject: [PATCH 08/12] RH: Make build system RH/Fedora friendly - -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(-) - -Index: multipath-tools-120123/Makefile.inc -=================================================================== ---- multipath-tools-120123.orig/Makefile.inc -+++ multipath-tools-120123/Makefile.inc -@@ -28,7 +28,7 @@ libudevdir = ${prefix}/lib/udev - multipathdir = $(TOPDIR)/libmultipath - mandir = $(prefix)/usr/share/man/man8 - man5dir = $(prefix)/usr/share/man/man5 --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 -=================================================================== ---- multipath-tools-120123.orig/kpartx/Makefile -+++ multipath-tools-120123/kpartx/Makefile -@@ -26,10 +26,10 @@ $(EXEC): $(OBJS) - install: $(EXEC) $(EXEC).8 - $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) - $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) -- $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir) -- $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir) -- $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d -- $(INSTALL_PROGRAM) -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/ -+# $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir) -+# $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir) -+# $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d -+# $(INSTALL_PROGRAM) -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/ - $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) - $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) - -Index: multipath-tools-120123/multipathd/Makefile -=================================================================== ---- multipath-tools-120123.orig/multipathd/Makefile -+++ multipath-tools-120123/multipathd/Makefile -@@ -35,6 +35,7 @@ install: - $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) - $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) - $(INSTALL_PROGRAM) -d $(DESTDIR)$(rcdir) -+ $(INSTALL_PROGRAM) -m 755 multipathd.init.redhat $(DESTDIR)$(rcdir)/$(EXEC) - $(INSTALL_PROGRAM) -d $(DESTDIR)$(unitdir) - $(INSTALL_PROGRAM) -m 644 $(EXEC).service $(DESTDIR)$(unitdir) - $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) -Index: multipath-tools-120123/libmultipath/Makefile -=================================================================== ---- multipath-tools-120123.orig/libmultipath/Makefile -+++ multipath-tools-120123/libmultipath/Makefile -@@ -39,9 +39,11 @@ install: - $(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir) - $(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS) - $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(libdir) -+ ln -sf $(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB) - - uninstall: - rm -f $(DESTDIR)$(syslibdir)/$(LIBS) -+ rm -f $(DESTDIR)$(syslibdir)/$(DEVLIB) - - clean: - rm -f core *.a *.o *.gz *.so *.so.* diff --git a/0006-RH-multipath.rules.patch b/0006-RH-multipath.rules.patch new file mode 100644 index 0000000..bfcfc98 --- /dev/null +++ b/0006-RH-multipath.rules.patch @@ -0,0 +1,64 @@ +--- + multipath/Makefile | 6 +++--- + multipath/multipath.rules | 30 ++++++++++++++++++++++++------ + 2 files changed, 27 insertions(+), 9 deletions(-) + +Index: multipath-tools-120613/multipath/multipath.rules +=================================================================== +--- 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 +-# ++# multipath wants the devmaps presented as meaninglful device names ++# so name them after their devmap name ++SUBSYSTEM!="block", GOTO="end_mpath" + +-# socket for uevents +-SUBSYSTEM=="block", RUN+="socket:/org/kernel/dm/multipath_event" ++ENV{MPATH_SBIN_PATH}="/sbin" ++TEST!="$env{MPATH_SBIN_PATH}/multipath", ENV{MPATH_SBIN_PATH}="/usr/sbin" ++ ++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" ++ ++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" ++ENV{DM_UUID}!="mpath-?*", GOTO="end_mpath" ++ENV{DM_SUSPENDED}=="1", GOTO="end_mpath" ++ENV{DM_ACTION}=="PATH_FAILED", GOTO="end_mpath" ++RUN+="$env{MPATH_SBIN_PATH}/kpartx -a -p p $tempnode" ++LABEL="end_mpath" +Index: multipath-tools-120613/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) + $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ +- $(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/62-multipath.rules + $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) + $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + $(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) + $(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir) + + uninstall: +- rm $(DESTDIR)/etc/udev/rules.d/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/0007-RH-Make-build-system-RH-Fedora-friendly.patch b/0007-RH-Make-build-system-RH-Fedora-friendly.patch new file mode 100644 index 0000000..bc5d17d --- /dev/null +++ b/0007-RH-Make-build-system-RH-Fedora-friendly.patch @@ -0,0 +1,101 @@ +From f5e11246063b07d6dce6d37d3b74662475baa981 Mon Sep 17 00:00:00 2001 +From: Fabio M. Di Nitto +Date: Thu, 15 Oct 2009 04:39:27 +0200 +Subject: [PATCH 08/12] RH: Make build system RH/Fedora friendly + +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 ++++---- + libmpathpersist/Makefile | 7 ++----- + libmultipath/Makefile | 2 ++ + multipathd/Makefile | 1 + + 5 files changed, 10 insertions(+), 10 deletions(-) + +Index: multipath-tools-120613/Makefile.inc +=================================================================== +--- 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-120613/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) + $(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir) +- $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir) +- $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir) +- $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d +- $(INSTALL_PROGRAM) -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/ ++# $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir) ++# $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir) ++# $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d ++# $(INSTALL_PROGRAM) -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/ + $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) + $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + +Index: multipath-tools-120613/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) + $(INSTALL_PROGRAM) -d $(DESTDIR)$(rcdir) ++ $(INSTALL_PROGRAM) -m 755 multipathd.init.redhat $(DESTDIR)$(rcdir)/$(EXEC) + $(INSTALL_PROGRAM) -d $(DESTDIR)$(unitdir) + $(INSTALL_PROGRAM) -m 644 $(EXEC).service $(DESTDIR)$(unitdir) + $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) +Index: multipath-tools-120613/libmultipath/Makefile +=================================================================== +--- 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) ++ ln -sf $(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB) + + uninstall: + rm -f $(DESTDIR)$(syslibdir)/$(LIBS) ++ rm -f $(DESTDIR)$(syslibdir)/$(DEVLIB) + + 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/0007-RH-multipathd-blacklist-all-by-default.patch deleted file mode 100644 index 6e64237..0000000 --- a/0007-RH-multipathd-blacklist-all-by-default.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 61b2002c6b2752c15b431e400cd614edc8c5b039 Mon Sep 17 00:00:00 2001 -From: Fabio M. Di Nitto -Date: Mon, 19 Oct 2009 07:05:45 +0200 -Subject: [PATCH 09/12] RH: multipathd blacklist all by default - -If there is no configuration installed on the system, blacklist -everything by default. - -BZ#528059 - -Signed-off-by: Fabio M. Di Nitto ---- -:100644 100644 e7e962e... 5aa1ab0... M libmultipath/config.c -:100644 100644 86b1320... 7e90e75... M libmultipath/config.h - libmultipath/config.c | 16 ++++++++++++++++ - libmultipath/config.h | 1 + - 2 files changed, 17 insertions(+) - -Index: multipath-tools-111219/libmultipath/config.c -=================================================================== ---- multipath-tools-111219.orig/libmultipath/config.c -+++ multipath-tools-111219/libmultipath/config.c -@@ -20,6 +20,7 @@ - #include "defaults.h" - #include "prio.h" - #include "devmapper.h" -+#include "version.h" - - static int - hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2) -@@ -539,6 +540,21 @@ load_config (char * file) - - } else { - init_keywords(); -+ condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices."); -+ condlog(0, "A default multipath.conf file is located at"); -+ condlog(0, "/usr/share/doc/device-mapper-multipath-%d.%d.%d/multipath.conf", MULTIPATH_VERSION(VERSION_CODE)); -+ if (conf->blist_devnode == NULL) { -+ conf->blist_devnode = vector_alloc(); -+ if (!conf->blist_devnode) { -+ condlog(0, "cannot allocate blacklist\n"); -+ goto out; -+ } -+ } -+ if (store_ble(conf->blist_devnode, strdup(".*"), -+ ORIGIN_NO_CONFIG)) { -+ condlog(0, "cannot store default no-config blacklist\n"); -+ goto out; -+ } - } - - /* -Index: multipath-tools-111219/libmultipath/config.h -=================================================================== ---- multipath-tools-111219.orig/libmultipath/config.h -+++ multipath-tools-111219/libmultipath/config.h -@@ -6,6 +6,7 @@ - - #define ORIGIN_DEFAULT 0 - #define ORIGIN_CONFIG 1 -+#define ORIGIN_NO_CONFIG 2 - - enum devtypes { - DEV_NONE, diff --git a/0008-RH-add-mpathconf.patch b/0008-RH-add-mpathconf.patch deleted file mode 100644 index 800c113..0000000 --- a/0008-RH-add-mpathconf.patch +++ /dev/null @@ -1,546 +0,0 @@ ---- - 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(-) - -Index: multipath-tools-111219/libmultipath/config.c -=================================================================== ---- multipath-tools-111219.orig/libmultipath/config.c -+++ multipath-tools-111219/libmultipath/config.c -@@ -543,6 +543,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)); -+ condlog(0, "You can run /sbin/mpathconf to create or modify /etc/multipath.conf"); - if (conf->blist_devnode == NULL) { - conf->blist_devnode = vector_alloc(); - if (!conf->blist_devnode) { -Index: multipath-tools-111219/multipath/Makefile -=================================================================== ---- multipath-tools-111219.orig/multipath/Makefile -+++ multipath-tools-111219/multipath/Makefile -@@ -17,22 +17,27 @@ $(EXEC): $(OBJS) - $(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) - $(GZIP) $(EXEC).8 > $(EXEC).8.gz - $(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz -+ $(GZIP) mpathconf.8 > mpathconf.8.gz - - install: - $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) - $(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) -d $(DESTDIR)$(mandir) - $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) - $(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) - $(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir) -+ $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(mandir) - - uninstall: - rm $(DESTDIR)/lib/udev/rules.d/40-multipath.rules - rm $(DESTDIR)$(bindir)/$(EXEC) -+ rm $(DESTDIR)$(bindir)/mpathconf - rm $(DESTDIR)$(mandir)/$(EXEC).8.gz - rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz -+ rm $(DESTDIR)$(mandir)/mpathconf.8.gz - - clean: - rm -f core *.o $(EXEC) *.gz -Index: multipath-tools-111219/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[]) - exit(1); - } - -- if (dm_prereq()) -+ if (load_config(DEFAULT_CONFIGFILE)) - exit(1); - -- if (load_config(DEFAULT_CONFIGFILE)) -+ if (dm_prereq()) - exit(1); - - if (sysfs_init(conf->sysfs_dir, FILE_NAME_SIZE)) { -Index: multipath-tools-111219/multipath/mpathconf -=================================================================== ---- /dev/null -+++ multipath-tools-111219/multipath/mpathconf -@@ -0,0 +1,351 @@ -+#!/bin/sh -+# -+# Copyright (C) 2010 Red Hat, Inc. All rights reserved. -+# -+# This file is part of the device-mapper-multipath package. -+# -+# This copyrighted material is made available to anyone wishing to use, -+# modify, copy, or redistribute it subject to the terms and conditions -+# of the GNU General Public License v.2. -+# -+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ -+# -+# Simple editting of /etc/multipath.conf -+# 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 -+ -+DEFAULT_CONFIGFILE="/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf" -+CONFIGFILE="/etc/multipath.conf" -+MULTIPATHDIR="/etc/multipath" -+TMPFILE=/etc/multipath/.multipath.conf.tmp -+ -+function usage -+{ -+ echo "usage: $0 " -+ echo "" -+ echo "Commands:" -+ echo "Enable: --enable " -+ echo "Disable: --disable" -+ echo "Set user_friendly_names (Default n): --user_friendly_names " -+ 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 "" -+} -+ -+function parse_args -+{ -+ while [ -n "$1" ]; do -+ case $1 in -+ --enable) -+ ENABLE=1 -+ shift -+ ;; -+ --disable) -+ ENABLE=0 -+ shift -+ ;; -+ --user_friendly_names) -+ if [ -n "$2" ]; then -+ FRIENDLY=$2 -+ shift 2 -+ else -+ usage -+ exit 1 -+ fi -+ ;; -+ --find_multipaths) -+ if [ -n "$2" ]; then -+ FIND=$2 -+ shift 2 -+ else -+ usage -+ exit 1 -+ fi -+ ;; -+ --with_module) -+ if [ -n "$2" ]; then -+ MODULE=$2 -+ shift 2 -+ else -+ usage -+ exit 1 -+ fi -+ ;; -+ --with_multipathd) -+ if [ -n "$2" ]; then -+ MULTIPATHD=$2 -+ shift 2 -+ else -+ usage -+ exit 1 -+ fi -+ ;; -+ --with_chkconfig) -+ if [ -n "$2" ]; then -+ CHKCONFIG=$2 -+ shift 2 -+ else -+ usage -+ exit 1 -+ fi -+ ;; -+ *) -+ usage -+ exit -+ esac -+ done -+} -+ -+function validate_args -+{ -+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$MODULE" ]; then -+ echo "ignoring extra parameters on disable" -+ FRIENDLY="" -+ FIND="" -+ MODULE="" -+ fi -+ if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then -+ echo "--user_friendly_names must be either 'y' or 'n'" -+ exit 1 -+ fi -+ if [ -n "$FIND" ] && [ "$FIND" != "y" -a "$FIND" != "n" ]; then -+ echo "--find_multipaths must be either 'y' or 'n'" -+ exit 1 -+ fi -+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" ]; then -+ SHOW_STATUS=1 -+ fi -+ if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then -+ echo "--with_module must be either 'y' or 'n'" -+ exit 1 -+ fi -+ if [ -n "$MULTIPATHD" ] && [ "$MULTIPATHD" != "y" -a "$MULTIPATHD" != "n" ]; then -+ 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 -+ -+parse_args "$@" -+ -+validate_args -+ -+if [ ! -d "$MULTIPATHDIR" ]; then -+ echo "/etc/multipath/ does not exist. failing" -+ exit 1 -+fi -+ -+rm $TMPFILE 2> /dev/null -+if [ -f "$CONFIGFILE" ]; then -+ cp $CONFIGFILE $TMPFILE -+elif [ -f "$DEFAULT_CONFIGFILE" ]; then -+ cp $DEFAULT_CONFIGFILE $TMPFILE -+else -+ touch $TMPFILE -+fi -+ -+if grep -q "^blacklist[[:space:]]*{" $TMPFILE ; then -+ HAVE_BLACKLIST=1 -+fi -+ -+if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then -+ HAVE_DEFAULTS=1 -+fi -+ -+if [ -z "$MODULE" -o "$MODULE" = "y" ]; then -+ if lsmod | grep -q "dm_multipath" ; then -+ HAVE_MODULE=1 -+ else -+ HAVE_MODULE=0 -+ fi -+fi -+ -+if [ "$MULTIPATHD" = "y" ]; then -+ if service multipathd status > /dev/null ; then -+ HAVE_MULTIPATHD=1 -+ else -+ HAVE_MULTIPATHD=0 -+ 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 -+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[#[:space:]]*devnode \"\.\?\*\"" ; then -+ HAVE_DISABLE=0 -+ fi -+fi -+ -+if [ "$HAVE_DEFAULTS" = "1" ]; then -+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*find_multipaths[[:space:]]*\(yes\|1\)" ; then -+ HAVE_FIND=1 -+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*find_multipaths[[:space:]]*\(no\|0\)" ; then -+ HAVE_FIND=0 -+ fi -+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)" ; then -+ HAVE_FRIENDLY=1 -+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)" ; then -+ HAVE_FRIENDLY=0 -+ fi -+fi -+ -+if [ -n "$SHOW_STATUS" ]; then -+ if [ -z "$HAVE_DISABLE" -o "$HAVE_DISABLE" = 0 ]; then -+ echo "multipath is enabled" -+ else -+ echo "multipath is disabled" -+ fi -+ if [ -z "$HAVE_FIND" -o "$HAVE_FIND" = 0 ]; then -+ echo "find_multipaths is disabled" -+ else -+ echo "find_multipaths is enabled" -+ fi -+ if [ -z "$HAVE_FRIENDLY" -o "$HAVE_FRIENDLY" = 0 ]; then -+ echo "user_friendly_names is disabled" -+ else -+ echo "user_friendly_names is enabled" -+ fi -+ if [ -n "$HAVE_MODULE" ]; then -+ if [ "$HAVE_MODULE" = 1 ]; then -+ echo "dm_multipath module is loaded" -+ else -+ echo "dm_multipath module is not loaded" -+ fi -+ fi -+ 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 -+ -+if [ -z "$HAVE_BLACKLIST" ]; then -+ cat >> $TMPFILE <<- _EOF_ -+ -+blacklist { -+} -+_EOF_ -+fi -+ -+if [ -z "$HAVE_DEFAULTS" ]; then -+ cat >> $TMPFILE <<- _EOF_ -+ -+defaults { -+} -+_EOF_ -+fi -+ -+if [ "$ENABLE" = 1 ]; then -+ if [ "$HAVE_DISABLE" = 1 ]; then -+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE -+ fi -+elif [ "$ENABLE" = 0 ]; then -+ if [ -z "$HAVE_DISABLE" ]; then -+ sed -i '/^blacklist[[:space:]]*{/ a\ -+ devnode "*" -+' $TMPFILE -+ elif [ "$HAVE_DISABLE" = 0 ]; then -+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[#[:space:]]*devnode \"\.\?\*\"/ devnode ".*"/' $TMPFILE -+ fi -+fi -+ -+if [ "$FIND" = "n" ]; then -+ if [ "$HAVE_FIND" = 1 ]; then -+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*find_multipaths[[:space:]]*\(yes\|1\)/ find_multipaths no/' $TMPFILE -+ CHANGED_CONFIG=1 -+ fi -+elif [ "$FIND" = "y" ]; then -+ if [ -z "$HAVE_FIND" ]; then -+ sed -i '/^defaults[[:space:]]*{/ a\ -+ find_multipaths yes -+' $TMPFILE -+ CHANGED_CONFIG=1 -+ elif [ "$HAVE_FIND" = 0 ]; then -+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*find_multipaths[[:space:]]*\(no\|0\)/ find_multipaths yes/' $TMPFILE -+ CHANGED_CONFIG=1 -+ fi -+fi -+ -+if [ "$FRIENDLY" = "n" ]; then -+ if [ "$HAVE_FRIENDLY" = 1 ]; then -+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE -+ CHANGED_CONFIG=1 -+ fi -+elif [ "$FRIENDLY" = "y" ]; then -+ if [ -z "$HAVE_FRIENDLY" ]; then -+ sed -i '/^defaults[[:space:]]*{/ a\ -+ user_friendly_names yes -+' $TMPFILE -+ CHANGED_CONFIG=1 -+ elif [ "$HAVE_FRIENDLY" = 0 ]; then -+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE -+ CHANGED_CONFIG=1 -+ fi -+fi -+ -+if [ -f "$CONFIGFILE" ]; then -+ cp $CONFIGFILE $CONFIGFILE.old -+ if [ $? != 0 ]; then -+ echo "failed to backup old config file, $CONFIGFILE not updated" -+ exit 1 -+ fi -+fi -+ -+cp $TMPFILE $CONFIGFILE -+if [ $? != 0 ]; then -+ echo "failed to copy new config file into place, check $CONFIGFILE is still OK" -+ exit 1 -+fi -+ -+rm -f $TMPFILE -+ -+if [ "$ENABLE" = 1 ]; then -+ if [ "$HAVE_MODULE" = 0 ]; then -+ modprobe dm_multipath -+ fi -+ 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 -=================================================================== ---- /dev/null -+++ multipath-tools-111219/multipath/mpathconf.8 -@@ -0,0 +1,116 @@ -+.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual" -+.SH NAME -+mpathconf - A tool for configuring device-mapper-multipath -+.SH SYNOPSIS -+.B mpathconf -+.RB [\| commands \|] -+.RB [\| options \|] -+.SH DESCRIPTION -+.B mpathconf -+is a utility that creates or modifies -+.B /etc/multipath.conf. -+It can enable or disable multipathing and configure some common options. -+.B mpathconf -+can also load the -+.B dm_multipath -+module, start and stop the -+.B multipathd -+daemon, and configure the -+.B multipathd -+service to start automatically or not. If -+.B mpathconf -+is called with no commands, it will display the current configuration. -+ -+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 -+that users can manually edit their config file if necessary, before starting -+.B multipathd. -+ -+If -+.B /etc/multipath.conf -+already exists, mpathconf will edit it. If it does not exist, mpathconf will -+use -+.B /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf -+as the starting file. This file has -+.B user_friendly_names -+set. If this file does not exist, mpathconf will create -+.B /etc/multipath.conf -+from scratch. For most users, this means that -+.B user_friendly_names -+will be set by default, unless they use the -+.B --user_friendly_names n -+command. -+.SH COMMANDS -+.TP -+.B --enable -+Removes any line that blacklists all device nodes from the -+.B /etc/multipath.conf -+blacklist section. -+.TP -+.B --disable -+Adds a line that blacklists all device nodes to the -+.B /etc/multipath.conf -+blacklist section. If no blacklist section exists, it will create one. -+.TP -+.B --user_friendly_name \fP { \fBy\fP | \fBn\fP } -+If set to \fBy\fP, this adds the line -+.B user_friendly_names yes -+to the -+.B /etc/multipath.conf -+defaults section. If set to \fBn\fP, this removes the line, if present. This -+command can be used along with any other command. -+.TP -+.B --find_multipaths\fP { \fBy\fP | \fBn\fP } -+If set to \fBy\fP, this adds the line -+.B find_multipaths yes -+to the -+.B /etc/multipath.conf -+defaults section. If set to \fBn\fP, this removes the line, if present. This -+command can be used aldong with any other command. -+.SH OPTIONS -+.TP -+.B --with_module\fP { \fBy\fP | \fBn\fP } -+If set to \fBy\fP, this runs -+.B modprobe dm_multipath -+to install the multipath modules. This option only works with the -+.B --enable -+command. This option is set to \fBy\fP by default. -+.TP -+.B --with_multipathd { \fBy\fP | \fBn\fP } -+If set to \fBy\fP, this runs -+.B service multipathd start -+to start the multipathd daemon on \fB--enable\fP, -+.B service multipathd stop -+to start the multipathd daemon on \fB--disable\fP, and -+.B service multipathd reload -+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), -+.BR service (8), -+.SH AUTHOR -+Benjamin Marzinski diff --git a/0008-RH-multipathd-blacklist-all-by-default.patch b/0008-RH-multipathd-blacklist-all-by-default.patch new file mode 100644 index 0000000..5bbf3ca --- /dev/null +++ b/0008-RH-multipathd-blacklist-all-by-default.patch @@ -0,0 +1,64 @@ +From 61b2002c6b2752c15b431e400cd614edc8c5b039 Mon Sep 17 00:00:00 2001 +From: Fabio M. Di Nitto +Date: Mon, 19 Oct 2009 07:05:45 +0200 +Subject: [PATCH 09/12] RH: multipathd blacklist all by default + +If there is no configuration installed on the system, blacklist +everything by default. + +BZ#528059 + +Signed-off-by: Fabio M. Di Nitto +--- +:100644 100644 e7e962e... 5aa1ab0... M libmultipath/config.c +:100644 100644 86b1320... 7e90e75... M libmultipath/config.h + libmultipath/config.c | 16 ++++++++++++++++ + libmultipath/config.h | 1 + + 2 files changed, 17 insertions(+) + +Index: multipath-tools-120518/libmultipath/config.c +=================================================================== +--- 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" ++#include "version.h" + + static int + hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2) +@@ -549,6 +550,21 @@ load_config (char * file) + + } else { + init_keywords(); ++ condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices."); ++ condlog(0, "A default multipath.conf file is located at"); ++ condlog(0, "/usr/share/doc/device-mapper-multipath-%d.%d.%d/multipath.conf", MULTIPATH_VERSION(VERSION_CODE)); ++ if (conf->blist_devnode == NULL) { ++ conf->blist_devnode = vector_alloc(); ++ if (!conf->blist_devnode) { ++ condlog(0, "cannot allocate blacklist\n"); ++ goto out; ++ } ++ } ++ if (store_ble(conf->blist_devnode, strdup(".*"), ++ ORIGIN_NO_CONFIG)) { ++ condlog(0, "cannot store default no-config blacklist\n"); ++ goto out; ++ } + } + + /* +Index: multipath-tools-120518/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 + + /* + * In kernel, fast_io_fail == 0 means immediate failure on rport delete. diff --git a/0009-RH-add-find-multipaths.patch b/0009-RH-add-find-multipaths.patch deleted file mode 100644 index b706687..0000000 --- a/0009-RH-add-find-multipaths.patch +++ /dev/null @@ -1,824 +0,0 @@ ---- - libmultipath/Makefile | 2 - libmultipath/alias.c | 151 --------------------------------------- - 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/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(-) - -Index: multipath-tools-111219/libmultipath/alias.c -=================================================================== ---- multipath-tools-111219.orig/libmultipath/alias.c -+++ multipath-tools-111219/libmultipath/alias.c -@@ -3,19 +3,16 @@ - * Copyright (c) 2005 Benjamin Marzinski, Redhat - */ - #include --#include --#include --#include - #include - #include - #include - #include - #include --#include - - #include "debug.h" - #include "uxsock.h" - #include "alias.h" -+#include "file.h" - - - /* -@@ -36,148 +33,6 @@ - * See the file COPYING included with this distribution for more details. - */ - --static int --ensure_directories_exist(char *str, mode_t dir_mode) --{ -- char *pathname; -- char *end; -- int err; -- -- pathname = strdup(str); -- if (!pathname){ -- condlog(0, "Cannot copy bindings file pathname : %s", -- strerror(errno)); -- return -1; -- } -- end = pathname; -- /* skip leading slashes */ -- while (end && *end && (*end == '/')) -- end++; -- -- while ((end = strchr(end, '/'))) { -- /* if there is another slash, make the dir. */ -- *end = '\0'; -- err = mkdir(pathname, dir_mode); -- if (err && errno != EEXIST) { -- condlog(0, "Cannot make directory [%s] : %s", -- pathname, strerror(errno)); -- free(pathname); -- return -1; -- } -- if (!err) -- condlog(3, "Created dir [%s]", pathname); -- *end = '/'; -- end++; -- } -- free(pathname); -- return 0; --} -- --static void --sigalrm(int sig) --{ -- /* do nothing */ --} -- --static int --lock_bindings_file(int fd) --{ -- struct sigaction act, oldact; -- sigset_t set, oldset; -- struct flock lock; -- int err; -- -- memset(&lock, 0, sizeof(lock)); -- lock.l_type = F_WRLCK; -- lock.l_whence = SEEK_SET; -- -- act.sa_handler = sigalrm; -- sigemptyset(&act.sa_mask); -- act.sa_flags = 0; -- sigemptyset(&set); -- sigaddset(&set, SIGALRM); -- -- sigaction(SIGALRM, &act, &oldact); -- sigprocmask(SIG_UNBLOCK, &set, &oldset); -- -- alarm(BINDINGS_FILE_TIMEOUT); -- err = fcntl(fd, F_SETLKW, &lock); -- alarm(0); -- -- if (err) { -- if (errno != EINTR) -- condlog(0, "Cannot lock bindings file : %s", -- strerror(errno)); -- else -- condlog(0, "Bindings file is locked. Giving up."); -- } -- -- sigprocmask(SIG_SETMASK, &oldset, NULL); -- sigaction(SIGALRM, &oldact, NULL); -- return err; -- --} -- -- --static int --open_bindings_file(char *file, int *can_write) --{ -- int fd; -- struct stat s; -- -- if (ensure_directories_exist(file, 0700)) -- return -1; -- *can_write = 1; -- fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); -- if (fd < 0) { -- if (errno == EROFS) { -- *can_write = 0; -- condlog(3, "Cannot open bindings file [%s] read/write. " -- " trying readonly", file); -- fd = open(file, O_RDONLY); -- if (fd < 0) { -- condlog(0, "Cannot open bindings file [%s] " -- "readonly : %s", file, strerror(errno)); -- return -1; -- } -- } -- else { -- condlog(0, "Cannot open bindings file [%s] : %s", file, -- strerror(errno)); -- return -1; -- } -- } -- if (*can_write && lock_bindings_file(fd) < 0) -- goto fail; -- -- memset(&s, 0, sizeof(s)); -- if (fstat(fd, &s) < 0){ -- condlog(0, "Cannot stat bindings file : %s", strerror(errno)); -- goto fail; -- } -- if (s.st_size == 0) { -- if (*can_write == 0) -- goto fail; -- /* If bindings file is empty, write the header */ -- size_t len = strlen(BINDINGS_FILE_HEADER); -- if (write_all(fd, BINDINGS_FILE_HEADER, len) != len) { -- condlog(0, -- "Cannot write header to bindings file : %s", -- strerror(errno)); -- /* cleanup partially written header */ -- ftruncate(fd, 0); -- goto fail; -- } -- fsync(fd); -- condlog(3, "Initialized new bindings file [%s]", file); -- } -- -- return fd; -- --fail: -- close(fd); -- return -1; --} - - static int - format_devname(char *name, int id, int len, char *prefix) -@@ -366,7 +221,7 @@ get_user_friendly_alias(char *wwid, char - return NULL; - } - -- fd = open_bindings_file(file, &can_write); -+ fd = open_file(file, &can_write, BINDINGS_FILE_HEADER); - if (fd < 0) - return NULL; - -@@ -416,7 +271,7 @@ get_user_friendly_wwid(char *alias, char - return NULL; - } - -- fd = open_bindings_file(file, &unused); -+ fd = open_file(file, &unused, BINDINGS_FILE_HEADER); - if (fd < 0) - return NULL; - -Index: multipath-tools-111219/libmultipath/alias.h -=================================================================== ---- multipath-tools-111219.orig/libmultipath/alias.h -+++ multipath-tools-111219/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 -=================================================================== ---- 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 @@ - #include "prio.h" - #include "util.h" - #include "uxsock.h" -+#include "finder.h" - - extern int - setup_map (struct multipath * mpp, char * params, int params_size) -@@ -405,6 +406,8 @@ domap (struct multipath * mpp, char * pa - * DM_DEVICE_CREATE, DM_DEVICE_RENAME, or DM_DEVICE_RELOAD - * succeeded - */ -+ if (mpp->action == ACT_CREATE) -+ remember_wwid(mpp->wwid); - 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 -=================================================================== ---- 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 @@ - #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 -=================================================================== ---- /dev/null -+++ multipath-tools-111219/libmultipath/file.c -@@ -0,0 +1,178 @@ -+/* -+ * Copyright (c) 2005 Christophe Varoqui -+ * Copyright (c) 2005 Benjamin Marzinski, Redhat -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "file.h" -+#include "debug.h" -+#include "uxsock.h" -+ -+ -+/* -+ * significant parts of this file were taken from iscsi-bindings.c of the -+ * linux-iscsi project. -+ * Copyright (C) 2002 Cisco Systems, Inc. -+ * -+ * 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. -+ * -+ * See the file COPYING included with this distribution for more details. -+ */ -+ -+static int -+ensure_directories_exist(char *str, mode_t dir_mode) -+{ -+ char *pathname; -+ char *end; -+ int err; -+ -+ pathname = strdup(str); -+ if (!pathname){ -+ condlog(0, "Cannot copy file pathname %s : %s", -+ str, strerror(errno)); -+ return -1; -+ } -+ end = pathname; -+ /* skip leading slashes */ -+ while (end && *end && (*end == '/')) -+ end++; -+ -+ while ((end = strchr(end, '/'))) { -+ /* if there is another slash, make the dir. */ -+ *end = '\0'; -+ err = mkdir(pathname, dir_mode); -+ if (err && errno != EEXIST) { -+ condlog(0, "Cannot make directory [%s] : %s", -+ pathname, strerror(errno)); -+ free(pathname); -+ return -1; -+ } -+ if (!err) -+ condlog(3, "Created dir [%s]", pathname); -+ *end = '/'; -+ end++; -+ } -+ free(pathname); -+ return 0; -+} -+ -+static void -+sigalrm(int sig) -+{ -+ /* do nothing */ -+} -+ -+static int -+lock_file(int fd, char *file_name) -+{ -+ struct sigaction act, oldact; -+ sigset_t set, oldset; -+ struct flock lock; -+ int err; -+ -+ memset(&lock, 0, sizeof(lock)); -+ lock.l_type = F_WRLCK; -+ lock.l_whence = SEEK_SET; -+ -+ act.sa_handler = sigalrm; -+ sigemptyset(&act.sa_mask); -+ act.sa_flags = 0; -+ sigemptyset(&set); -+ sigaddset(&set, SIGALRM); -+ -+ sigaction(SIGALRM, &act, &oldact); -+ sigprocmask(SIG_UNBLOCK, &set, &oldset); -+ -+ alarm(FILE_TIMEOUT); -+ err = fcntl(fd, F_SETLKW, &lock); -+ alarm(0); -+ -+ if (err) { -+ if (errno != EINTR) -+ condlog(0, "Cannot lock %s : %s", file_name, -+ strerror(errno)); -+ else -+ condlog(0, "%s is locked. Giving up.", file_name); -+ } -+ -+ sigprocmask(SIG_SETMASK, &oldset, NULL); -+ sigaction(SIGALRM, &oldact, NULL); -+ return err; -+} -+ -+int -+open_file(char *file, int *can_write, char *header) -+{ -+ int fd; -+ struct stat s; -+ -+ if (ensure_directories_exist(file, 0700)) -+ return -1; -+ *can_write = 1; -+ fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); -+ if (fd < 0) { -+ if (errno == EROFS) { -+ *can_write = 0; -+ condlog(3, "Cannot open file [%s] read/write. " -+ " trying readonly", file); -+ fd = open(file, O_RDONLY); -+ if (fd < 0) { -+ condlog(0, "Cannot open file [%s] " -+ "readonly : %s", file, strerror(errno)); -+ return -1; -+ } -+ } -+ else { -+ condlog(0, "Cannot open file [%s] : %s", file, -+ strerror(errno)); -+ return -1; -+ } -+ } -+ if (*can_write && lock_file(fd, file) < 0) -+ goto fail; -+ -+ memset(&s, 0, sizeof(s)); -+ if (fstat(fd, &s) < 0){ -+ condlog(0, "Cannot stat file %s : %s", file, strerror(errno)); -+ goto fail; -+ } -+ if (s.st_size == 0) { -+ if (*can_write == 0) -+ goto fail; -+ /* If file is empty, write the header */ -+ size_t len = strlen(header); -+ if (write_all(fd, header, len) != len) { -+ condlog(0, -+ "Cannot write header to file %s : %s", file, -+ strerror(errno)); -+ /* cleanup partially written header */ -+ ftruncate(fd, 0); -+ goto fail; -+ } -+ fsync(fd); -+ condlog(3, "Initialized new file [%s]", file); -+ } -+ -+ return fd; -+ -+fail: -+ close(fd); -+ return -1; -+} -Index: multipath-tools-111219/libmultipath/file.h -=================================================================== ---- /dev/null -+++ multipath-tools-111219/libmultipath/file.h -@@ -0,0 +1,11 @@ -+/* -+ * Copyright (c) 2010 Benjamin Marzinski, Redhat -+ */ -+ -+#ifndef _FILE_H -+#define _FILE_H -+ -+#define FILE_TIMEOUT 30 -+int open_file(char *file, int *can_write, char *header); -+ -+#endif /* _FILE_H */ -Index: multipath-tools-111219/libmultipath/finder.c -=================================================================== ---- /dev/null -+++ multipath-tools-111219/libmultipath/finder.c -@@ -0,0 +1,165 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "checkers.h" -+#include "vector.h" -+#include "structs.h" -+#include "debug.h" -+#include "uxsock.h" -+#include "file.h" -+#include "finder.h" -+#include "defaults.h" -+ -+/* -+ * Copyright (c) 2010 Benjamin Marzinski, Redhat -+ */ -+ -+static int -+lookup_wwid(FILE *f, char *wwid) { -+ int c; -+ char buf[LINE_MAX]; -+ int count; -+ -+ while ((c = fgetc(f)) != EOF){ -+ if (c != '/') { -+ if (fgets(buf, LINE_MAX, f) == NULL) -+ return 0; -+ else -+ continue; -+ } -+ count = 0; -+ while ((c = fgetc(f)) != '/') { -+ if (c == EOF) -+ return 0; -+ if (count >= WWID_SIZE - 1) -+ goto next; -+ if (wwid[count] == '\0') -+ goto next; -+ if (c != wwid[count++]) -+ goto next; -+ } -+ if (wwid[count] == '\0') -+ return 1; -+next: -+ if (fgets(buf, LINE_MAX, f) == NULL) -+ return 0; -+ } -+ return 0; -+} -+ -+static int -+write_out_wwid(int fd, char *wwid) { -+ int ret; -+ off_t offset; -+ char buf[WWID_SIZE + 3]; -+ -+ ret = snprintf(buf, WWID_SIZE + 3, "/%s/\n", wwid); -+ if (ret >= (WWID_SIZE + 3) || ret < 0){ -+ condlog(0, "can't format wwid for writing (%d) : %s", -+ ret, strerror(errno)); -+ return -1; -+ } -+ offset = lseek(fd, 0, SEEK_END); -+ if (offset < 0) { -+ condlog(0, "can't seek to the end of wwids file : %s", -+ strerror(errno)); -+ return -1; -+ } -+ if (write_all(fd, buf, strlen(buf)) != strlen(buf)) { -+ condlog(0, "cannot write wwid to wwids file : %s", -+ strerror(errno)); -+ ftruncate(fd, offset); -+ return -1; -+ } -+ return 1; -+} -+ -+static int -+check_wwids_file(char *wwid, int write_wwid) -+{ -+ int scan_fd, 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"); -+ if (!f) { -+ condlog(0,"can't fdopen wwids file : %s", strerror(errno)); -+ close(fd); -+ close(scan_fd); -+ return -1; -+ } -+ found = lookup_wwid(f, wwid); -+ if (found) { -+ ret = 0; -+ goto out; -+ } -+ if (!write_wwid) { -+ ret = -1; -+ goto out; -+ } -+ if (!can_write) { -+ condlog(0, "wwids file is read-only. Can't write wwid"); -+ 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); -+ if (ret < 0){ -+ condlog(3, "failed writing wwid %s to wwids file", wwid); -+ return -1; -+ } -+ if (ret == 1) -+ condlog(3, "wrote wwid %s to wwids file", wwid); -+ else -+ condlog(4, "wwid %s already in wwids file", wwid); -+ return 0; -+} -Index: multipath-tools-111219/libmultipath/finder.h -=================================================================== ---- /dev/null -+++ multipath-tools-111219/libmultipath/finder.h -@@ -0,0 +1,18 @@ -+/* -+ * Copyright (c) 2010 Benjamin Marzinski, Redhat -+ */ -+ -+#ifndef _FINDER_H -+#define _FINDER_H -+ -+#define WWIDS_FILE_HEADER \ -+"# Multipath wwids, Version : 1.0\n" \ -+"# NOTE: This file is automatically maintained by multipath and multipathd.\n" \ -+"# You should not need to edit this file in normal circumstances.\n" \ -+"#\n" \ -+"# Valid WWIDs:\n" -+ -+int should_multipath(struct path *pp, vector pathvec); -+int remember_wwid(char *wwid); -+ -+#endif /* _FINDER_H */ -Index: multipath-tools-111219/multipath/main.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" - - int logsink; -@@ -209,6 +210,7 @@ get_dm_mpvec (vector curmp, vector pathv - - 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/0009-RH-add-mpathconf.patch b/0009-RH-add-mpathconf.patch new file mode 100644 index 0000000..2a5bec8 --- /dev/null +++ b/0009-RH-add-mpathconf.patch @@ -0,0 +1,494 @@ +--- + libmultipath/config.c | 1 + multipath/Makefile | 5 + multipath/main.c | 4 + multipath/mpathconf | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++ + multipath/mpathconf.8 | 103 ++++++++++++++++ + 5 files changed, 423 insertions(+), 2 deletions(-) + +Index: multipath-tools-120613/libmultipath/config.c +=================================================================== +--- 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)); ++ condlog(0, "You can run /sbin/mpathconf to create or modify /etc/multipath.conf"); + if (conf->blist_devnode == NULL) { + conf->blist_devnode = vector_alloc(); + if (!conf->blist_devnode) { +Index: multipath-tools-120613/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 + $(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz ++ $(GZIP) mpathconf.8 > mpathconf.8.gz + + install: + $(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) + $(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/62-multipath.rules + $(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir) + $(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir) + $(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) + $(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir) ++ $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(mandir) + + uninstall: + rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules + rm $(DESTDIR)$(bindir)/$(EXEC) ++ rm $(DESTDIR)$(bindir)/mpathconf + rm $(DESTDIR)$(mandir)/$(EXEC).8.gz + rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz ++ rm $(DESTDIR)$(mandir)/mpathconf.8.gz + + clean: + rm -f core *.o $(EXEC) *.gz +Index: multipath-tools-120613/multipath/main.c +=================================================================== +--- multipath-tools-120613.orig/multipath/main.c ++++ multipath-tools-120613/multipath/main.c +@@ -432,10 +432,10 @@ main (int argc, char *argv[]) + exit(1); + } + +- if (dm_prereq()) ++ if (load_config(DEFAULT_CONFIGFILE)) + exit(1); + +- if (load_config(DEFAULT_CONFIGFILE)) ++ if (dm_prereq()) + exit(1); + + while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) { +Index: multipath-tools-120613/multipath/mpathconf +=================================================================== +--- /dev/null ++++ multipath-tools-120613/multipath/mpathconf +@@ -0,0 +1,312 @@ ++#!/bin/sh ++# ++# Copyright (C) 2010 Red Hat, Inc. All rights reserved. ++# ++# This file is part of the device-mapper-multipath package. ++# ++# This copyrighted material is made available to anyone wishing to use, ++# modify, copy, or redistribute it subject to the terms and conditions ++# of the GNU General Public License v.2. ++# ++# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ ++# ++# Simple editting of /etc/multipath.conf ++# This program was largely ripped off from lvmconf ++# ++ ++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" ++MULTIPATHDIR="/etc/multipath" ++TMPFILE=/etc/multipath/.multipath.conf.tmp ++ ++function usage ++{ ++ echo "usage: $0 " ++ echo "" ++ echo "Commands:" ++ echo "Enable: --enable " ++ echo "Disable: --disable" ++ echo "Set user_friendly_names (Default n): --user_friendly_names " ++ 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 "" ++} ++ ++function parse_args ++{ ++ while [ -n "$1" ]; do ++ case $1 in ++ --enable) ++ ENABLE=1 ++ shift ++ ;; ++ --disable) ++ ENABLE=0 ++ shift ++ ;; ++ --user_friendly_names) ++ if [ -n "$2" ]; then ++ FRIENDLY=$2 ++ shift 2 ++ else ++ usage ++ exit 1 ++ fi ++ ;; ++ --find_multipaths) ++ if [ -n "$2" ]; then ++ FIND=$2 ++ shift 2 ++ else ++ usage ++ exit 1 ++ fi ++ ;; ++ --with_module) ++ if [ -n "$2" ]; then ++ MODULE=$2 ++ shift 2 ++ else ++ usage ++ exit 1 ++ fi ++ ;; ++ --with_multipathd) ++ if [ -n "$2" ]; then ++ MULTIPATHD=$2 ++ shift 2 ++ else ++ usage ++ exit 1 ++ fi ++ ;; ++ *) ++ usage ++ exit ++ esac ++ done ++} ++ ++function validate_args ++{ ++ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$MODULE" ]; then ++ echo "ignoring extra parameters on disable" ++ FRIENDLY="" ++ FIND="" ++ MODULE="" ++ fi ++ if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then ++ echo "--user_friendly_names must be either 'y' or 'n'" ++ exit 1 ++ fi ++ if [ -n "$FIND" ] && [ "$FIND" != "y" -a "$FIND" != "n" ]; then ++ echo "--find_multipaths must be either 'y' or 'n'" ++ exit 1 ++ fi ++ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" ]; then ++ SHOW_STATUS=1 ++ fi ++ if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then ++ echo "--with_module must be either 'y' or 'n'" ++ exit 1 ++ fi ++ if [ -n "$MULTIPATHD" ] && [ "$MULTIPATHD" != "y" -a "$MULTIPATHD" != "n" ]; then ++ echo "--with_multipathd must be either 'y' or 'n'" ++ exit 1 ++ fi ++} ++ ++umask 0077 ++ ++parse_args "$@" ++ ++validate_args ++ ++if [ ! -d "$MULTIPATHDIR" ]; then ++ echo "/etc/multipath/ does not exist. failing" ++ exit 1 ++fi ++ ++rm $TMPFILE 2> /dev/null ++if [ -f "$CONFIGFILE" ]; then ++ cp $CONFIGFILE $TMPFILE ++elif [ -f "$DEFAULT_CONFIGFILE" ]; then ++ cp $DEFAULT_CONFIGFILE $TMPFILE ++else ++ touch $TMPFILE ++fi ++ ++if grep -q "^blacklist[[:space:]]*{" $TMPFILE ; then ++ HAVE_BLACKLIST=1 ++fi ++ ++if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then ++ HAVE_DEFAULTS=1 ++fi ++ ++if [ -z "$MODULE" -o "$MODULE" = "y" ]; then ++ if lsmod | grep -q "dm_multipath" ; then ++ HAVE_MODULE=1 ++ else ++ HAVE_MODULE=0 ++ fi ++fi ++ ++if [ "$MULTIPATHD" = "y" ]; then ++ if service multipathd status > /dev/null ; then ++ HAVE_MULTIPATHD=1 ++ else ++ HAVE_MULTIPATHD=0 ++ fi ++fi ++ ++if [ "$HAVE_BLACKLIST" = "1" ]; then ++ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode \"\.\?\*\"" ; then ++ HAVE_DISABLE=1 ++ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[#[:space:]]*devnode \"\.\?\*\"" ; then ++ HAVE_DISABLE=0 ++ fi ++fi ++ ++if [ "$HAVE_DEFAULTS" = "1" ]; then ++ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*find_multipaths[[:space:]]*\(yes\|1\)" ; then ++ HAVE_FIND=1 ++ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*find_multipaths[[:space:]]*\(no\|0\)" ; then ++ HAVE_FIND=0 ++ fi ++ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)" ; then ++ HAVE_FRIENDLY=1 ++ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)" ; then ++ HAVE_FRIENDLY=0 ++ fi ++fi ++ ++if [ -n "$SHOW_STATUS" ]; then ++ if [ -z "$HAVE_DISABLE" -o "$HAVE_DISABLE" = 0 ]; then ++ echo "multipath is enabled" ++ else ++ echo "multipath is disabled" ++ fi ++ if [ -z "$HAVE_FIND" -o "$HAVE_FIND" = 0 ]; then ++ echo "find_multipaths is disabled" ++ else ++ echo "find_multipaths is enabled" ++ fi ++ if [ -z "$HAVE_FRIENDLY" -o "$HAVE_FRIENDLY" = 0 ]; then ++ echo "user_friendly_names is disabled" ++ else ++ echo "user_friendly_names is enabled" ++ fi ++ if [ -n "$HAVE_MODULE" ]; then ++ if [ "$HAVE_MODULE" = 1 ]; then ++ echo "dm_multipath module is loaded" ++ else ++ echo "dm_multipath module is not loaded" ++ fi ++ fi ++ if [ -n "$HAVE_MULTIPATHD" ]; then ++ service multipathd status ++ fi ++ exit 0 ++fi ++ ++if [ -z "$HAVE_BLACKLIST" ]; then ++ cat >> $TMPFILE <<- _EOF_ ++ ++blacklist { ++} ++_EOF_ ++fi ++ ++if [ -z "$HAVE_DEFAULTS" ]; then ++ cat >> $TMPFILE <<- _EOF_ ++ ++defaults { ++} ++_EOF_ ++fi ++ ++if [ "$ENABLE" = 1 ]; then ++ if [ "$HAVE_DISABLE" = 1 ]; then ++ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE ++ fi ++elif [ "$ENABLE" = 0 ]; then ++ if [ -z "$HAVE_DISABLE" ]; then ++ sed -i '/^blacklist[[:space:]]*{/ a\ ++ devnode "*" ++' $TMPFILE ++ elif [ "$HAVE_DISABLE" = 0 ]; then ++ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[#[:space:]]*devnode \"\.\?\*\"/ devnode ".*"/' $TMPFILE ++ fi ++fi ++ ++if [ "$FIND" = "n" ]; then ++ if [ "$HAVE_FIND" = 1 ]; then ++ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*find_multipaths[[:space:]]*\(yes\|1\)/ find_multipaths no/' $TMPFILE ++ CHANGED_CONFIG=1 ++ fi ++elif [ "$FIND" = "y" ]; then ++ if [ -z "$HAVE_FIND" ]; then ++ sed -i '/^defaults[[:space:]]*{/ a\ ++ find_multipaths yes ++' $TMPFILE ++ CHANGED_CONFIG=1 ++ elif [ "$HAVE_FIND" = 0 ]; then ++ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*find_multipaths[[:space:]]*\(no\|0\)/ find_multipaths yes/' $TMPFILE ++ CHANGED_CONFIG=1 ++ fi ++fi ++ ++if [ "$FRIENDLY" = "n" ]; then ++ if [ "$HAVE_FRIENDLY" = 1 ]; then ++ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE ++ CHANGED_CONFIG=1 ++ fi ++elif [ "$FRIENDLY" = "y" ]; then ++ if [ -z "$HAVE_FRIENDLY" ]; then ++ sed -i '/^defaults[[:space:]]*{/ a\ ++ user_friendly_names yes ++' $TMPFILE ++ CHANGED_CONFIG=1 ++ elif [ "$HAVE_FRIENDLY" = 0 ]; then ++ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE ++ CHANGED_CONFIG=1 ++ fi ++fi ++ ++if [ -f "$CONFIGFILE" ]; then ++ cp $CONFIGFILE $CONFIGFILE.old ++ if [ $? != 0 ]; then ++ echo "failed to backup old config file, $CONFIGFILE not updated" ++ exit 1 ++ fi ++fi ++ ++cp $TMPFILE $CONFIGFILE ++if [ $? != 0 ]; then ++ echo "failed to copy new config file into place, check $CONFIGFILE is still OK" ++ exit 1 ++fi ++ ++rm -f $TMPFILE ++ ++if [ "$ENABLE" = 1 ]; then ++ if [ "$HAVE_MODULE" = 0 ]; then ++ modprobe dm_multipath ++ fi ++ if [ "$HAVE_MULTIPATHD" = 0 ]; then ++ service multipathd start ++ fi ++elif [ "$ENABLE" = 0 ]; then ++ if [ "$HAVE_MULTIPATHD" = 1 ]; then ++ service multipathd stop ++ fi ++elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then ++ service multipathd reload ++fi +Index: multipath-tools-120613/multipath/mpathconf.8 +=================================================================== +--- /dev/null ++++ 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 ++.SH SYNOPSIS ++.B mpathconf ++.RB [\| commands \|] ++.RB [\| options \|] ++.SH DESCRIPTION ++.B mpathconf ++is a utility that creates or modifies ++.B /etc/multipath.conf. ++It can enable or disable multipathing and configure some common options. ++.B mpathconf ++can also load the ++.B dm_multipath ++module, start and stop the ++.B multipathd ++daemon, and configure the ++.B multipathd ++service to start automatically or not. If ++.B mpathconf ++is called with no commands, it will display the current configuration. ++ ++The default options for mpathconf are ++.B --with_module ++The ++.B --with_multipathd ++option is not set by default. Enabling multipathing will load the ++.B dm_multipath ++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. ++ ++If ++.B /etc/multipath.conf ++already exists, mpathconf will edit it. If it does not exist, mpathconf will ++use ++.B /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf ++as the starting file. This file has ++.B user_friendly_names ++set. If this file does not exist, mpathconf will create ++.B /etc/multipath.conf ++from scratch. For most users, this means that ++.B user_friendly_names ++will be set by default, unless they use the ++.B --user_friendly_names n ++command. ++.SH COMMANDS ++.TP ++.B --enable ++Removes any line that blacklists all device nodes from the ++.B /etc/multipath.conf ++blacklist section. ++.TP ++.B --disable ++Adds a line that blacklists all device nodes to the ++.B /etc/multipath.conf ++blacklist section. If no blacklist section exists, it will create one. ++.TP ++.B --user_friendly_name \fP { \fBy\fP | \fBn\fP } ++If set to \fBy\fP, this adds the line ++.B user_friendly_names yes ++to the ++.B /etc/multipath.conf ++defaults section. If set to \fBn\fP, this removes the line, if present. This ++command can be used along with any other command. ++.TP ++.B --find_multipaths\fP { \fBy\fP | \fBn\fP } ++If set to \fBy\fP, this adds the line ++.B find_multipaths yes ++to the ++.B /etc/multipath.conf ++defaults section. If set to \fBn\fP, this removes the line, if present. This ++command can be used aldong with any other command. ++.SH OPTIONS ++.TP ++.B --with_module\fP { \fBy\fP | \fBn\fP } ++If set to \fBy\fP, this runs ++.B modprobe dm_multipath ++to install the multipath modules. This option only works with the ++.B --enable ++command. This option is set to \fBy\fP by default. ++.TP ++.B --with_multipathd { \fBy\fP | \fBn\fP } ++If set to \fBy\fP, this runs ++.B service multipathd start ++to start the multipathd daemon on \fB--enable\fP, ++.B service multipathd stop ++to start the multipathd daemon on \fB--disable\fP, and ++.B service multipathd reload ++to reconfigure multipathd on \fB--user_frindly_names\fP and ++\fB--find_multipaths\fP. ++This option is set to \fBn\fP by default. ++.SH FILES ++.BR /etc/multipath.conf ++.SH "SEE ALSO" ++.BR multipath.conf (5), ++.BR modprobe (8), ++.BR multipath (8), ++.BR multipathd (8), ++.BR service (8), ++.SH AUTHOR ++Benjamin Marzinski 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/0012-RH-RHEL5-style-partitions.patch b/0012-RH-RHEL5-style-partitions.patch new file mode 100644 index 0000000..47fa725 --- /dev/null +++ b/0012-RH-RHEL5-style-partitions.patch @@ -0,0 +1,327 @@ +--- + kpartx/bsd.c | 35 --------------- + kpartx/dos.c | 7 +-- + kpartx/kpartx.c | 123 +++++++------------------------------------------------- + kpartx/kpartx.h | 1 + kpartx/sun.c | 35 --------------- + 5 files changed, 24 insertions(+), 177 deletions(-) + +Index: multipath-tools-120123/kpartx/bsd.c +=================================================================== +--- multipath-tools-120123.orig/kpartx/bsd.c ++++ multipath-tools-120123/kpartx/bsd.c +@@ -50,10 +50,10 @@ int + read_bsd_pt(int fd, struct slice all, struct slice *sp, int ns) { + struct bsd_disklabel *l; + struct bsd_partition *p; +- unsigned int offset = all.start, end; ++ unsigned int offset = all.start; + int max_partitions; + char *bp; +- int n = 0, i, j; ++ int n = 0; + + bp = getblock(fd, offset+1); /* 1 sector suffices */ + if (bp == NULL) +@@ -79,36 +79,5 @@ read_bsd_pt(int fd, struct slice all, st + break; + } + } +- /* +- * Convention has it that the bsd disklabel will always have +- * the 'c' partition spanning the entire disk. +- * So we have to check for contained slices. +- */ +- for(i = 0; i < n; i++) { +- if (sp[i].size == 0) +- continue; +- +- end = sp[i].start + sp[i].size; +- for(j = 0; j < n; j ++) { +- if ( i == j ) +- continue; +- if (sp[j].size == 0) +- continue; +- +- if (sp[i].start < sp[j].start) { +- if (end > sp[j].start && +- end < sp[j].start + sp[j].size) { +- /* Invalid slice */ +- fprintf(stderr, +- "bsd_disklabel: slice %d overlaps with %d\n", i , j); +- sp[i].size = 0; +- } +- } else { +- if (end <= sp[j].start + sp[j].size) { +- sp[i].container = j + 1; +- } +- } +- } +- } + return n; + } +Index: multipath-tools-120123/kpartx/dos.c +=================================================================== +--- multipath-tools-120123.orig/kpartx/dos.c ++++ multipath-tools-120123/kpartx/dos.c +@@ -16,7 +16,7 @@ is_extended(int type) { + } + + static int +-read_extended_partition(int fd, struct partition *ep, int en, ++read_extended_partition(int fd, struct partition *ep, + struct slice *sp, int ns) + { + struct partition p; +@@ -53,7 +53,6 @@ read_extended_partition(int fd, struct p + if (n < ns) { + sp[n].start = here + le32_to_cpu(p.start_sect); + sp[n].size = le32_to_cpu(p.nr_sects); +- sp[n].container = en + 1; + n++; + } else { + fprintf(stderr, +@@ -98,7 +97,9 @@ read_dos_pt(int fd, struct slice all, st + break; + } + if (is_extended(p.sys_type)) { +- n += read_extended_partition(fd, &p, i, sp+n, ns-n); ++ n += read_extended_partition(fd, &p, sp+n, ns-n); ++ /* hide the extended partition itself */ ++ sp[i].size = 2; + } + } + return n; +Index: multipath-tools-120123/kpartx/kpartx.c +=================================================================== +--- multipath-tools-120123.orig/kpartx/kpartx.c ++++ multipath-tools-120123/kpartx/kpartx.c +@@ -190,7 +190,7 @@ get_hotplug_device(void) + + int + main(int argc, char **argv){ +- int i, j, m, n, op, off, arg, c, d, ro=0; ++ int i, j, m, n, op, off, arg, ro=0; + int fd = -1; + struct slice all; + struct pt *ptp; +@@ -380,49 +380,30 @@ main(int argc, char **argv){ + else + continue; + ++ /* ++ * test for overlap, as in the case of an extended partition ++ * zero their size to avoid mapping ++ */ ++ for (j = 0; j < n; j++) { ++ for (m = j + 1; m < n; m++) { ++ if (slices[m].start > slices[j].start && ++ slices[m].start < slices[j].start + ++ slices[j].size) ++ slices[j].size = 0; ++ } ++ } ++ + switch(what) { + case LIST: +- for (j = 0, c = 0, m = 0; j < n; j++) { ++ for (j = 0; j < n; j++) { + if (slices[j].size == 0) + continue; +- if (slices[j].container > 0) { +- c++; +- continue; +- } +- +- slices[j].minor = m++; + + printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n", + mapname, delim, j+1, + slices[j].size, device, + slices[j].start); + } +- /* Loop to resolve contained slices */ +- d = c; +- while (c) { +- for (j = 0; j < n; j++) { +- uint64_t start; +- int k = slices[j].container - 1; +- +- if (slices[j].size == 0) +- continue; +- if (slices[j].minor > 0) +- continue; +- if (slices[j].container == 0) +- continue; +- slices[j].minor = m++; +- +- start = slices[j].start - slices[k].start; +- printf("%s%s%d : 0 %" PRIu64 " /dev/dm-%d %" PRIu64 "\n", +- mapname, delim, j+1, +- slices[j].size, +- slices[k].minor, start); +- c--; +- } +- /* Terminate loop if nothing more to resolve */ +- if (d == c) +- break; +- } + + break; + +@@ -461,16 +442,10 @@ main(int argc, char **argv){ + case ADD: + case UPDATE: + /* ADD and UPDATE share the same code that adds new partitions. */ +- for (j = 0, c = 0; j < n; j++) { ++ for (j = 0; j < n; j++) { + if (slices[j].size == 0) + continue; + +- /* Skip all contained slices */ +- if (slices[j].container > 0) { +- c++; +- continue; +- } +- + if (safe_sprintf(partname, "%s%s%d", + mapname, delim, j+1)) { + fprintf(stderr, "partname too small\n"); +@@ -511,72 +486,6 @@ main(int argc, char **argv){ + slices[j].minor, slices[j].size, + DM_TARGET, params); + } +- /* Loop to resolve contained slices */ +- d = c; +- while (c) { +- for (j = 0; j < n; j++) { +- uint64_t start; +- int k = slices[j].container - 1; +- +- if (slices[j].size == 0) +- continue; +- +- /* Skip all existing slices */ +- if (slices[j].minor > 0) +- continue; +- +- /* Skip all simple slices */ +- if (slices[j].container == 0) +- continue; +- +- /* Check container slice */ +- if (slices[k].size == 0) +- fprintf(stderr, "Invalid slice %d\n", +- k); +- +- if (safe_sprintf(partname, "%s%s%d", +- mapname, delim, j+1)) { +- fprintf(stderr, "partname too small\n"); +- exit(1); +- } +- strip_slash(partname); +- +- start = slices[j].start - slices[k].start; +- if (safe_sprintf(params, "%d:%d %" PRIu64, +- slices[k].major, +- slices[k].minor, +- start)) { +- fprintf(stderr, "params too small\n"); +- exit(1); +- } +- +- op = (dm_map_present(partname) ? +- DM_DEVICE_RELOAD : DM_DEVICE_CREATE); +- +- dm_addmap(op, partname, DM_TARGET, params, +- slices[j].size, ro, uuid, j+1, +- buf.st_mode & 0777, +- buf.st_uid, buf.st_gid, +- &cookie); +- +- if (op == DM_DEVICE_RELOAD) +- dm_simplecmd(DM_DEVICE_RESUME, +- partname, 1, +- &cookie); +- +- dm_devn(partname, &slices[j].major, +- &slices[j].minor); +- +- if (verbose) +- printf("add map %s : 0 %" PRIu64 " %s %s\n", +- partname, slices[j].size, +- DM_TARGET, params); +- c--; +- } +- /* Terminate loop */ +- if (d == c) +- break; +- } + + if (what == ADD) { + /* Skip code that removes devmappings for deleted partitions */ +Index: multipath-tools-120123/kpartx/kpartx.h +=================================================================== +--- multipath-tools-120123.orig/kpartx/kpartx.h ++++ multipath-tools-120123/kpartx/kpartx.h +@@ -24,7 +24,6 @@ + struct slice { + uint64_t start; + uint64_t size; +- int container; + int major; + int minor; + }; +Index: multipath-tools-120123/kpartx/sun.c +=================================================================== +--- multipath-tools-120123.orig/kpartx/sun.c ++++ multipath-tools-120123/kpartx/sun.c +@@ -62,8 +62,8 @@ int + read_sun_pt(int fd, struct slice all, struct slice *sp, int ns) { + struct sun_disk_label *l; + struct sun_raw_part *s; +- unsigned int offset = all.start, end; +- int i, j, n; ++ unsigned int offset = all.start; ++ int i, n; + char *bp; + + bp = getblock(fd, offset); +@@ -95,37 +95,6 @@ read_sun_pt(int fd, struct slice all, st + break; + } + } +- /* +- * Convention has it that the SUN disklabel will always have +- * the 'c' partition spanning the entire disk. +- * So we have to check for contained slices. +- */ +- for(i = 0; i < SUN_DISK_MAXPARTITIONS; i++) { +- if (sp[i].size == 0) +- continue; +- +- end = sp[i].start + sp[i].size; +- for(j = 0; j < SUN_DISK_MAXPARTITIONS; j ++) { +- if ( i == j ) +- continue; +- if (sp[j].size == 0) +- continue; +- +- if (sp[i].start < sp[j].start) { +- if (end > sp[j].start && +- end < sp[j].start + sp[j].size) { +- /* Invalid slice */ +- fprintf(stderr, +- "sun_disklabel: slice %d overlaps with %d\n", i , j); +- sp[i].size = 0; +- } +- } else { +- if (end <= sp[j].start + sp[j].size) { +- sp[i].container = j + 1; +- } +- } +- } +- } + return n; + } + 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/0013-RH-dont-remove-map-on-enomem.patch b/0013-RH-dont-remove-map-on-enomem.patch new file mode 100644 index 0000000..b7ee42c --- /dev/null +++ b/0013-RH-dont-remove-map-on-enomem.patch @@ -0,0 +1,18 @@ +--- + multipathd/main.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: multipath-tools-120518/multipathd/main.c +=================================================================== +--- 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) { +- if (mpp && mpp->alias && !dm_map_present(mpp->alias)) { ++ if (mpp && mpp->alias && !dm_map_present(mpp->alias) && ++ errno != ENOMEM) { + condlog(2, "%s: remove dead map", mpp->alias); + remove_map_and_stop_waiter(mpp, vecs, 1); + 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/0014-RH-RHEL5-style-partitions.patch b/0014-RH-RHEL5-style-partitions.patch deleted file mode 100644 index 47fa725..0000000 --- a/0014-RH-RHEL5-style-partitions.patch +++ /dev/null @@ -1,327 +0,0 @@ ---- - kpartx/bsd.c | 35 --------------- - kpartx/dos.c | 7 +-- - kpartx/kpartx.c | 123 +++++++------------------------------------------------- - kpartx/kpartx.h | 1 - kpartx/sun.c | 35 --------------- - 5 files changed, 24 insertions(+), 177 deletions(-) - -Index: multipath-tools-120123/kpartx/bsd.c -=================================================================== ---- multipath-tools-120123.orig/kpartx/bsd.c -+++ multipath-tools-120123/kpartx/bsd.c -@@ -50,10 +50,10 @@ int - read_bsd_pt(int fd, struct slice all, struct slice *sp, int ns) { - struct bsd_disklabel *l; - struct bsd_partition *p; -- unsigned int offset = all.start, end; -+ unsigned int offset = all.start; - int max_partitions; - char *bp; -- int n = 0, i, j; -+ int n = 0; - - bp = getblock(fd, offset+1); /* 1 sector suffices */ - if (bp == NULL) -@@ -79,36 +79,5 @@ read_bsd_pt(int fd, struct slice all, st - break; - } - } -- /* -- * Convention has it that the bsd disklabel will always have -- * the 'c' partition spanning the entire disk. -- * So we have to check for contained slices. -- */ -- for(i = 0; i < n; i++) { -- if (sp[i].size == 0) -- continue; -- -- end = sp[i].start + sp[i].size; -- for(j = 0; j < n; j ++) { -- if ( i == j ) -- continue; -- if (sp[j].size == 0) -- continue; -- -- if (sp[i].start < sp[j].start) { -- if (end > sp[j].start && -- end < sp[j].start + sp[j].size) { -- /* Invalid slice */ -- fprintf(stderr, -- "bsd_disklabel: slice %d overlaps with %d\n", i , j); -- sp[i].size = 0; -- } -- } else { -- if (end <= sp[j].start + sp[j].size) { -- sp[i].container = j + 1; -- } -- } -- } -- } - return n; - } -Index: multipath-tools-120123/kpartx/dos.c -=================================================================== ---- multipath-tools-120123.orig/kpartx/dos.c -+++ multipath-tools-120123/kpartx/dos.c -@@ -16,7 +16,7 @@ is_extended(int type) { - } - - static int --read_extended_partition(int fd, struct partition *ep, int en, -+read_extended_partition(int fd, struct partition *ep, - struct slice *sp, int ns) - { - struct partition p; -@@ -53,7 +53,6 @@ read_extended_partition(int fd, struct p - if (n < ns) { - sp[n].start = here + le32_to_cpu(p.start_sect); - sp[n].size = le32_to_cpu(p.nr_sects); -- sp[n].container = en + 1; - n++; - } else { - fprintf(stderr, -@@ -98,7 +97,9 @@ read_dos_pt(int fd, struct slice all, st - break; - } - if (is_extended(p.sys_type)) { -- n += read_extended_partition(fd, &p, i, sp+n, ns-n); -+ n += read_extended_partition(fd, &p, sp+n, ns-n); -+ /* hide the extended partition itself */ -+ sp[i].size = 2; - } - } - return n; -Index: multipath-tools-120123/kpartx/kpartx.c -=================================================================== ---- multipath-tools-120123.orig/kpartx/kpartx.c -+++ multipath-tools-120123/kpartx/kpartx.c -@@ -190,7 +190,7 @@ get_hotplug_device(void) - - int - main(int argc, char **argv){ -- int i, j, m, n, op, off, arg, c, d, ro=0; -+ int i, j, m, n, op, off, arg, ro=0; - int fd = -1; - struct slice all; - struct pt *ptp; -@@ -380,49 +380,30 @@ main(int argc, char **argv){ - else - continue; - -+ /* -+ * test for overlap, as in the case of an extended partition -+ * zero their size to avoid mapping -+ */ -+ for (j = 0; j < n; j++) { -+ for (m = j + 1; m < n; m++) { -+ if (slices[m].start > slices[j].start && -+ slices[m].start < slices[j].start + -+ slices[j].size) -+ slices[j].size = 0; -+ } -+ } -+ - switch(what) { - case LIST: -- for (j = 0, c = 0, m = 0; j < n; j++) { -+ for (j = 0; j < n; j++) { - if (slices[j].size == 0) - continue; -- if (slices[j].container > 0) { -- c++; -- continue; -- } -- -- slices[j].minor = m++; - - printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n", - mapname, delim, j+1, - slices[j].size, device, - slices[j].start); - } -- /* Loop to resolve contained slices */ -- d = c; -- while (c) { -- for (j = 0; j < n; j++) { -- uint64_t start; -- int k = slices[j].container - 1; -- -- if (slices[j].size == 0) -- continue; -- if (slices[j].minor > 0) -- continue; -- if (slices[j].container == 0) -- continue; -- slices[j].minor = m++; -- -- start = slices[j].start - slices[k].start; -- printf("%s%s%d : 0 %" PRIu64 " /dev/dm-%d %" PRIu64 "\n", -- mapname, delim, j+1, -- slices[j].size, -- slices[k].minor, start); -- c--; -- } -- /* Terminate loop if nothing more to resolve */ -- if (d == c) -- break; -- } - - break; - -@@ -461,16 +442,10 @@ main(int argc, char **argv){ - case ADD: - case UPDATE: - /* ADD and UPDATE share the same code that adds new partitions. */ -- for (j = 0, c = 0; j < n; j++) { -+ for (j = 0; j < n; j++) { - if (slices[j].size == 0) - continue; - -- /* Skip all contained slices */ -- if (slices[j].container > 0) { -- c++; -- continue; -- } -- - if (safe_sprintf(partname, "%s%s%d", - mapname, delim, j+1)) { - fprintf(stderr, "partname too small\n"); -@@ -511,72 +486,6 @@ main(int argc, char **argv){ - slices[j].minor, slices[j].size, - DM_TARGET, params); - } -- /* Loop to resolve contained slices */ -- d = c; -- while (c) { -- for (j = 0; j < n; j++) { -- uint64_t start; -- int k = slices[j].container - 1; -- -- if (slices[j].size == 0) -- continue; -- -- /* Skip all existing slices */ -- if (slices[j].minor > 0) -- continue; -- -- /* Skip all simple slices */ -- if (slices[j].container == 0) -- continue; -- -- /* Check container slice */ -- if (slices[k].size == 0) -- fprintf(stderr, "Invalid slice %d\n", -- k); -- -- if (safe_sprintf(partname, "%s%s%d", -- mapname, delim, j+1)) { -- fprintf(stderr, "partname too small\n"); -- exit(1); -- } -- strip_slash(partname); -- -- start = slices[j].start - slices[k].start; -- if (safe_sprintf(params, "%d:%d %" PRIu64, -- slices[k].major, -- slices[k].minor, -- start)) { -- fprintf(stderr, "params too small\n"); -- exit(1); -- } -- -- op = (dm_map_present(partname) ? -- DM_DEVICE_RELOAD : DM_DEVICE_CREATE); -- -- dm_addmap(op, partname, DM_TARGET, params, -- slices[j].size, ro, uuid, j+1, -- buf.st_mode & 0777, -- buf.st_uid, buf.st_gid, -- &cookie); -- -- if (op == DM_DEVICE_RELOAD) -- dm_simplecmd(DM_DEVICE_RESUME, -- partname, 1, -- &cookie); -- -- dm_devn(partname, &slices[j].major, -- &slices[j].minor); -- -- if (verbose) -- printf("add map %s : 0 %" PRIu64 " %s %s\n", -- partname, slices[j].size, -- DM_TARGET, params); -- c--; -- } -- /* Terminate loop */ -- if (d == c) -- break; -- } - - if (what == ADD) { - /* Skip code that removes devmappings for deleted partitions */ -Index: multipath-tools-120123/kpartx/kpartx.h -=================================================================== ---- multipath-tools-120123.orig/kpartx/kpartx.h -+++ multipath-tools-120123/kpartx/kpartx.h -@@ -24,7 +24,6 @@ - struct slice { - uint64_t start; - uint64_t size; -- int container; - int major; - int minor; - }; -Index: multipath-tools-120123/kpartx/sun.c -=================================================================== ---- multipath-tools-120123.orig/kpartx/sun.c -+++ multipath-tools-120123/kpartx/sun.c -@@ -62,8 +62,8 @@ int - read_sun_pt(int fd, struct slice all, struct slice *sp, int ns) { - struct sun_disk_label *l; - struct sun_raw_part *s; -- unsigned int offset = all.start, end; -- int i, j, n; -+ unsigned int offset = all.start; -+ int i, n; - char *bp; - - bp = getblock(fd, offset); -@@ -95,37 +95,6 @@ read_sun_pt(int fd, struct slice all, st - break; - } - } -- /* -- * Convention has it that the SUN disklabel will always have -- * the 'c' partition spanning the entire disk. -- * So we have to check for contained slices. -- */ -- for(i = 0; i < SUN_DISK_MAXPARTITIONS; i++) { -- if (sp[i].size == 0) -- continue; -- -- end = sp[i].start + sp[i].size; -- for(j = 0; j < SUN_DISK_MAXPARTITIONS; j ++) { -- if ( i == j ) -- continue; -- if (sp[j].size == 0) -- continue; -- -- if (sp[i].start < sp[j].start) { -- if (end > sp[j].start && -- end < sp[j].start + sp[j].size) { -- /* Invalid slice */ -- fprintf(stderr, -- "sun_disklabel: slice %d overlaps with %d\n", i , j); -- sp[i].size = 0; -- } -- } else { -- if (end <= sp[j].start + sp[j].size) { -- sp[i].container = j + 1; -- } -- } -- } -- } - return n; - } - diff --git a/0014-RH-deprecate-uid-gid-mode.patch b/0014-RH-deprecate-uid-gid-mode.patch new file mode 100644 index 0000000..9270d9d --- /dev/null +++ b/0014-RH-deprecate-uid-gid-mode.patch @@ -0,0 +1,90 @@ +--- + multipath.conf.annotated | 53 ----------------------------------------------- + multipath.conf.synthetic | 3 -- + 2 files changed, 56 deletions(-) + +Index: multipath-tools-120123/multipath.conf.annotated +=================================================================== +--- multipath-tools-120123.orig/multipath.conf.annotated ++++ multipath-tools-120123/multipath.conf.annotated +@@ -186,32 +186,6 @@ + # user_friendly_names no + # + # # +-# # name : mode +-# # scope : multipath & multipathd +-# # desc : The mode to use for the multipath device nodes, in octal. +-# # values : 0000 - 0777 +-# # default : determined by the process +-# mode 0644 +-# +-# # +-# # name : uid +-# # scope : multipath & multipathd +-# # desc : The user id to use for the multipath device nodes. You +-# # may use either the numeric or symbolic uid +-# # values : +-# # default : determined by the process +-# uid 0 +-# +-# # +-# # name : gid +-# # scope : multipath & multipathd +-# # desc : The group id to user for the multipath device nodes. You +-# # may use either the numeric or symbolic gid +-# # values : +-# # default : determined by the process +-# gid disk +-# +-# # + # # name : checker_timeout + # # scope : multipath & multipathd + # # desc : The timeout to use for path checkers that issue scsi +@@ -388,33 +362,6 @@ + # # + # flush_on_last_del yes + # +-# # +-# # name : mode +-# # scope : multipath & multipathd +-# # desc : The mode to use for the multipath device nodes, in +-# # octal. +-# # values : 0000 - 0777 +-# # default : determined by the process +-# mode 0644 +-# +-# # +-# # name : uid +-# # scope : multipath & multipathd +-# # desc : The user id to use for the multipath device nodes. +-# # You may use either the numeric or symbolic uid +-# # values : +-# # default : determined by the process +-# uid 0 +-# +-# # +-# # name : gid +-# # scope : multipath & multipathd +-# # desc : The group id to user for the multipath device nodes. +-# # You may use either the numeric or symbolic gid +-# # values : +-# # default : determined by the process +-# gid 0 +-# + # } + # multipath { + # wwid 1DEC_____321816758474 +Index: multipath-tools-120123/multipath.conf.synthetic +=================================================================== +--- multipath-tools-120123.orig/multipath.conf.synthetic ++++ multipath-tools-120123/multipath.conf.synthetic +@@ -18,9 +18,6 @@ + # no_path_retry fail + # queue_without_daemon no + # user_friendly_names no +-# mode 644 +-# uid 0 +-# gid disk + #} + #blacklist { + # wwid 26353900f02796769 diff --git a/0015-RH-add-followover.patch b/0015-RH-add-followover.patch deleted file mode 100644 index 9f28342..0000000 --- a/0015-RH-add-followover.patch +++ /dev/null @@ -1,156 +0,0 @@ ---- - libmultipath/dict.c | 12 ++++++++++++ - libmultipath/print.c | 2 ++ - libmultipath/structs.h | 3 ++- - multipath/multipath.conf.5 | 5 +++++ - multipathd/main.c | 29 ++++++++++++++++++++++++++++- - 5 files changed, 49 insertions(+), 2 deletions(-) - -Index: multipath-tools-120123/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) - conf->pgfailback = -FAILBACK_MANUAL; - else if (strlen(buff) == 9 && !strcmp(buff, "immediate")) - conf->pgfailback = -FAILBACK_IMMEDIATE; -+ else if (strlen(buff) == 10 && !strcmp(buff, "followover")) -+ conf->pgfailback = -FAILBACK_FOLLOWOVER; - else - conf->pgfailback = atoi(buff); - -@@ -1031,6 +1033,8 @@ hw_failback_handler(vector strvec) - hwe->pgfailback = -FAILBACK_MANUAL; - else if (strlen(buff) == 9 && !strcmp(buff, "immediate")) - hwe->pgfailback = -FAILBACK_IMMEDIATE; -+ else if (strlen(buff) == 10 && !strcmp(buff, "followover")) -+ hwe->pgfailback = -FAILBACK_FOLLOWOVER; - else - hwe->pgfailback = atoi(buff); - -@@ -1303,6 +1307,8 @@ mp_failback_handler(vector strvec) - mpe->pgfailback = -FAILBACK_MANUAL; - else if (strlen(buff) == 9 && !strcmp(buff, "immediate")) - mpe->pgfailback = -FAILBACK_IMMEDIATE; -+ else if (strlen(buff) == 10 && !strcmp(buff, "followover")) -+ mpe->pgfailback = -FAILBACK_FOLLOWOVER; - else - mpe->pgfailback = atoi(buff); - -@@ -1646,6 +1652,8 @@ snprint_mp_failback (char * buff, int le - return snprintf(buff, len, "manual"); - case -FAILBACK_IMMEDIATE: - return snprintf(buff, len, "immediate"); -+ case -FAILBACK_FOLLOWOVER: -+ return snprintf(buff, len, "followover"); - default: - return snprintf(buff, len, "%i", mpe->pgfailback); - } -@@ -1985,6 +1993,8 @@ snprint_hw_failback (char * buff, int le - return snprintf(buff, len, "manual"); - case -FAILBACK_IMMEDIATE: - return snprintf(buff, len, "immediate"); -+ case -FAILBACK_FOLLOWOVER: -+ return snprintf(buff, len, "followover"); - default: - return snprintf(buff, len, "%i", hwe->pgfailback); - } -@@ -2243,6 +2253,8 @@ snprint_def_failback (char * buff, int l - return snprintf(buff, len, "manual"); - case -FAILBACK_IMMEDIATE: - return snprintf(buff, len, "immediate"); -+ case -FAILBACK_FOLLOWOVER: -+ return snprintf(buff, len, "followover"); - default: - return snprintf(buff, len, "%i", conf->pgfailback); - } -Index: multipath-tools-120123/libmultipath/print.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/print.c -+++ multipath-tools-120123/libmultipath/print.c -@@ -143,6 +143,8 @@ snprint_failback (char * buff, size_t le - { - if (mpp->pgfailback == -FAILBACK_IMMEDIATE) - return snprintf(buff, len, "immediate"); -+ if (mpp->pgfailback == -FAILBACK_FOLLOWOVER) -+ return snprintf(buff, len, "followover"); - - if (!mpp->failback_tick) - return snprintf(buff, len, "-"); -Index: multipath-tools-120123/libmultipath/structs.h -=================================================================== ---- multipath-tools-120123.orig/libmultipath/structs.h -+++ multipath-tools-120123/libmultipath/structs.h -@@ -39,7 +39,8 @@ enum rr_weight_mode { - enum failback_mode { - FAILBACK_UNDEF, - FAILBACK_MANUAL, -- FAILBACK_IMMEDIATE -+ FAILBACK_IMMEDIATE, -+ FAILBACK_FOLLOWOVER - }; - - enum sysfs_buses { -Index: multipath-tools-120123/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 - } - } - -+/* This is called after a path has started working again. It the multipath -+ * device for this path uses the followover failback type, and this is the -+ * best pathgroup, and this is the first path in the pathgroup to come back -+ * up, then switch to this pathgroup */ -+static int -+followover_should_failback(struct path * pp) -+{ -+ struct pathgroup * pgp; -+ struct path *pp1; -+ int i; -+ -+ if (pp->mpp->pgfailback != -FAILBACK_FOLLOWOVER || -+ !pp->mpp->pg || !pp->pgindex || -+ pp->pgindex != pp->mpp->bestpg) -+ return 0; -+ -+ pgp = VECTOR_SLOT(pp->mpp->pg, pp->pgindex - 1); -+ vector_foreach_slot(pgp->paths, pp1, i) { -+ if (pp1 == pp) -+ continue; -+ if (pp1->state != PATH_DOWN && pp1->state != PATH_SHAKY) -+ return 0; -+ } -+ return 1; -+} -+ - static void - defered_failback_tick (vector mpvec) - { -@@ -1238,7 +1264,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)) - switch_pathgroup(pp->mpp); - } - } -Index: multipath-tools-120123/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. - .B manual - Do not perform automatic failback. - .TP -+.B followover -+Only perform automatic failback when the first path of a pathgroup -+becomes active. This keeps a node from automatically failing back when -+another node requested the failover. -+.TP - .B values > 0 - deferred failback (time to defer in seconds) - .TP diff --git a/0015-RH-use-sync-support.patch b/0015-RH-use-sync-support.patch new file mode 100644 index 0000000..c5dee9d --- /dev/null +++ b/0015-RH-use-sync-support.patch @@ -0,0 +1,17 @@ +--- + libmultipath/devmapper.c | 2 ++ + 1 file changed, 2 insertions(+) + +Index: multipath-tools-120518/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)) + goto out; ++ if (conf->daemon) ++ dm_task_update_nodes(); + + r = 1; + out: 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/0016-RH-dont-remove-map-on-enomem.patch b/0016-RH-dont-remove-map-on-enomem.patch deleted file mode 100644 index 5b54a4a..0000000 --- a/0016-RH-dont-remove-map-on-enomem.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- - multipathd/main.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -Index: multipath-tools-120123/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 - return; - - vector_foreach_slot (vecs->mpvec, mpp, i) { -- if (mpp && mpp->alias && !dm_map_present(mpp->alias)) { -+ if (mpp && mpp->alias && !dm_map_present(mpp->alias) && -+ errno != ENOMEM) { - condlog(2, "%s: remove dead map", mpp->alias); - remove_map_and_stop_waiter(mpp, vecs, 1); - i--; 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/0019-RH-deprecate-uid-gid-mode.patch b/0019-RH-deprecate-uid-gid-mode.patch deleted file mode 100644 index 9270d9d..0000000 --- a/0019-RH-deprecate-uid-gid-mode.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- - multipath.conf.annotated | 53 ----------------------------------------------- - multipath.conf.synthetic | 3 -- - 2 files changed, 56 deletions(-) - -Index: multipath-tools-120123/multipath.conf.annotated -=================================================================== ---- multipath-tools-120123.orig/multipath.conf.annotated -+++ multipath-tools-120123/multipath.conf.annotated -@@ -186,32 +186,6 @@ - # user_friendly_names no - # - # # --# # name : mode --# # scope : multipath & multipathd --# # desc : The mode to use for the multipath device nodes, in octal. --# # values : 0000 - 0777 --# # default : determined by the process --# mode 0644 --# --# # --# # name : uid --# # scope : multipath & multipathd --# # desc : The user id to use for the multipath device nodes. You --# # may use either the numeric or symbolic uid --# # values : --# # default : determined by the process --# uid 0 --# --# # --# # name : gid --# # scope : multipath & multipathd --# # desc : The group id to user for the multipath device nodes. You --# # may use either the numeric or symbolic gid --# # values : --# # default : determined by the process --# gid disk --# --# # - # # name : checker_timeout - # # scope : multipath & multipathd - # # desc : The timeout to use for path checkers that issue scsi -@@ -388,33 +362,6 @@ - # # - # flush_on_last_del yes - # --# # --# # name : mode --# # scope : multipath & multipathd --# # desc : The mode to use for the multipath device nodes, in --# # octal. --# # values : 0000 - 0777 --# # default : determined by the process --# mode 0644 --# --# # --# # name : uid --# # scope : multipath & multipathd --# # desc : The user id to use for the multipath device nodes. --# # You may use either the numeric or symbolic uid --# # values : --# # default : determined by the process --# uid 0 --# --# # --# # name : gid --# # scope : multipath & multipathd --# # desc : The group id to user for the multipath device nodes. --# # You may use either the numeric or symbolic gid --# # values : --# # default : determined by the process --# gid 0 --# - # } - # multipath { - # wwid 1DEC_____321816758474 -Index: multipath-tools-120123/multipath.conf.synthetic -=================================================================== ---- multipath-tools-120123.orig/multipath.conf.synthetic -+++ multipath-tools-120123/multipath.conf.synthetic -@@ -18,9 +18,6 @@ - # no_path_retry fail - # queue_without_daemon no - # user_friendly_names no --# mode 644 --# uid 0 --# gid disk - #} - #blacklist { - # wwid 26353900f02796769 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/0025-RHBZ-822714-update-nodes.patch b/0025-RHBZ-822714-update-nodes.patch deleted file mode 100644 index 52e652b..0000000 --- a/0025-RHBZ-822714-update-nodes.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- - libmultipath/devmapper.c | 2 ++ - 1 file changed, 2 insertions(+) - -Index: multipath-tools-120123/libmultipath/devmapper.c -=================================================================== ---- multipath-tools-120123.orig/libmultipath/devmapper.c -+++ multipath-tools-120123/libmultipath/devmapper.c -@@ -1272,6 +1272,8 @@ dm_rename (char * old, char * new) - goto out; - if (!dm_task_run(dmt)) - goto out; -+ if (conf->daemon) -+ dm_task_update_nodes(); - - r = 1; - out: 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