diff options
-rw-r--r-- | 0104-RHBZ-631009-deferred-remove.patch | 39 | ||||
-rw-r--r-- | 0112-RHBZ-1194917-add-config_dir-option.patch | 2 | ||||
-rw-r--r-- | 0114-RHBZ-1196394-delayed-reintegration.patch | 6 | ||||
-rw-r--r-- | 0118-UPBZ-1200738-update-eternus-config.patch | 31 | ||||
-rw-r--r-- | 0119-RHBZ-1081397-save-alua-info.patch | 565 | ||||
-rw-r--r-- | 0120-RHBZ-1043093-realloc-fix.patch | 195 | ||||
-rw-r--r-- | 0121-RHBZ-1197234-rules-fix.patch | 28 | ||||
-rw-r--r-- | 0122-RHBZ-1212590-dont-use-var.patch | 33 | ||||
-rw-r--r-- | 0123-UPBZ-1166072-fix-path-offline.patch | 19 | ||||
-rw-r--r-- | 0124-RHBZ-1209275-retrigger-uevents.patch | 214 | ||||
-rw-r--r-- | 0125-RHBZ-1153832-kpartx-delete.patch | 26 | ||||
-rw-r--r-- | 0126-RHBZ-1211383-alias-collision.patch | 113 | ||||
-rw-r--r-- | 0127-RHBZ-1201030-use-blk-availability.patch | 15 | ||||
-rw-r--r-- | 0128-RHBZ-1222123-mpathconf-allow.patch | 244 | ||||
-rw-r--r-- | 0129-RHBZ-1241774-sun-partition-numbering.patch | 17 | ||||
-rw-r--r-- | device-mapper-multipath.spec | 62 |
16 files changed, 1599 insertions, 10 deletions
diff --git a/0104-RHBZ-631009-deferred-remove.patch b/0104-RHBZ-631009-deferred-remove.patch index 1e1367a..342b45d 100644 --- a/0104-RHBZ-631009-deferred-remove.patch +++ b/0104-RHBZ-631009-deferred-remove.patch @@ -11,9 +11,9 @@ libmultipath/propsel.h | 1 libmultipath/structs.h | 8 ++ libmultipath/structs_vec.c | 3 - - multipath/multipath.conf.5 | 14 ++++ + multipath/multipath.conf.5 | 36 ++++++++++++ multipathd/main.c | 23 +++++-- - 14 files changed, 322 insertions(+), 27 deletions(-) + 14 files changed, 344 insertions(+), 27 deletions(-) Index: multipath-tools-130222/libmultipath/config.c =================================================================== @@ -697,7 +697,36 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 =================================================================== --- multipath-tools-130222.orig/multipath/multipath.conf.5 +++ multipath-tools-130222/multipath/multipath.conf.5 -@@ -420,6 +420,16 @@ only one checker will run at a time. Th +@@ -84,6 +84,28 @@ directory where the dynamic shared objec + dependent, commonly + .I /lib/multipath + .TP ++.B find_multipaths ++If set to ++.I yes ++, instead of trying to create a multipath device for every non-blacklisted ++path, multipath will only create a device if one of three condidions are ++met. ++.I 1 ++There are at least two non-blacklisted paths with the same wwid, ++.I 2 ++the user manually forces the creation, by specifying a device with the multipath ++command, or ++.I 3 ++a path has the same WWID as a multipath device that was previously created ++while find_multipaths was set (even if that multipath device doesn't currently ++exist). ++Whenever a multipath device is created with find_multipaths set, multipath will ++remeber the WWID of the device, so that it will automatically create the ++device again, as soon as it sees a path with that WWID. This should allow most ++users to have multipath automatically choose the correct paths to make into ++multipath devices, without having to edit the blacklist; Default is ++.I no ++.TP + .B verbosity + default verbosity. Higher values increase the verbosity level. Valid + levels are between 0 and 6; default is +@@ -420,6 +442,16 @@ only one checker will run at a time. Th multipathd checkers running in parallel causes significant CPU pressure. The Default is .I no @@ -714,7 +743,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 . .SH "blacklist section" The -@@ -521,6 +531,8 @@ section: +@@ -521,6 +553,8 @@ section: .B features .TP .B reservation_key @@ -723,7 +752,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 .RE .PD .LP -@@ -611,6 +623,8 @@ section: +@@ -611,6 +645,8 @@ section: .B retain_attached_hw_handler .TP .B detect_prio diff --git a/0112-RHBZ-1194917-add-config_dir-option.patch b/0112-RHBZ-1194917-add-config_dir-option.patch index e322614..6cc07e7 100644 --- a/0112-RHBZ-1194917-add-config_dir-option.patch +++ b/0112-RHBZ-1194917-add-config_dir-option.patch @@ -600,7 +600,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 =================================================================== --- multipath-tools-130222.orig/multipath/multipath.conf.5 +++ multipath-tools-130222/multipath/multipath.conf.5 -@@ -430,6 +430,13 @@ still in use, it will be freed when the +@@ -452,6 +452,13 @@ still in use, it will be freed when the to the multipath device before the last user closes it, the deferred remove will be canceled. Default is .I no diff --git a/0114-RHBZ-1196394-delayed-reintegration.patch b/0114-RHBZ-1196394-delayed-reintegration.patch index 78e43ee..b0647a5 100644 --- a/0114-RHBZ-1196394-delayed-reintegration.patch +++ b/0114-RHBZ-1196394-delayed-reintegration.patch @@ -658,7 +658,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 =================================================================== --- multipath-tools-130222.orig/multipath/multipath.conf.5 +++ multipath-tools-130222/multipath/multipath.conf.5 -@@ -437,6 +437,25 @@ alphabetically for file ending in ".conf +@@ -459,6 +459,25 @@ alphabetically for file ending in ".conf information from them, just as if it was in /etc/multipath.conf. config_dir must either be "" or a fully qualified directory name. Default is .I "/etc/multipath/conf.d" @@ -684,7 +684,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 . .SH "blacklist section" The -@@ -540,6 +559,10 @@ section: +@@ -562,6 +581,10 @@ section: .B reservation_key .TP .B deferred_remove @@ -695,7 +695,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 .RE .PD .LP -@@ -632,6 +655,10 @@ section: +@@ -654,6 +677,10 @@ section: .B detect_prio .TP .B deferred_remove diff --git a/0118-UPBZ-1200738-update-eternus-config.patch b/0118-UPBZ-1200738-update-eternus-config.patch new file mode 100644 index 0000000..10e96e3 --- /dev/null +++ b/0118-UPBZ-1200738-update-eternus-config.patch @@ -0,0 +1,31 @@ +--- + libmultipath/hwtable.c | 2 +- + multipath.conf.defaults | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +Index: multipath-tools-130222/libmultipath/hwtable.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/hwtable.c ++++ multipath-tools-130222/libmultipath/hwtable.c +@@ -310,7 +310,7 @@ static struct hwentry default_hw[] = { + }, + { + .vendor = "FUJITSU", +- .product = "ETERNUS_DX(L|400|8000)", ++ .product = "ETERNUS_DX(H|L|M|400|8000)", + .features = "1 queue_if_no_path", + .hwhandler = DEFAULT_HWHANDLER, + .pgpolicy = GROUP_BY_PRIO, +Index: multipath-tools-130222/multipath.conf.defaults +=================================================================== +--- multipath-tools-130222.orig/multipath.conf.defaults ++++ multipath-tools-130222/multipath.conf.defaults +@@ -288,7 +288,7 @@ + # } + # device { + # vendor "FUJITSU" +-# product "ETERNUS_DX(L|400|8000)" ++# product "ETERNUS_DX(H|L|M|400|8000)" + # path_grouping_policy "group_by_prio" + # path_checker "tur" + # features "1 queue_if_no_path" diff --git a/0119-RHBZ-1081397-save-alua-info.patch b/0119-RHBZ-1081397-save-alua-info.patch new file mode 100644 index 0000000..c9913f3 --- /dev/null +++ b/0119-RHBZ-1081397-save-alua-info.patch @@ -0,0 +1,565 @@ +--- + libmultipath/prio.c | 34 ++++++++++++++++- + libmultipath/prio.h | 7 +++ + libmultipath/prioritizers/alua.c | 62 +++++++++++++++++++++++-------- + libmultipath/prioritizers/alua_rtpg.c | 22 +++++++++-- + libmultipath/prioritizers/alua_rtpg.h | 4 +- + libmultipath/prioritizers/const.c | 4 ++ + libmultipath/prioritizers/datacore.c | 3 + + libmultipath/prioritizers/def_func.h | 11 +++++ + libmultipath/prioritizers/emc.c | 4 ++ + libmultipath/prioritizers/hds.c | 4 ++ + libmultipath/prioritizers/hp_sw.c | 4 ++ + libmultipath/prioritizers/iet.c | 4 ++ + libmultipath/prioritizers/ontap.c | 4 ++ + libmultipath/prioritizers/random.c | 4 ++ + libmultipath/prioritizers/rdac.c | 4 ++ + libmultipath/prioritizers/weightedpath.c | 3 + + libmultipath/propsel.c | 4 +- + multipathd/main.c | 24 ++++++++---- + 18 files changed, 174 insertions(+), 32 deletions(-) + +Index: multipath-tools-130222/libmultipath/prio.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prio.c ++++ multipath-tools-130222/libmultipath/prio.c +@@ -112,9 +112,24 @@ struct prio * add_prio (char * name) + p->getprio = (int (*)(struct path *, char *)) dlsym(p->handle, "getprio"); + errstr = dlerror(); + if (errstr != NULL) +- condlog(0, "A dynamic linking error occurred: (%s)", errstr); ++ condlog(0, "A dynamic linking error occurred with getprio: (%s)", errstr); + if (!p->getprio) + goto out; ++ ++ p->initprio = (int (*)(struct prio *)) dlsym(p->handle, "initprio"); ++ errstr = dlerror(); ++ if (errstr != NULL) ++ condlog(0, "A dynamic linking error occurred with initprio: (%s)", errstr); ++ if (!p->initprio) ++ goto out; ++ ++ p->freeprio = (int (*)(struct prio *)) dlsym(p->handle, "freeprio"); ++ errstr = dlerror(); ++ if (errstr != NULL) ++ condlog(0, "A dynamic linking error occurred with freeprio: (%s)", errstr); ++ if (!p->freeprio) ++ goto out; ++ + list_add(&p->node, &prioritizers); + return p; + out: +@@ -122,6 +137,13 @@ out: + return NULL; + } + ++int prio_init (struct prio * p) ++{ ++ if (!p || !p->initprio) ++ return 1; ++ return p->initprio(p); ++} ++ + int prio_getprio (struct prio * p, struct path * pp) + { + return p->getprio(pp, p->args); +@@ -156,8 +178,16 @@ void prio_get (struct prio * dst, char * + strncpy(dst->name, src->name, PRIO_NAME_LEN); + if (args) + strncpy(dst->args, args, PRIO_ARGS_LEN); ++ dst->initprio = src->initprio; + dst->getprio = src->getprio; ++ dst->freeprio = src->freeprio; + dst->handle = NULL; ++ dst->context = NULL; ++ ++ if (dst->initprio(dst) != 0){ ++ memset(dst, 0x0, sizeof(struct prio)); ++ return; ++ } + + src->refcount++; + } +@@ -173,6 +203,8 @@ void prio_put (struct prio * dst) + src = NULL; + else + src = prio_lookup(dst->name); ++ if (dst->freeprio) ++ dst->freeprio(dst); + memset(dst, 0x0, sizeof(struct prio)); + free_prio(src); + } +Index: multipath-tools-130222/libmultipath/prio.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prio.h ++++ multipath-tools-130222/libmultipath/prio.h +@@ -46,9 +46,15 @@ struct prio { + void *handle; + int refcount; + struct list_head node; ++ void * context; + char name[PRIO_NAME_LEN]; + char args[PRIO_ARGS_LEN]; ++ int (*initprio)(struct prio * p); ++ /* You are allowed to call initprio multiple times without calling ++ * freeprio. Doing so will reinitialize it (possibly skipping ++ * allocations) */ + int (*getprio)(struct path *, char *); ++ int (*freeprio)(struct prio * p); + }; + + unsigned int get_prio_timeout(unsigned int default_timeout); +@@ -57,6 +63,7 @@ void cleanup_prio (void); + struct prio * add_prio (char *); + struct prio * prio_lookup (char *); + int prio_getprio (struct prio *, struct path *); ++int prio_init (struct prio *); + void prio_get (struct prio *, char *, char *); + void prio_put (struct prio *); + int prio_selected (struct prio *); +Index: multipath-tools-130222/libmultipath/prioritizers/alua.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/alua.c ++++ multipath-tools-130222/libmultipath/prioritizers/alua.c +@@ -37,6 +37,12 @@ static const char * aas_string[] = { + [AAS_TRANSITIONING] = "transitioning between states", + }; + ++struct alua_context { ++ int tpg_support; ++ int tpg; ++ int buflen; ++}; ++ + static const char *aas_print_string(int rc) + { + rc &= 0x7f; +@@ -51,25 +57,26 @@ static const char *aas_print_string(int + } + + int +-get_alua_info(int fd) ++get_alua_info(int fd, struct alua_context *ct) + { + int rc; +- int tpg; + int aas; + +- rc = get_target_port_group_support(fd); +- if (rc < 0) +- return -ALUA_PRIO_TPGS_FAILED; +- +- if (rc == TPGS_NONE) +- return -ALUA_PRIO_NOT_SUPPORTED; +- +- tpg = get_target_port_group(fd); +- if (tpg < 0) +- return -ALUA_PRIO_RTPG_FAILED; ++ if (ct->tpg_support <= 0 || ct->tpg < 0) { ++ ct->tpg_support = get_target_port_group_support(fd); ++ if (ct->tpg_support < 0) ++ return -ALUA_PRIO_TPGS_FAILED; ++ ++ if (ct->tpg_support == TPGS_NONE) ++ return -ALUA_PRIO_NOT_SUPPORTED; ++ ++ ct->tpg = get_target_port_group(fd, &ct->buflen); ++ if (ct->tpg < 0) ++ return -ALUA_PRIO_RTPG_FAILED; ++ } + +- condlog(3, "reported target port group is %i", tpg); +- rc = get_asymmetric_access_state(fd, tpg); ++ condlog(3, "reported target port group is %i", ct->tpg); ++ rc = get_asymmetric_access_state(fd, ct->tpg, &ct->buflen); + if (rc < 0) + return -ALUA_PRIO_GETAAS_FAILED; + aas = (rc & 0x0f); +@@ -88,7 +95,7 @@ int getprio (struct path * pp, char * ar + if (pp->fd < 0) + return -ALUA_PRIO_NO_INFORMATION; + +- rc = get_alua_info(pp->fd); ++ rc = get_alua_info(pp->fd, pp->prio.context); + if (rc >= 0) { + aas = (rc & 0x0f); + priopath = (rc & 0x80); +@@ -128,3 +135,28 @@ int getprio (struct path * pp, char * ar + } + return rc; + } ++ ++int initprio(struct prio *p) ++{ ++ if (!p->context) { ++ struct alua_context *ct; ++ ++ ct = malloc(sizeof(struct alua_context)); ++ if (!ct) ++ return 1; ++ p->context = ct; ++ } ++ memset(p->context, 0, sizeof(struct alua_context)); ++ return 0; ++} ++ ++ ++int freeprio(struct prio *p) ++{ ++ if (p->context) { ++ free(p->context); ++ p->context = NULL; ++ } ++ return 0; ++} ++ +Index: multipath-tools-130222/libmultipath/prioritizers/alua_rtpg.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/alua_rtpg.c ++++ multipath-tools-130222/libmultipath/prioritizers/alua_rtpg.c +@@ -171,7 +171,7 @@ get_target_port_group_support(int fd) + } + + int +-get_target_port_group(int fd) ++get_target_port_group(int fd, int *buflen_ptr) + { + unsigned char *buf; + struct vpd83_data * vpd83; +@@ -179,7 +179,12 @@ get_target_port_group(int fd) + int rc; + int buflen, scsi_buflen; + +- buflen = 128; /* Lets start from 128 */ ++ if (!buflen_ptr || *buflen_ptr == 0) { ++ buflen = 128; /* Lets start from 128 */ ++ if (buflen_ptr) ++ *buflen_ptr = 128; ++ } else ++ buflen = *buflen_ptr; + buf = (unsigned char *)malloc(buflen); + if (!buf) { + PRINT_DEBUG("malloc failed: could not allocate" +@@ -202,6 +207,8 @@ get_target_port_group(int fd) + return -RTPG_RTPG_FAILED; + } + buflen = scsi_buflen; ++ if (buflen_ptr) ++ *buflen_ptr = buflen; + memset(buf, 0, buflen); + rc = do_inquiry(fd, 1, 0x83, buf, buflen); + if (rc < 0) +@@ -269,7 +276,7 @@ do_rtpg(int fd, void* resp, long resplen + } + + int +-get_asymmetric_access_state(int fd, unsigned int tpg) ++get_asymmetric_access_state(int fd, unsigned int tpg, int *buflen_ptr) + { + unsigned char *buf; + struct rtpg_data * tpgd; +@@ -278,7 +285,12 @@ get_asymmetric_access_state(int fd, unsi + int buflen; + uint32_t scsi_buflen; + +- buflen = 128; /* Initial value from old code */ ++ if (!buflen_ptr || *buflen_ptr == 0) { ++ buflen = 128; /* Initial value from old code */ ++ if (buflen_ptr) ++ *buflen_ptr = 128; ++ } else ++ buflen = *buflen_ptr; + buf = (unsigned char *)malloc(buflen); + if (!buf) { + PRINT_DEBUG ("malloc failed: could not allocate" +@@ -299,6 +311,8 @@ get_asymmetric_access_state(int fd, unsi + return -RTPG_RTPG_FAILED; + } + buflen = scsi_buflen; ++ if (buflen_ptr) ++ *buflen_ptr = buflen; + memset(buf, 0, buflen); + rc = do_rtpg(fd, buf, buflen); + if (rc < 0) +Index: multipath-tools-130222/libmultipath/prioritizers/alua_rtpg.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/alua_rtpg.h ++++ multipath-tools-130222/libmultipath/prioritizers/alua_rtpg.h +@@ -23,8 +23,8 @@ + #define RTPG_TPG_NOT_FOUND 4 + + int get_target_port_group_support(int fd); +-int get_target_port_group(int fd); +-int get_asymmetric_access_state(int fd, unsigned int tpg); ++int get_target_port_group(int fd, int *buflen_ptr); ++int get_asymmetric_access_state(int fd, unsigned int tpg, int *buflen_ptr); + + #endif /* __RTPG_H__ */ + +Index: multipath-tools-130222/libmultipath/prioritizers/const.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/const.c ++++ multipath-tools-130222/libmultipath/prioritizers/const.c +@@ -1,8 +1,12 @@ + #include <stdio.h> + + #include <prio.h> ++#include "def_func.h" + + int getprio (struct path * pp, char * args) + { + return 1; + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/datacore.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/datacore.c ++++ multipath-tools-130222/libmultipath/prioritizers/datacore.c +@@ -25,6 +25,7 @@ + #include <debug.h> + #include <prio.h> + #include <structs.h> ++#include "def_func.h" + + #define INQ_REPLY_LEN 255 + #define INQ_CMD_CODE 0x12 +@@ -111,3 +112,5 @@ int getprio (struct path * pp, char * ar + return datacore_prio(pp->dev, pp->fd, args); + } + ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/def_func.h +=================================================================== +--- /dev/null ++++ multipath-tools-130222/libmultipath/prioritizers/def_func.h +@@ -0,0 +1,11 @@ ++#ifndef _DEF_FUNC_H ++#define _DEF_FUNC_H ++ ++#include "prio.h" ++ ++#define declare_nop_prio(name) \ ++int name (struct prio *p) \ ++{ \ ++ return 0; \ ++} ++#endif /* _DEF_FUNC_H */ +Index: multipath-tools-130222/libmultipath/prioritizers/emc.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/emc.c ++++ multipath-tools-130222/libmultipath/prioritizers/emc.c +@@ -6,6 +6,7 @@ + #include <debug.h> + #include <prio.h> + #include <structs.h> ++#include "def_func.h" + + #define INQUIRY_CMD 0x12 + #define INQUIRY_CMDLEN 6 +@@ -85,3 +86,6 @@ int getprio (struct path * pp, char * ar + { + return emc_clariion_prio(pp->dev, pp->fd); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/hds.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/hds.c ++++ multipath-tools-130222/libmultipath/prioritizers/hds.c +@@ -76,6 +76,7 @@ + #include <debug.h> + #include <prio.h> + #include <structs.h> ++#include "def_func.h" + + #define INQ_REPLY_LEN 255 + #define INQ_CMD_CODE 0x12 +@@ -170,3 +171,6 @@ int getprio (struct path * pp, char * ar + { + return hds_modular_prio(pp->dev, pp->fd); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/hp_sw.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/hp_sw.c ++++ multipath-tools-130222/libmultipath/prioritizers/hp_sw.c +@@ -16,6 +16,7 @@ + #include <debug.h> + #include <prio.h> + #include <structs.h> ++#include "def_func.h" + + #define TUR_CMD_LEN 6 + #define SCSI_CHECK_CONDITION 0x2 +@@ -99,3 +100,6 @@ int getprio (struct path * pp, char * ar + { + return hp_sw_prio(pp->dev, pp->fd); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/iet.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/iet.c ++++ multipath-tools-130222/libmultipath/prioritizers/iet.c +@@ -9,6 +9,7 @@ + #include <debug.h> + #include <unistd.h> + #include <structs.h> ++#include "def_func.h" + + // + // This prioritizer suits iSCSI needs, makes it possible to prefer one path. +@@ -141,3 +142,6 @@ int getprio(struct path * pp, char * arg + { + return iet_prio(pp->dev, args); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/ontap.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/ontap.c ++++ multipath-tools-130222/libmultipath/prioritizers/ontap.c +@@ -23,6 +23,7 @@ + #include <debug.h> + #include <prio.h> + #include <structs.h> ++#include "def_func.h" + + #define INQUIRY_CMD 0x12 + #define INQUIRY_CMDLEN 6 +@@ -245,3 +246,6 @@ int getprio (struct path * pp, char * ar + { + return ontap_prio(pp->dev, pp->fd); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/random.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/random.c ++++ multipath-tools-130222/libmultipath/prioritizers/random.c +@@ -4,6 +4,7 @@ + #include <time.h> + + #include <prio.h> ++#include "def_func.h" + + int getprio (struct path * pp, char * args) + { +@@ -13,3 +14,6 @@ int getprio (struct path * pp, char * ar + srand((unsigned int)tv.tv_usec); + return 1+(int) (10.0*rand()/(RAND_MAX+1.0)); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/rdac.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/rdac.c ++++ multipath-tools-130222/libmultipath/prioritizers/rdac.c +@@ -6,6 +6,7 @@ + #include <debug.h> + #include <prio.h> + #include <structs.h> ++#include "def_func.h" + + #define INQUIRY_CMD 0x12 + #define INQUIRY_CMDLEN 6 +@@ -95,3 +96,6 @@ int getprio (struct path * pp, char * ar + { + return rdac_prio(pp->dev, pp->fd); + } ++ ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/prioritizers/weightedpath.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/prioritizers/weightedpath.c ++++ multipath-tools-130222/libmultipath/prioritizers/weightedpath.c +@@ -32,6 +32,7 @@ + #include <memory.h> + #include <debug.h> + #include <regex.h> ++#include "def_func.h" + + char *get_next_string(char **temp, char *split_char) + { +@@ -104,3 +105,5 @@ int getprio(struct path *pp, char *args) + return prio_path_weight(pp, args); + } + ++declare_nop_prio(initprio) ++declare_nop_prio(freeprio) +Index: multipath-tools-130222/libmultipath/propsel.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/propsel.c ++++ multipath-tools-130222/libmultipath/propsel.c +@@ -401,10 +401,10 @@ detect_prio(struct path * pp) + + if (get_target_port_group_support(pp->fd) <= 0) + return; +- ret = get_target_port_group(pp->fd); ++ ret = get_target_port_group(pp->fd, NULL); + if (ret < 0) + return; +- if (get_asymmetric_access_state(pp->fd, ret) < 0) ++ if (get_asymmetric_access_state(pp->fd, ret, NULL) < 0) + return; + prio_get(p, PRIO_ALUA, DEFAULT_PRIO_ARGS); + } +Index: multipath-tools-130222/multipathd/main.c +=================================================================== +--- multipath-tools-130222.orig/multipathd/main.c ++++ multipath-tools-130222/multipathd/main.c +@@ -700,20 +700,23 @@ static int + uev_update_path (struct uevent *uev, struct vectors * vecs) + { + int ro, retval = 0; ++ struct path * pp; ++ ++ pp = find_path_by_dev(vecs->pathvec, uev->kernel); ++ if (!pp) { ++ condlog(0, "%s: spurious uevent, path not found", ++ uev->kernel); ++ return 1; ++ } ++ /* reinit the prio values on change event, in case something is ++ * different */ ++ prio_init(&pp->prio); + + ro = uevent_get_disk_ro(uev); + + if (ro >= 0) { +- struct path * pp; +- + condlog(2, "%s: update path write_protect to '%d' (uevent)", + uev->kernel, ro); +- pp = find_path_by_dev(vecs->pathvec, uev->kernel); +- if (!pp) { +- condlog(0, "%s: spurious uevent, path not found", +- uev->kernel); +- return 1; +- } + if (pp->mpp) { + retval = reload_map(vecs, pp->mpp, 0); + +@@ -1218,6 +1221,11 @@ check_path (struct vectors * vecs, struc + } + + if(newstate == PATH_UP || newstate == PATH_GHOST){ ++ /* ++ * Reinitialize the prioritizer, in case something ++ * changed. ++ */ ++ prio_init(&pp->prio); + if ( pp->mpp && pp->mpp->prflag ){ + /* + * Check Persistent Reservation. diff --git a/0120-RHBZ-1043093-realloc-fix.patch b/0120-RHBZ-1043093-realloc-fix.patch new file mode 100644 index 0000000..96b812a --- /dev/null +++ b/0120-RHBZ-1043093-realloc-fix.patch @@ -0,0 +1,195 @@ +--- + libmultipath/dmparser.c | 6 ++++-- + libmultipath/regex.c | 9 ++++++++- + multipath/main.c | 9 ++++++--- + multipathd/cli_handlers.c | 41 ++++++++++++----------------------------- + multipathd/uxlsnr.c | 13 ++++++++++++- + 5 files changed, 42 insertions(+), 36 deletions(-) + +Index: multipath-tools-130222/libmultipath/dmparser.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/dmparser.c ++++ multipath-tools-130222/libmultipath/dmparser.c +@@ -20,14 +20,16 @@ + static int + merge_words (char ** dst, char * word, int space) + { +- char * p; ++ char * p = *dst; + int len; + + len = strlen(*dst) + strlen(word) + space; + *dst = REALLOC(*dst, len + 1); + +- if (!*dst) ++ if (!*dst) { ++ free(p); + return 1; ++ } + + p = *dst; + +Index: multipath-tools-130222/libmultipath/regex.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/regex.c ++++ multipath-tools-130222/libmultipath/regex.c +@@ -123,7 +123,14 @@ static void init_syntax_once(void) + + /* (Re)Allocate N items of type T using malloc, or fail. */ + #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) +-#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) ++#define RETALLOC(addr, n, t) \ ++do { \ ++ t *tmp = (t *) realloc (addr, (n) * sizeof (t)); \ ++ if (!tmp) \ ++ free(addr); \ ++ (addr) = tmp; \ ++} while(0) ++ + #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) + + #define BYTEWIDTH 8 /* In bits. */ +Index: multipath-tools-130222/multipath/main.c +=================================================================== +--- multipath-tools-130222.orig/multipath/main.c ++++ multipath-tools-130222/multipath/main.c +@@ -394,7 +394,7 @@ out: + static int + dump_config (void) + { +- char * c; ++ char * c, * tmp = NULL; + char * reply; + unsigned int maxlen = 256; + int again = 1; +@@ -402,9 +402,12 @@ dump_config (void) + reply = MALLOC(maxlen); + + while (again) { +- if (!reply) ++ if (!reply) { ++ if (tmp) ++ free(tmp); + return 1; +- c = reply; ++ } ++ c = tmp = reply; + c += snprint_defaults(c, reply + maxlen - c); + again = ((c - reply) == maxlen); + if (again) { +Index: multipath-tools-130222/multipathd/cli_handlers.c +=================================================================== +--- multipath-tools-130222.orig/multipathd/cli_handlers.c ++++ multipath-tools-130222/multipathd/cli_handlers.c +@@ -26,11 +26,14 @@ + #define REALLOC_REPLY(r, a, m) \ + do { \ + if ((a)) { \ ++ char *tmp = (r); \ + (r) = REALLOC((r), (m) * 2); \ + if ((r)) { \ + memset((r) + (m), 0, (m)); \ + (m) *= 2; \ + } \ ++ else \ ++ free(tmp); \ + } \ + } while (0) + +@@ -144,7 +147,7 @@ show_config (char ** r, int * len) + unsigned int maxlen = INITIAL_REPLY_LEN; + int again = 1; + +- reply = MALLOC(maxlen); ++ c = reply = MALLOC(maxlen); + + while (again) { + if (!reply) +@@ -152,44 +155,24 @@ show_config (char ** r, int * len) + c = reply; + c += snprint_defaults(c, reply + maxlen - c); + again = ((c - reply) == maxlen); +- if (again) { +- reply = REALLOC(reply, maxlen * 2); +- if (!reply) +- return 1; +- memset(reply + maxlen, 0, maxlen); +- maxlen *= 2; ++ REALLOC_REPLY(reply, again, maxlen); ++ if (again) + continue; +- } + c += snprint_blacklist(c, reply + maxlen - c); + again = ((c - reply) == maxlen); +- if (again) { +- reply = REALLOC(reply, maxlen * 2); +- if (!reply) +- return 1; +- memset(reply + maxlen, 0, maxlen); +- maxlen *= 2; ++ REALLOC_REPLY(reply, again, maxlen); ++ if (again) + continue; +- } + c += snprint_blacklist_except(c, reply + maxlen - c); + again = ((c - reply) == maxlen); +- if (again) { +- reply = REALLOC(reply, maxlen * 2); +- if (!reply) +- return 1; +- memset(reply + maxlen, 0, maxlen); +- maxlen *= 2; ++ REALLOC_REPLY(reply, again, maxlen); ++ if (again) + continue; +- } + c += snprint_hwtable(c, reply + maxlen - c, conf->hwtable); + again = ((c - reply) == maxlen); +- if (again) { +- reply = REALLOC(reply, maxlen * 2); +- if (!reply) +- return 1; +- memset(reply + maxlen, 0, maxlen); +- maxlen *= 2; ++ REALLOC_REPLY(reply, again, maxlen); ++ if (again) + continue; +- } + c += snprint_mptable(c, reply + maxlen - c, conf->mptable); + again = ((c - reply) == maxlen); + REALLOC_REPLY(reply, again, maxlen); +Index: multipath-tools-130222/multipathd/uxlsnr.c +=================================================================== +--- multipath-tools-130222.orig/multipathd/uxlsnr.c ++++ multipath-tools-130222/multipathd/uxlsnr.c +@@ -64,6 +64,10 @@ static void new_client(int ux_sock) + + /* put it in our linked list */ + c = (struct client *)MALLOC(sizeof(*c)); ++ if (!c) { ++ close(fd); ++ return; ++ } + memset(c, 0, sizeof(*c)); + c->fd = fd; + c->next = clients; +@@ -124,11 +128,18 @@ void * uxsock_listen(int (*uxsock_trigge + sigdelset(&mask, SIGHUP); + sigdelset(&mask, SIGUSR1); + while (1) { ++ struct pollfd *tmp; + struct client *c; + int i, poll_count; + + /* setup for a poll */ +- polls = REALLOC(polls, (1+num_clients) * sizeof(*polls)); ++ tmp = REALLOC(polls, (1+num_clients) * sizeof(*polls)); ++ /* If we can't allocate poliing space for the new client, ++ * close it */ ++ if (!tmp) ++ dead_client(clients); ++ else ++ polls = tmp; + polls[0].fd = ux_sock; + polls[0].events = POLLIN; + diff --git a/0121-RHBZ-1197234-rules-fix.patch b/0121-RHBZ-1197234-rules-fix.patch new file mode 100644 index 0000000..41d672b --- /dev/null +++ b/0121-RHBZ-1197234-rules-fix.patch @@ -0,0 +1,28 @@ +--- + multipath/multipath.rules | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +Index: multipath-tools-130222/multipath/multipath.rules +=================================================================== +--- multipath-tools-130222.orig/multipath/multipath.rules ++++ multipath-tools-130222/multipath/multipath.rules +@@ -21,6 +21,7 @@ ACTION!="change", GOTO="update_timestamp + IMPORT{db}="DM_MULTIPATH_TIMESTAMP" + IMPORT{db}="DM_MULTIPATH_DEVICE_PATH" + IMPORT{db}="DM_MULTIPATH_WIPE_PARTS" ++IMPORT{db}="DM_MULTIPATH_NEED_KPARTX" + # Check if the device is part of a multipath device. the -T option just keeps + # the old result if the timestamp hasn't changed. + PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -T $env{DM_MULTIPATH_TIMESTAMP}:$env{DM_MULTIPATH_DEVICE_PATH} -c $env{DEVNAME}", \ +@@ -43,7 +44,10 @@ KERNEL!="dm-*", GOTO="end_mpath" + ENV{DM_UUID}=="mpath-?*|part[0-9]*-mpath-?*", OPTIONS+="link_priority=10" + ACTION!="change", GOTO="end_mpath" + ENV{DM_UUID}!="mpath-?*", GOTO="end_mpath" ++ENV{DM_ACTIVATION}=="1", ENV{DM_MULTIPATH_NEED_KPARTX}="1" + ENV{DM_SUSPENDED}=="1", GOTO="end_mpath" + ENV{DM_ACTION}=="PATH_FAILED", GOTO="end_mpath" +-ENV{DM_ACTIVATION}=="1", RUN+="$env{MPATH_SBIN_PATH}/kpartx -u $tempnode" ++ENV{DM_ACTIVATION}!="1", ENV{DM_MULTIPATH_NEED_KPARTX}!="1", GOTO="end_mpath" ++RUN+="$env{MPATH_SBIN_PATH}/kpartx -a $tempnode", \ ++ ENV{DM_MULTIPATH_NEED_KPARTX}="" + LABEL="end_mpath" diff --git a/0122-RHBZ-1212590-dont-use-var.patch b/0122-RHBZ-1212590-dont-use-var.patch new file mode 100644 index 0000000..52d743a --- /dev/null +++ b/0122-RHBZ-1212590-dont-use-var.patch @@ -0,0 +1,33 @@ +--- + libmultipath/defaults.h | 4 ++-- + multipathd/multipathd.service | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +Index: multipath-tools-130222/libmultipath/defaults.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/defaults.h ++++ multipath-tools-130222/libmultipath/defaults.h +@@ -26,8 +26,8 @@ + #define MAX_CHECKINT(a) (a << 2) + + #define MAX_DEV_LOSS_TMO 0x7FFFFFFF +-#define DEFAULT_PIDFILE "/var/run/multipathd/multipathd.pid" +-#define DEFAULT_TIMESTAMP_FILE "/var/run/multipathd/timestamp" ++#define DEFAULT_PIDFILE "/run/multipathd/multipathd.pid" ++#define DEFAULT_TIMESTAMP_FILE "/run/multipathd/timestamp" + #define DEFAULT_SOCKET "/org/kernel/linux/storage/multipathd" + #define DEFAULT_CONFIGFILE "/etc/multipath.conf" + #define DEFAULT_BINDINGS_FILE "/etc/multipath/bindings" +Index: multipath-tools-130222/multipathd/multipathd.service +=================================================================== +--- multipath-tools-130222.orig/multipathd/multipathd.service ++++ multipath-tools-130222/multipathd/multipathd.service +@@ -9,7 +9,7 @@ Conflicts=shutdown.target + + [Service] + Type=forking +-PIDFile=/var/run/multipathd/multipathd.pid ++PIDFile=/run/multipathd/multipathd.pid + ExecStartPre=/sbin/modprobe dm-multipath + ExecStartPre=-/sbin/multipath -A + ExecStart=/sbin/multipathd diff --git a/0123-UPBZ-1166072-fix-path-offline.patch b/0123-UPBZ-1166072-fix-path-offline.patch new file mode 100644 index 0000000..0f1a912 --- /dev/null +++ b/0123-UPBZ-1166072-fix-path-offline.patch @@ -0,0 +1,19 @@ +--- + libmultipath/discovery.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +Index: multipath-tools-130222/libmultipath/discovery.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/discovery.c ++++ multipath-tools-130222/libmultipath/discovery.c +@@ -946,9 +946,7 @@ path_offline (struct path * pp) + + condlog(3, "%s: path state = %s", pp->dev, buff); + +- if (!strncmp(buff, "offline", 7) || +- !strncmp(buff, "quiesce", 7) || +- !strncmp(buff, "transport-offline", 17)) { ++ if (!strncmp(buff, "offline", 7)) { + pp->offline = 1; + return PATH_DOWN; + } diff --git a/0124-RHBZ-1209275-retrigger-uevents.patch b/0124-RHBZ-1209275-retrigger-uevents.patch new file mode 100644 index 0000000..e0b1886 --- /dev/null +++ b/0124-RHBZ-1209275-retrigger-uevents.patch @@ -0,0 +1,214 @@ +--- + libmultipath/config.c | 2 ++ + libmultipath/config.h | 2 ++ + libmultipath/defaults.h | 2 ++ + libmultipath/dict.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + libmultipath/discovery.c | 8 +++++--- + libmultipath/structs.h | 8 ++++++++ + multipathd/main.c | 15 ++++++++++++++- + 7 files changed, 79 insertions(+), 4 deletions(-) + +Index: multipath-tools-130222/libmultipath/config.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/config.c ++++ multipath-tools-130222/libmultipath/config.c +@@ -673,6 +673,8 @@ load_config (char * file, struct udev *u + conf->force_sync = 0; + conf->ignore_new_boot_devs = 0; + conf->processed_main_config = 0; ++ conf->retrigger_tries = DEFAULT_RETRIGGER_TRIES; ++ conf->retrigger_delay = DEFAULT_RETRIGGER_DELAY; + + /* + * preload default hwtable +Index: multipath-tools-130222/libmultipath/config.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/config.h ++++ multipath-tools-130222/libmultipath/config.h +@@ -139,6 +139,8 @@ struct config { + int processed_main_config; + int delay_watch_checks; + int delay_wait_checks; ++ int retrigger_tries; ++ int retrigger_delay; + unsigned int version[3]; + + char * dev; +Index: multipath-tools-130222/libmultipath/defaults.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/defaults.h ++++ multipath-tools-130222/libmultipath/defaults.h +@@ -21,6 +21,8 @@ + #define DEFAULT_DETECT_PRIO DETECT_PRIO_OFF + #define DEFAULT_DEFERRED_REMOVE DEFERRED_REMOVE_OFF + #define DEFAULT_DELAY_CHECKS DELAY_CHECKS_OFF ++#define DEFAULT_RETRIGGER_DELAY 10 ++#define DEFAULT_RETRIGGER_TRIES 3 + + #define DEFAULT_CHECKINT 5 + #define MAX_CHECKINT(a) (a << 2) +Index: multipath-tools-130222/libmultipath/dict.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/dict.c ++++ multipath-tools-130222/libmultipath/dict.c +@@ -839,6 +839,38 @@ def_delay_wait_checks_handler(vector str + return 0; + } + ++static int ++def_retrigger_tries_handler(vector strvec) ++{ ++ char * buff; ++ ++ buff = set_value(strvec); ++ ++ if (!buff) ++ return 1; ++ ++ conf->retrigger_tries = atoi(buff); ++ FREE(buff); ++ ++ return 0; ++} ++ ++static int ++def_retrigger_delay_handler(vector strvec) ++{ ++ char * buff; ++ ++ buff = set_value(strvec); ++ ++ if (!buff) ++ return 1; ++ ++ conf->retrigger_delay = atoi(buff); ++ FREE(buff); ++ ++ return 0; ++} ++ + /* + * blacklist block handlers + */ +@@ -3194,6 +3226,18 @@ snprint_def_delay_wait_checks(char * buf + } + + static int ++snprint_def_retrigger_tries (char * buff, int len, void * data) ++{ ++ return snprintf(buff, len, "%i", conf->retrigger_tries); ++} ++ ++static int ++snprint_def_retrigger_delay (char * buff, int len, void * data) ++{ ++ return snprintf(buff, len, "%i", conf->retrigger_delay); ++} ++ ++static int + snprint_ble_simple (char * buff, int len, void * data) + { + struct blentry * ble = (struct blentry *)data; +@@ -3267,6 +3311,8 @@ init_keywords(void) + install_keyword("config_dir", &def_config_dir_handler, &snprint_def_config_dir); + install_keyword("delay_watch_checks", &def_delay_watch_checks_handler, &snprint_def_delay_watch_checks); + install_keyword("delay_wait_checks", &def_delay_wait_checks_handler, &snprint_def_delay_wait_checks); ++ install_keyword("retrigger_tries", &def_retrigger_tries_handler, &snprint_def_retrigger_tries); ++ install_keyword("retrigger_delay", &def_retrigger_delay_handler, &snprint_def_retrigger_delay); + __deprecated install_keyword("default_selector", &def_selector_handler, NULL); + __deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL); + __deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL); +Index: multipath-tools-130222/libmultipath/discovery.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/discovery.c ++++ multipath-tools-130222/libmultipath/discovery.c +@@ -1111,9 +1111,13 @@ get_uid (struct path * pp) + len = strlen(value); + } + strncpy(pp->wwid, value, len); ++ pp->missing_udev_info = INFO_OK; ++ pp->tick = 0; + } else { + condlog(3, "%s: no %s attribute", pp->dev, + pp->uid_attribute); ++ pp->missing_udev_info = INFO_MISSING; ++ pp->tick = conf->retrigger_delay; + } + + /* Strip any trailing blanks */ +@@ -1201,10 +1205,8 @@ pathinfo (struct path *pp, vector hwtabl + * Retrieve path priority, even for PATH_DOWN paths if it has never + * been successfully obtained before. + */ +- if ((mask & DI_PRIO) && path_state == PATH_UP) { ++ if ((mask & DI_PRIO) && path_state == PATH_UP && strlen(pp->wwid)) { + if (pp->state != PATH_DOWN || pp->priority == PRIO_UNDEF) { +- if (!strlen(pp->wwid)) +- get_uid(pp); + get_prio(pp); + } + } +Index: multipath-tools-130222/libmultipath/structs.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/structs.h ++++ multipath-tools-130222/libmultipath/structs.h +@@ -139,6 +139,12 @@ enum delay_checks_states { + DELAY_CHECKS_UNDEF = 0, + }; + ++enum missing_udev_info_states { ++ INFO_OK, ++ INFO_MISSING, ++ INFO_REQUESTED, ++}; ++ + struct sg_id { + int host_no; + int channel; +@@ -193,6 +199,8 @@ struct path { + struct checker checker; + struct multipath * mpp; + int fd; ++ int missing_udev_info; ++ int retriggers; + + /* configlet pointers */ + struct hwentry * hwe; +Index: multipath-tools-130222/multipathd/main.c +=================================================================== +--- multipath-tools-130222.orig/multipathd/main.c ++++ multipath-tools-130222/multipathd/main.c +@@ -708,6 +708,10 @@ uev_update_path (struct uevent *uev, str + uev->kernel); + return 1; + } ++ ++ if (pp->missing_udev_info == INFO_REQUESTED) ++ return uev_add_path(uev, vecs); ++ + /* reinit the prio values on change event, in case something is + * different */ + prio_init(&pp->prio); +@@ -1133,12 +1137,21 @@ check_path (struct vectors * vecs, struc + int chkr_new_path_up = 0; + int oldchkrstate = pp->chkrstate; + +- if (!pp->mpp) ++ if (!pp->mpp && (pp->missing_udev_info != INFO_MISSING || ++ pp->retriggers >= conf->retrigger_tries)) + return; + + if (pp->tick && --pp->tick) + return; /* don't check this path yet */ + ++ if (!pp->mpp) { ++ pp->missing_udev_info = INFO_REQUESTED; ++ pp->retriggers++; ++ sysfs_attr_set_value(pp->udev, "uevent", "change", ++ strlen("change")); ++ return; ++ } ++ + /* + * provision a next check soonest, + * in case we exit abnormaly from here diff --git a/0125-RHBZ-1153832-kpartx-delete.patch b/0125-RHBZ-1153832-kpartx-delete.patch new file mode 100644 index 0000000..329bc44 --- /dev/null +++ b/0125-RHBZ-1153832-kpartx-delete.patch @@ -0,0 +1,26 @@ +--- + kpartx/kpartx.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +Index: multipath-tools-130222/kpartx/kpartx.c +=================================================================== +--- multipath-tools-130222.orig/kpartx/kpartx.c ++++ multipath-tools-130222/kpartx/kpartx.c +@@ -409,7 +409,7 @@ main(int argc, char **argv){ + break; + + case DELETE: +- for (j = n-1; j >= 0; j--) { ++ for (j = MAXSLICES-1; j >= 0; j--) { + if (safe_sprintf(partname, "%s%s%d", + mapname, delim, j+1)) { + fprintf(stderr, "partname too small\n"); +@@ -417,7 +417,7 @@ main(int argc, char **argv){ + } + strip_slash(partname); + +- if (!slices[j].size || !dm_map_present(partname)) ++ if (!dm_map_present(partname)) + continue; + + if (!dm_simplecmd(DM_DEVICE_REMOVE, partname, diff --git a/0126-RHBZ-1211383-alias-collision.patch b/0126-RHBZ-1211383-alias-collision.patch new file mode 100644 index 0000000..965bf53 --- /dev/null +++ b/0126-RHBZ-1211383-alias-collision.patch @@ -0,0 +1,113 @@ +--- + libmultipath/config.c | 4 ++++ + libmultipath/config.h | 1 + + libmultipath/configure.c | 3 +++ + libmultipath/dict.c | 33 +++++++++++++++++++++++++++++++++ + 4 files changed, 41 insertions(+) + +Index: multipath-tools-130222/libmultipath/configure.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/configure.c ++++ multipath-tools-130222/libmultipath/configure.c +@@ -422,6 +422,9 @@ select_action (struct multipath * mpp, v + condlog(2, "%s: unable to rename %s to %s (%s is used by %s)", + mpp->wwid, cmpp->alias, mpp->alias, + mpp->alias, cmpp_by_name->wwid); ++ /* reset alias to existing alias */ ++ FREE(mpp->alias); ++ mpp->alias = STRDUP(cmpp->alias); + mpp->action = ACT_NOTHING; + return; + } +Index: multipath-tools-130222/libmultipath/config.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/config.c ++++ multipath-tools-130222/libmultipath/config.c +@@ -675,6 +675,7 @@ load_config (char * file, struct udev *u + conf->processed_main_config = 0; + conf->retrigger_tries = DEFAULT_RETRIGGER_TRIES; + conf->retrigger_delay = DEFAULT_RETRIGGER_DELAY; ++ conf->new_bindings_in_boot = 0; + + /* + * preload default hwtable +@@ -794,6 +795,9 @@ load_config (char * file, struct udev *u + if (conf->ignore_new_boot_devs) + in_initrd(); + ++ if (conf->new_bindings_in_boot == 0 && in_initrd()) ++ conf->bindings_read_only = 1; ++ + return 0; + out: + free_config(conf); +Index: multipath-tools-130222/libmultipath/config.h +=================================================================== +--- multipath-tools-130222.orig/libmultipath/config.h ++++ multipath-tools-130222/libmultipath/config.h +@@ -141,6 +141,7 @@ struct config { + int delay_wait_checks; + int retrigger_tries; + int retrigger_delay; ++ int new_bindings_in_boot; + unsigned int version[3]; + + char * dev; +Index: multipath-tools-130222/libmultipath/dict.c +=================================================================== +--- multipath-tools-130222.orig/libmultipath/dict.c ++++ multipath-tools-130222/libmultipath/dict.c +@@ -871,6 +871,29 @@ def_retrigger_delay_handler(vector strve + return 0; + } + ++static int ++def_new_bindings_in_boot_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->new_bindings_in_boot = 0; ++ else if ((strlen(buff) == 3 && !strcmp(buff, "yes")) || ++ (strlen(buff) == 1 && !strcmp(buff, "1"))) ++ conf->new_bindings_in_boot = 1; ++ else ++ conf->new_bindings_in_boot = 0; ++ ++ FREE(buff); ++ return 0; ++} ++ + /* + * blacklist block handlers + */ +@@ -3238,6 +3261,15 @@ snprint_def_retrigger_delay (char * buff + } + + static int ++snprint_def_new_bindings_in_boot(char * buff, int len, void * data) ++{ ++ if (conf->new_bindings_in_boot == 1) ++ return snprintf(buff, len, "yes"); ++ else ++ return snprintf(buff, len, "no"); ++} ++ ++static int + snprint_ble_simple (char * buff, int len, void * data) + { + struct blentry * ble = (struct blentry *)data; +@@ -3313,6 +3345,7 @@ init_keywords(void) + install_keyword("delay_wait_checks", &def_delay_wait_checks_handler, &snprint_def_delay_wait_checks); + install_keyword("retrigger_tries", &def_retrigger_tries_handler, &snprint_def_retrigger_tries); + install_keyword("retrigger_delay", &def_retrigger_delay_handler, &snprint_def_retrigger_delay); ++ install_keyword("new_bindings_in_boot", &def_new_bindings_in_boot_handler, &snprint_def_new_bindings_in_boot); + __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); diff --git a/0127-RHBZ-1201030-use-blk-availability.patch b/0127-RHBZ-1201030-use-blk-availability.patch new file mode 100644 index 0000000..b2cd7cf --- /dev/null +++ b/0127-RHBZ-1201030-use-blk-availability.patch @@ -0,0 +1,15 @@ +--- + multipathd/multipathd.service | 1 + + 1 file changed, 1 insertion(+) + +Index: multipath-tools-130222/multipathd/multipathd.service +=================================================================== +--- multipath-tools-130222.orig/multipathd/multipathd.service ++++ multipath-tools-130222/multipathd/multipathd.service +@@ -1,5 +1,6 @@ + [Unit] + Description=Device-Mapper Multipath Device Controller ++Requires=blk-availability.service + Before=iscsi.service iscsid.service lvm2-activation-early.service + After=syslog.target + ConditionPathExists=/etc/multipath.conf diff --git a/0128-RHBZ-1222123-mpathconf-allow.patch b/0128-RHBZ-1222123-mpathconf-allow.patch new file mode 100644 index 0000000..ad98737 --- /dev/null +++ b/0128-RHBZ-1222123-mpathconf-allow.patch @@ -0,0 +1,244 @@ +--- + multipath/mpathconf | 135 +++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 124 insertions(+), 11 deletions(-) + +Index: multipath-tools-130222/multipath/mpathconf +=================================================================== +--- multipath-tools-130222.orig/multipath/mpathconf ++++ multipath-tools-130222/multipath/mpathconf +@@ -1,4 +1,4 @@ +-#!/bin/sh ++#!/bin/bash + # + # Copyright (C) 2010 Red Hat, Inc. All rights reserved. + # +@@ -17,7 +17,7 @@ + # 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 ++unset ENABLE FIND FRIENDLY MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST + + DEFAULT_CONFIG="# device-mapper-multipath configuration file + +@@ -38,8 +38,10 @@ defaults { + }" + + CONFIGFILE="/etc/multipath.conf" ++OUTPUTFILE="/etc/multipath.conf" + MULTIPATHDIR="/etc/multipath" + TMPFILE="/etc/multipath/.multipath.conf.tmp" ++WWIDS=0 + + function usage + { +@@ -48,13 +50,60 @@ function usage + echo "Commands:" + echo "Enable: --enable " + echo "Disable: --disable" ++ echo "Only allow certain wwids (instead of enable): --allow <WWID>" + echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>" + echo "Set find_multipaths (Default y): --find_multipaths <y|n>" + echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>" + echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>" ++ echo "select output file (Default /etc/multipath.conf): --outfile <FILE>" + echo "" + } + ++function get_dm_deps ++{ ++ shift 3 ++ while [ -n "$1" -a -n "$2" ]; do ++ MAJOR=$(echo $1 | tr -d '(,') ++ MINOR=$(echo $2 | tr -d ')') ++ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null` ++ if [ -n "$UUID" ] ; then ++ set_dm_wwid $UUID ++ fi ++ shift 2 ++ done ++} ++ ++function set_dm_wwid ++{ ++ if [[ "$1" =~ ^part[[:digit:]]+-mpath- ]] ; then ++ WWID_LIST[$WWIDS]="${1##part*-mpath-}" ++ ((WWIDS++)) ++ elif [[ "$1" =~ ^mpath- ]] ; then ++ WWID_LIST[$WWIDS]="${1##mpath-}" ++ ((WWIDS++)) ++ else ++ get_dm_deps `dmsetup deps -u $1` ++ fi ++} ++ ++function set_wwid ++{ ++ UUID="" ++ if [[ "$1" =~ ^[[:digit:]]+:[[:digit:]]+$ ]] ; then ++ MAJOR=${1%%:*} ++ MINOR=${1##*:} ++ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null` ++ else ++ UUID=`dmsetup info -c --noheadings -o uuid $1 2> /dev/null` ++ fi ++ if [ -n "$UUID" ] ; then ++ set_dm_wwid $UUID ++ else ++ WWID_LIST[$WWIDS]="$1" ++ ((WWIDS++)) ++ fi ++} ++ + function parse_args + { + while [ -n "$1" ]; do +@@ -67,6 +116,16 @@ function parse_args + ENABLE=0 + shift + ;; ++ --allow) ++ ENABLE=2 ++ if [ -n "$2" ]; then ++ set_wwid $2 ++ shift 2 ++ else ++ usage ++ exit 1 ++ fi ++ ;; + --user_friendly_names) + if [ -n "$2" ]; then + FRIENDLY=$2 +@@ -103,6 +162,16 @@ function parse_args + exit 1 + fi + ;; ++ --outfile) ++ if [ -n "$2" ]; then ++ OUTPUTFILE=$2 ++ HAVE_OUTFILE=1 ++ shift 2 ++ else ++ usage ++ exit 1 ++ fi ++ ;; + *) + usage + exit +@@ -137,6 +206,22 @@ function validate_args + echo "--with_multipathd must be either 'y' or 'n'" + exit 1 + fi ++ if [ "$ENABLE" = 2 -a -z "$HAVE_OUTFILE" ]; then ++ echo "Because --allow makes changes that cannot be automatically reversed," ++ echo "you must set --outfile when you set --allow" ++ exit 1 ++ fi ++} ++ ++function add_blacklist_exceptions ++{ ++ echo "blacklist_exceptions {" >> $TMPFILE ++ INDEX=0 ++ while [ "$INDEX" -lt "$WWIDS" ] ; do ++ echo " wwid \"${WWID_LIST[$INDEX]}\"" >> $TMPFILE ++ ((INDEX++)) ++ done ++ echo "}" >> $TMPFILE + } + + umask 0077 +@@ -160,6 +245,10 @@ if grep -q "^blacklist[[:space:]]*{" $TM + HAVE_BLACKLIST=1 + fi + ++if grep -q "^blacklist_exceptions[[:space:]]*{" $TMPFILE ; then ++ HAVE_EXCEPTIONS=1 ++fi ++ + if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then + HAVE_DEFAULTS=1 + fi +@@ -183,11 +272,19 @@ 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 ++ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"" ; then + HAVE_DISABLE=0 + fi + fi + ++if [ "$HAVE_BLACKLIST" = "1" ]; then ++ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid \"\.\?\*\"" ; then ++ HAVE_WWID_DISABLE=1 ++ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"" ; then ++ HAVE_WWID_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 +@@ -255,17 +352,33 @@ defaults { + _EOF_ + fi + +-if [ "$ENABLE" = 1 ]; then ++if [ "$ENABLE" = 2 ]; then ++ if [ "$HAVE_DISABLE" = 1 ]; then ++ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE ++ fi ++ if [ -z "$HAVE_WWID_DISABLE" ]; then ++ sed -i '/^blacklist[[:space:]]*{/ a\ ++ wwid ".*" ++' $TMPFILE ++ elif [ "$HAVE_WWID_DISABLE" = 0 ]; then ++ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"/ wwid ".*"/' $TMPFILE ++ fi ++ if [ "$HAVE_EXCEPTIONS" = 1 ]; then ++ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/d' $TMPFILE ++ fi ++ echo $HAVE_WWID_DISABLE ++ add_blacklist_exceptions ++elif [ "$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 "*" ++ devnode ".*" + ' $TMPFILE + elif [ "$HAVE_DISABLE" = 0 ]; then +- sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[#[:space:]]*devnode \"\.\?\*\"/ devnode ".*"/' $TMPFILE ++ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"/ devnode ".*"/' $TMPFILE + fi + fi + +@@ -303,17 +416,17 @@ elif [ "$FRIENDLY" = "y" ]; then + fi + fi + +-if [ -f "$CONFIGFILE" ]; then +- cp $CONFIGFILE $CONFIGFILE.old ++if [ -f "$OUTPUTFILE" ]; then ++ cp $OUTPUTFILE $OUTPUTFILE.old + if [ $? != 0 ]; then +- echo "failed to backup old config file, $CONFIGFILE not updated" ++ echo "failed to backup old config file, $OUTPUTFILE not updated" + exit 1 + fi + fi + +-cp $TMPFILE $CONFIGFILE ++cp $TMPFILE $OUTPUTFILE + if [ $? != 0 ]; then +- echo "failed to copy new config file into place, check $CONFIGFILE is still OK" ++ echo "failed to copy new config file into place, check $OUTPUTFILE is still OK" + exit 1 + fi + diff --git a/0129-RHBZ-1241774-sun-partition-numbering.patch b/0129-RHBZ-1241774-sun-partition-numbering.patch new file mode 100644 index 0000000..1cf555f --- /dev/null +++ b/0129-RHBZ-1241774-sun-partition-numbering.patch @@ -0,0 +1,17 @@ +--- + kpartx/sun.c | 2 -- + 1 file changed, 2 deletions(-) + +Index: multipath-tools-130222/kpartx/sun.c +=================================================================== +--- multipath-tools-130222.orig/kpartx/sun.c ++++ multipath-tools-130222/kpartx/sun.c +@@ -82,8 +82,6 @@ read_sun_pt(int fd, struct slice all, st + for(i=0, n=0; i<SUN_DISK_MAXPARTITIONS; i++) { + s = &l->partitions[i]; + +- if (s->num_sectors == 0) +- continue; + if (n < ns) { + sp[n].start = offset + + be32_to_cpu(s->start_cylinder) * be16_to_cpu(l->nsect) * be16_to_cpu(l->ntrks); diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index 9a11cbc..f317b88 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,7 +1,7 @@ Summary: Tools to manage multipath devices using device-mapper Name: device-mapper-multipath Version: 0.4.9 -Release: 76%{?dist} +Release: 77%{?dist} License: GPL+ Group: System Environment/Base URL: http://christophe.varoqui.free.fr/ @@ -125,6 +125,18 @@ Patch0114: 0114-RHBZ-1196394-delayed-reintegration.patch Patch0115: 0115-RHBZ-1198418-fix-double-free.patch Patch0116: 0116-UPBZ-1188179-dell-36xxi.patch Patch0117: 0117-RHBZ-1198424-autodetect-clariion-alua.patch +Patch0118: 0118-UPBZ-1200738-update-eternus-config.patch +Patch0119: 0119-RHBZ-1081397-save-alua-info.patch +Patch0120: 0120-RHBZ-1043093-realloc-fix.patch +Patch0121: 0121-RHBZ-1197234-rules-fix.patch +Patch0122: 0122-RHBZ-1212590-dont-use-var.patch +Patch0123: 0123-UPBZ-1166072-fix-path-offline.patch +Patch0124: 0124-RHBZ-1209275-retrigger-uevents.patch +Patch0125: 0125-RHBZ-1153832-kpartx-delete.patch +Patch0126: 0126-RHBZ-1211383-alias-collision.patch +Patch0127: 0127-RHBZ-1201030-use-blk-availability.patch +Patch0128: 0128-RHBZ-1222123-mpathconf-allow.patch +Patch0129: 0129-RHBZ-1241774-sun-partition-numbering.patch # runtime Requires: %{name}-libs = %{version}-%{release} @@ -295,6 +307,18 @@ kpartx manages partition creation and removal for device-mapper devices. %patch0115 -p1 %patch0116 -p1 %patch0117 -p1 +%patch0118 -p1 +%patch0119 -p1 +%patch0120 -p1 +%patch0121 -p1 +%patch0122 -p1 +%patch0123 -p1 +%patch0124 -p1 +%patch0125 -p1 +%patch0126 -p1 +%patch0127 -p1 +%patch0128 -p1 +%patch0129 -p1 cp %{SOURCE1} . %build @@ -402,6 +426,42 @@ bin/systemctl --no-reload enable multipathd.service >/dev/null 2>&1 ||: %{_mandir}/man8/kpartx.8.gz %changelog +* Fri Aug 7 2015 Benjamin Marzinski <bmarzins@redhat.com> 0.4.9-77 +- Modify 0104-RHBZ-631009-deferred-remove.patch + * add man page info +- Refresh 0112-RHBZ-1194917-add-config_dir-option.patch +- Refresh 0114-RHBZ-1196394-delayed-reintegration.patch +- Add 0118-UPBZ-1200738-update-eternus-config.patch + * update default config +- Add 0119-RHBZ-1081397-save-alua-info.patch + * make prioritizers save information between calls to speed them up. +- Add 0120-RHBZ-1043093-realloc-fix.patch + * free old memory if realloc fails. +- Add 0121-RHBZ-1197234-rules-fix.patch + * make sure kpartx runs after an DM_ACTIVATION event occurs. +- Add 0122-RHBZ-1212590-dont-use-var.patch + * use /run instead of /var/run +- Add 0123-UPBZ-1166072-fix-path-offline.patch + * Don't mark quiesce and transport-offline paths as offline +- Add 0124-RHBZ-1209275-retrigger-uevents.patch + * Make multipathd retrigger uevents when paths haven't successfully had + their udev_attribute environment variable set by udev and add + "retrigger_ties" and "retrigger_delay" to control this +- Add 0125-RHBZ-1153832-kpartx-delete.patch + * Delete all partition devices with -d (not just the ones in the partition + table) +- Add 0126-RHBZ-1211383-alias-collision.patch + * make multipathd use the old alias, if rename failed and add + "new_bindings_in_boot" to determine if new bindings can be added to + the bindings file in the initramfs +- Add 0127-RHBZ-1201030-use-blk-availability.patch + * Make multipath use blk-availability.service +- Add 0128-RHBZ-1222123-mpathconf-allow.patch + * Add mpathconf --allow for creating specialized config files. +- Add 0129-RHBZ-1241774-sun-partition-numbering.patch + * Make kpartx correctly number sun partitions. + + * Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.4.9-76 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild |