From 326330b92e354a34325295ca0941f5fb2eeafa19 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Aug 16 2018 12:47:38 +0000 Subject: import device-mapper-multipath-0.4.9-119.el7_5.1 --- diff --git a/SOURCES/0237-RHBZ-1607749-add-transport-blacklist.patch b/SOURCES/0237-RHBZ-1607749-add-transport-blacklist.patch new file mode 100644 index 0000000..f673bfa --- /dev/null +++ b/SOURCES/0237-RHBZ-1607749-add-transport-blacklist.patch @@ -0,0 +1,519 @@ +--- + libmultipath/blacklist.c | 50 ++++++++++++++++++++++++++---- + libmultipath/blacklist.h | 3 + + libmultipath/config.c | 16 +++++++++ + libmultipath/config.h | 2 + + libmultipath/dict.c | 38 +++++++++++++++++++++-- + libmultipath/discovery.c | 5 +-- + libmultipath/print.c | 74 +++++++++++++++++++++++++++++++++++++++++++++ + libmultipath/print.h | 2 + + libmultipath/structs.h | 1 + multipath/multipath.conf.5 | 15 +++++++++ + 10 files changed, 194 insertions(+), 12 deletions(-) + +Index: multipath-bz1600672/libmultipath/blacklist.c +=================================================================== +--- multipath-bz1600672.orig/libmultipath/blacklist.c ++++ multipath-bz1600672/libmultipath/blacklist.c +@@ -12,6 +12,8 @@ + #include "structs.h" + #include "config.h" + #include "blacklist.h" ++#include "structs_vec.h" ++#include "print.h" + + extern int + store_ble (vector blist, char * str, int origin) +@@ -211,12 +213,14 @@ setup_default_blist (struct config * con + condlog(3, "%s: (%s) %s", dev, wwid, (M)); \ + else if (env) \ + condlog(3, "%s: (%s) %s", dev, env, (M)); \ ++ else if (protocol) \ ++ condlog(3, "%s: (%s) %s", dev, protocol, (M)); \ + else \ + condlog(3, "%s: %s", dev, (M)) + + void + log_filter (const char *dev, char *vendor, char *product, char *wwid, +- const char *env, int r) ++ const char *env, char *protocol, int r) + { + /* + * Try to sort from most likely to least. +@@ -236,6 +240,9 @@ log_filter (const char *dev, char *vendo + case MATCH_PROPERTY_BLIST: + LOG_BLIST("udev property blacklisted"); + break; ++ case MATCH_PROTOCOL_BLIST: ++ LOG_BLIST("protocol blacklisted"); ++ break; + case MATCH_DEVICE_BLIST_EXCEPT: + LOG_BLIST("vendor/product whitelisted"); + break; +@@ -251,6 +258,9 @@ log_filter (const char *dev, char *vendo + case MATCH_PROPERTY_BLIST_MISSING: + LOG_BLIST("blacklisted, udev property missing"); + break; ++ case MATCH_PROTOCOL_BLIST_EXCEPT: ++ LOG_BLIST("protocol whitelisted"); ++ break; + } + } + +@@ -270,7 +280,7 @@ int + filter_device (vector blist, vector elist, char * vendor, char * product) + { + int r = _filter_device(blist, elist, vendor, product); +- log_filter(NULL, vendor, product, NULL, NULL, r); ++ log_filter(NULL, vendor, product, NULL, NULL, NULL, r); + return r; + } + +@@ -290,7 +300,7 @@ int + filter_devnode (vector blist, vector elist, char * dev) + { + int r = _filter_devnode(blist, elist, dev); +- log_filter(dev, NULL, NULL, NULL, NULL, r); ++ log_filter(dev, NULL, NULL, NULL, NULL, NULL, r); + return r; + } + +@@ -310,7 +320,7 @@ int + filter_wwid (vector blist, vector elist, char * wwid) + { + int r = _filter_wwid(blist, elist, wwid); +- log_filter(NULL, NULL, NULL, wwid, NULL, r); ++ log_filter(NULL, NULL, NULL, wwid, NULL, NULL, r); + return r; + } + +@@ -346,7 +356,7 @@ filter_property(struct config * conf, st + + r = _filter_property(conf, env); + if (r) { +- log_filter(devname, NULL, NULL, NULL, env, r); ++ log_filter(devname, NULL, NULL, NULL, env, NULL, r); + return r; + } + } +@@ -356,13 +366,35 @@ filter_property(struct config * conf, st + * the environment variable _has_ to match. + */ + if (VECTOR_SIZE(conf->elist_property)) { +- log_filter(devname, NULL, NULL, NULL, NULL, ++ log_filter(devname, NULL, NULL, NULL, NULL, NULL, + MATCH_PROPERTY_BLIST_MISSING); + return MATCH_PROPERTY_BLIST_MISSING; + } + return 0; + } + ++static int ++_filter_protocol(vector blist, vector elist, char *protocol_str) ++{ ++ if (_blacklist_exceptions(elist, protocol_str)) ++ return MATCH_PROTOCOL_BLIST_EXCEPT; ++ if (_blacklist(blist, protocol_str)) ++ return MATCH_PROTOCOL_BLIST; ++ return 0; ++} ++ ++int ++filter_protocol(vector blist, vector elist, struct path * pp) ++{ ++ char buf[PROTOCOL_BUF_SIZE]; ++ int r; ++ ++ snprint_path_protocol(buf, sizeof(buf), pp); ++ r = _filter_protocol(blist, elist, buf); ++ log_filter(pp->dev, NULL, NULL, NULL, NULL, buf, r); ++ return r; ++} ++ + int + _filter_path (struct config * conf, struct path * pp) + { +@@ -371,6 +403,9 @@ _filter_path (struct config * conf, stru + r = filter_property(conf, pp->udev); + if (r > 0) + return r; ++ r = filter_protocol(conf->blist_protocol, conf->elist_protocol, pp); ++ if (r > 0) ++ return r; + r = _filter_devnode(conf->blist_devnode, conf->elist_devnode,pp->dev); + if (r > 0) + return r; +@@ -386,7 +421,8 @@ int + filter_path (struct config * conf, struct path * pp) + { + int r=_filter_path(conf, pp); +- log_filter(pp->dev, pp->vendor_id, pp->product_id, pp->wwid, NULL, r); ++ log_filter(pp->dev, pp->vendor_id, pp->product_id, pp->wwid, NULL, ++ NULL, r); + return r; + } + +Index: multipath-bz1600672/libmultipath/blacklist.h +=================================================================== +--- multipath-bz1600672.orig/libmultipath/blacklist.h ++++ multipath-bz1600672/libmultipath/blacklist.h +@@ -10,10 +10,12 @@ + #define MATCH_DEVNODE_BLIST 3 + #define MATCH_PROPERTY_BLIST 4 + #define MATCH_PROPERTY_BLIST_MISSING 5 ++#define MATCH_PROTOCOL_BLIST 6 + #define MATCH_WWID_BLIST_EXCEPT -MATCH_WWID_BLIST + #define MATCH_DEVICE_BLIST_EXCEPT -MATCH_DEVICE_BLIST + #define MATCH_DEVNODE_BLIST_EXCEPT -MATCH_DEVNODE_BLIST + #define MATCH_PROPERTY_BLIST_EXCEPT -MATCH_PROPERTY_BLIST ++#define MATCH_PROTOCOL_BLIST_EXCEPT -MATCH_PROTOCOL_BLIST + + struct blentry { + char * str; +@@ -36,6 +38,7 @@ int filter_wwid (vector, vector, char *) + int filter_device (vector, vector, char *, char *); + int filter_path (struct config *, struct path *); + int filter_property(struct config *, struct udev_device *); ++int filter_protocol(vector, vector, struct path *); + int store_ble (vector, char *, int); + int set_ble_device (vector, char *, char *, int); + void free_blacklist (vector); +Index: multipath-bz1600672/libmultipath/config.c +=================================================================== +--- multipath-bz1600672.orig/libmultipath/config.c ++++ multipath-bz1600672/libmultipath/config.c +@@ -598,11 +598,13 @@ free_config (struct config * conf) + free_blacklist(conf->blist_devnode); + free_blacklist(conf->blist_wwid); + free_blacklist(conf->blist_property); ++ free_blacklist(conf->blist_protocol); + free_blacklist_device(conf->blist_device); + + free_blacklist(conf->elist_devnode); + free_blacklist(conf->elist_wwid); + free_blacklist(conf->elist_property); ++ free_blacklist(conf->elist_protocol); + free_blacklist_device(conf->elist_device); + + free_mptable(conf->mptable); +@@ -788,6 +790,13 @@ load_config (char * file, struct udev *u + goto out; + } + ++ if (conf->blist_protocol == NULL) { ++ conf->blist_protocol = vector_alloc(); ++ ++ if (!conf->blist_protocol) ++ goto out; ++ } ++ + if (conf->elist_devnode == NULL) { + conf->elist_devnode = vector_alloc(); + +@@ -815,6 +824,13 @@ load_config (char * file, struct udev *u + goto out; + } + ++ if (conf->elist_protocol == NULL) { ++ conf->elist_protocol = vector_alloc(); ++ ++ if (!conf->elist_protocol) ++ goto out; ++ } ++ + if (setup_default_blist(conf)) + goto out; + +Index: multipath-bz1600672/libmultipath/config.h +=================================================================== +--- multipath-bz1600672.orig/libmultipath/config.h ++++ multipath-bz1600672/libmultipath/config.h +@@ -190,10 +190,12 @@ struct config { + vector blist_wwid; + vector blist_device; + vector blist_property; ++ vector blist_protocol; + vector elist_devnode; + vector elist_wwid; + vector elist_device; + vector elist_property; ++ vector elist_protocol; + }; + + struct config * conf; +Index: multipath-bz1600672/libmultipath/dict.c +=================================================================== +--- multipath-bz1600672.orig/libmultipath/dict.c ++++ multipath-bz1600672/libmultipath/dict.c +@@ -1065,9 +1065,12 @@ blacklist_handler(vector strvec) + conf->blist_device = vector_alloc(); + if (!conf->blist_property) + conf->blist_property = vector_alloc(); ++ if (!conf->blist_protocol) ++ conf->blist_protocol = vector_alloc(); + + if (!conf->blist_devnode || !conf->blist_wwid || +- !conf->blist_device || !conf->blist_property) ++ !conf->blist_device || !conf->blist_property || ++ !conf->blist_protocol) + return 1; + + return 0; +@@ -1084,9 +1087,12 @@ blacklist_exceptions_handler(vector strv + conf->elist_device = vector_alloc(); + if (!conf->elist_property) + conf->elist_property = vector_alloc(); ++ if (!conf->elist_protocol) ++ conf->elist_protocol = vector_alloc(); + + if (!conf->elist_devnode || !conf->elist_wwid || +- !conf->elist_device || !conf->elist_property) ++ !conf->elist_device || !conf->elist_property || ++ !conf->elist_protocol) + return 1; + + return 0; +@@ -1171,6 +1177,32 @@ ble_except_property_handler(vector strve + } + + static int ++ble_protocol_handler(vector strvec) ++{ ++ char * buff; ++ ++ buff = set_value(strvec); ++ ++ if (!buff) ++ return 1; ++ ++ return store_ble(conf->blist_protocol, buff, ORIGIN_CONFIG); ++} ++ ++static int ++ble_except_protocol_handler(vector strvec) ++{ ++ char * buff; ++ ++ buff = set_value(strvec); ++ ++ if (!buff) ++ return 1; ++ ++ return store_ble(conf->elist_protocol, buff, ORIGIN_CONFIG); ++} ++ ++static int + ble_device_handler(vector strvec) + { + return alloc_ble_device(conf->blist_device); +@@ -3936,6 +3968,7 @@ init_keywords(void) + install_keyword_multi("devnode", &ble_devnode_handler, &snprint_ble_simple); + install_keyword_multi("wwid", &ble_wwid_handler, &snprint_ble_simple); + install_keyword_multi("property", &ble_property_handler, &snprint_ble_simple); ++ install_keyword_multi("protocol", &ble_protocol_handler, &snprint_ble_simple); + install_keyword_multi("device", &ble_device_handler, NULL); + install_sublevel(); + install_keyword("vendor", &ble_vendor_handler, &snprint_bled_vendor); +@@ -3945,6 +3978,7 @@ init_keywords(void) + install_keyword_multi("devnode", &ble_except_devnode_handler, &snprint_ble_simple); + install_keyword_multi("wwid", &ble_except_wwid_handler, &snprint_ble_simple); + install_keyword_multi("property", &ble_except_property_handler, &snprint_ble_simple); ++ install_keyword_multi("protocol", &ble_except_protocol_handler, &snprint_ble_simple); + install_keyword_multi("device", &ble_except_device_handler, NULL); + install_sublevel(); + install_keyword("vendor", &ble_except_vendor_handler, &snprint_bled_vendor); +Index: multipath-bz1600672/libmultipath/discovery.c +=================================================================== +--- multipath-bz1600672.orig/libmultipath/discovery.c ++++ multipath-bz1600672/libmultipath/discovery.c +@@ -1489,9 +1489,10 @@ pathinfo (struct path *pp, vector hwtabl + + if (mask & DI_BLACKLIST && mask & DI_SYSFS) { + if (filter_device(conf->blist_device, conf->elist_device, +- pp->vendor_id, pp->product_id) > 0) { ++ pp->vendor_id, pp->product_id) > 0 || ++ filter_protocol(conf->blist_protocol, conf->elist_protocol, ++ pp) > 0) + return PATHINFO_SKIPPED; +- } + } + + path_state = path_offline(pp); +Index: multipath-bz1600672/libmultipath/print.c +=================================================================== +--- multipath-bz1600672.orig/libmultipath/print.c ++++ multipath-bz1600672/libmultipath/print.c +@@ -601,6 +601,48 @@ snprint_path_checker (char * buff, size_ + return snprint_str(buff, len, c->name); + } + ++/* if you add a protocol string bigger than "scsi:unspec" you must ++ * also change PROTOCOL_BUF_SIZE */ ++int ++snprint_path_protocol(char * buff, size_t len, struct path * pp) ++{ ++ switch (pp->bus) { ++ case SYSFS_BUS_SCSI: ++ switch (pp->sg_id.proto_id) { ++ case SCSI_PROTOCOL_FCP: ++ return snprintf(buff, len, "scsi:fcp"); ++ case SCSI_PROTOCOL_SPI: ++ return snprintf(buff, len, "scsi:spi"); ++ case SCSI_PROTOCOL_SSA: ++ return snprintf(buff, len, "scsi:ssa"); ++ case SCSI_PROTOCOL_SBP: ++ return snprintf(buff, len, "scsi:sbp"); ++ case SCSI_PROTOCOL_SRP: ++ return snprintf(buff, len, "scsi:srp"); ++ case SCSI_PROTOCOL_ISCSI: ++ return snprintf(buff, len, "scsi:iscsi"); ++ case SCSI_PROTOCOL_SAS: ++ return snprintf(buff, len, "scsi:sas"); ++ case SCSI_PROTOCOL_ADT: ++ return snprintf(buff, len, "scsi:adt"); ++ case SCSI_PROTOCOL_ATA: ++ return snprintf(buff, len, "scsi:ata"); ++ case SCSI_PROTOCOL_UNSPEC: ++ default: ++ return snprintf(buff, len, "scsi:unspec"); ++ } ++ case SYSFS_BUS_CCW: ++ return snprintf(buff, len, "ccw"); ++ case SYSFS_BUS_CCISS: ++ return snprintf(buff, len, "cciss"); ++ case SYSFS_BUS_NVME: ++ return snprintf(buff, len, "nvme"); ++ case SYSFS_BUS_UNDEF: ++ default: ++ return snprintf(buff, len, "undef"); ++ } ++} ++ + struct multipath_data mpd[] = { + {'n', "name", 0, snprint_name}, + {'w', "uuid", 0, snprint_multipath_uuid}, +@@ -647,6 +689,7 @@ struct path_data pd[] = { + {'R', "host WWPN", 0, snprint_host_wwpn}, + {'r', "target WWPN", 0, snprint_tgt_wwpn}, + {'a', "host adapter", 0, snprint_host_adapter}, ++ {'P', "protocol", 0, snprint_path_protocol}, + {0, NULL, 0 , NULL} + }; + +@@ -1428,6 +1471,19 @@ snprint_blacklist_report (char * buff, i + + if ((len - fwd - threshold) <= 0) + return len; ++ fwd += snprintf(buff + fwd, len - fwd, "protocol rules:\n" ++ "- blacklist:\n"); ++ if (!snprint_blacklist_group(buff, len, &fwd, &conf->blist_protocol)) ++ return len; ++ ++ if ((len - fwd - threshold) <= 0) ++ return len; ++ fwd += snprintf(buff + fwd, len - fwd, "- exceptions:\n"); ++ if (snprint_blacklist_group(buff, len, &fwd, &conf->elist_protocol) == 0) ++ return len; ++ ++ if ((len - fwd - threshold) <= 0) ++ return len; + fwd += snprintf(buff + fwd, len - fwd, "wwid rules:\n" + "- blacklist:\n"); + if (snprint_blacklist_group(buff, len, &fwd, &conf->blist_wwid) == 0) +@@ -1502,6 +1558,15 @@ snprint_blacklist (char * buff, int len) + if (fwd > len) + return len; + } ++ vector_foreach_slot (conf->blist_protocol, ble, i) { ++ kw = find_keyword(rootkw->sub, "protocol"); ++ if (!kw) ++ return 0; ++ fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n", ++ kw, ble); ++ if (fwd > len) ++ return len; ++ } + rootkw = find_keyword(rootkw->sub, "device"); + if (!rootkw) + return 0; +@@ -1575,6 +1640,15 @@ snprint_blacklist_except (char * buff, i + if (!kw) + return 0; + fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n", ++ kw, ele); ++ if (fwd > len) ++ return len; ++ } ++ vector_foreach_slot (conf->elist_protocol, ele, i) { ++ kw = find_keyword(rootkw->sub, "protocol"); ++ if (!kw) ++ return 0; ++ fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n", + kw, ele); + if (fwd > len) + return len; +Index: multipath-bz1600672/libmultipath/print.h +=================================================================== +--- multipath-bz1600672.orig/libmultipath/print.h ++++ multipath-bz1600672/libmultipath/print.h +@@ -115,6 +115,8 @@ int snprint_host_wwnn (char *, size_t, s + int snprint_host_wwpn (char *, size_t, struct path *); + int snprint_tgt_wwnn (char *, size_t, struct path *); + int snprint_tgt_wwpn (char *, size_t, struct path *); ++#define PROTOCOL_BUF_SIZE sizeof("scsi:unspec") ++int snprint_path_protocol(char *, size_t, struct path *); + + void print_multipath_topology (struct multipath * mpp, int verbosity); + void print_path (struct path * pp, char * style); +Index: multipath-bz1600672/libmultipath/structs.h +=================================================================== +--- multipath-bz1600672.orig/libmultipath/structs.h ++++ multipath-bz1600672/libmultipath/structs.h +@@ -50,7 +50,6 @@ enum failback_mode { + enum sysfs_buses { + SYSFS_BUS_UNDEF, + SYSFS_BUS_SCSI, +- SYSFS_BUS_IDE, + SYSFS_BUS_CCW, + SYSFS_BUS_CCISS, + SYSFS_BUS_RBD, +Index: multipath-bz1600672/multipath/multipath.conf.5 +=================================================================== +--- multipath-bz1600672.orig/multipath/multipath.conf.5 ++++ multipath-bz1600672/multipath/multipath.conf.5 +@@ -632,6 +632,10 @@ Regular expression of the device nodes t + .B property + Regular expresion of the udev property to be excluded. + .TP ++.B protocol ++Regular expression of the protocol to be excluded. See below for a ++list of recognized protocols ++.TP + .B device + Subsection for the device description. This subsection recognizes the + .I vendor +@@ -640,6 +644,13 @@ and + keywords. For a full description of these keywords please see the + .I devices + section description. ++.LP ++The protocol strings that multipath recognizes are \fIscsi:fcp\fR, ++\fIscsi:spi\fR, \fIscsi:ssa\fR, \fIscsi:sbp\fR, \fIscsi:srp\fR, ++\fIscsi:iscsi\fR, \fIscsi:sas\fR, \fIscsi:adt\fR, \fIscsi:ata\fR, ++\fIscsi:unspec\fR, \fIccw\fR, \fIcciss\fR, \fInvme\fR, and \fIundef\fR. ++The protocol that a path is using can be viewed by running ++\fBmultipathd show paths format "%d %P"\fR + .SH "blacklist_exceptions section" + The + .I blacklist_exceptions +@@ -659,6 +670,10 @@ The \fIWorld Wide Identification\fR of a + .B property + Regular expresion of the udev property to be whitelisted. + .TP ++.B protocol ++Regular expression of the protocol to be whitelisted. See the ++\fBblacklist section\fR for a list of recognized protocols ++.TP + .B devnode + Regular expression of the device nodes to be whitelisted. + .TP diff --git a/SPECS/device-mapper-multipath.spec b/SPECS/device-mapper-multipath.spec index 79dc7c9..ffdebf3 100644 --- a/SPECS/device-mapper-multipath.spec +++ b/SPECS/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: 119%{?dist} +Release: 119%{?dist}.1 License: GPL+ Group: System Environment/Base URL: http://christophe.varoqui.free.fr/ @@ -243,6 +243,7 @@ Patch0233: 0233-RHBZ-1451852-1482629-nimble-config.patch Patch0234: 0234-RHBZ-1500109-doc-typo.patch Patch0235: 0235-RHBZ-1480638-NVMe-support.patch Patch0236: 0236-RHBZ-1525348-fix-msg.patch +Patch0237: 0237-RHBZ-1607749-add-transport-blacklist.patch # runtime Requires: %{name}-libs = %{version}-%{release} @@ -566,6 +567,7 @@ device-mapper-multipath's libdmmp C API library %patch0234 -p1 %patch0235 -p1 %patch0236 -p1 +%patch0237 -p1 cp %{SOURCE1} . %build @@ -683,6 +685,11 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog +* Tue Jul 24 2018 Benjamin Marzinski 0.4.9-119.1 +- Add 0237-RHBZ-1607749-add-transport-blacklist.patch + * and new blacklist option, "protocol" +- Resolves: bz #1607749 + * Wed Jan 31 2018 Benjamin Marzinski 0.4.9-119 - Add 0236-RHBZ-1525348-fix-msg.patch * reduced message serverity level