diff --git a/.gitignore b/.gitignore index 23fc5ca..e183506 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ multipath-tools-091027.tar.gz /multipath-tools-0.7.9.tgz /multipath-tools-17a6101.tgz /multipath-tools-2df6110.tgz +/multipath-tools-0.8.0.tgz diff --git a/0003-multipathd-cleanup-marginal-paths-checking-timers.patch b/0003-multipathd-cleanup-marginal-paths-checking-timers.patch index 95c8044..ece5218 100644 --- a/0003-multipathd-cleanup-marginal-paths-checking-timers.patch +++ b/0003-multipathd-cleanup-marginal-paths-checking-timers.patch @@ -52,10 +52,10 @@ index 1cb3ffe..416e13a 100644 } diff --git a/multipathd/main.c b/multipathd/main.c -index 491832b..cac9050 100644 +index fb520b6..fe6d8ef 100644 --- a/multipathd/main.c +++ b/multipathd/main.c -@@ -2075,7 +2075,8 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) +@@ -2079,7 +2079,8 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) return 1; } diff --git a/0004-libmultipath-fix-marginal-paths-queueing-errors.patch b/0004-libmultipath-fix-marginal-paths-queueing-errors.patch index ba2642c..9417741 100644 --- a/0004-libmultipath-fix-marginal-paths-queueing-errors.patch +++ b/0004-libmultipath-fix-marginal-paths-queueing-errors.patch @@ -159,10 +159,10 @@ index bbf31b4..53d6d7d 100644 #endif /* _IO_ERR_STAT_H */ diff --git a/multipathd/main.c b/multipathd/main.c -index cac9050..0e3ac2c 100644 +index fe6d8ef..43830e8 100644 --- a/multipathd/main.c +++ b/multipathd/main.c -@@ -2076,7 +2076,7 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) +@@ -2080,7 +2080,7 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) } if ((newstate == PATH_UP || newstate == PATH_GHOST) && diff --git a/0006-multipathd-Fix-miscounting-active-paths.patch b/0006-multipathd-Fix-miscounting-active-paths.patch new file mode 100644 index 0000000..4eb50f5 --- /dev/null +++ b/0006-multipathd-Fix-miscounting-active-paths.patch @@ -0,0 +1,92 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Fri, 15 Feb 2019 17:19:46 -0600 +Subject: [PATCH] multipathd: Fix miscounting active paths + +When multipathd gets a change uevent, it calls pathinfo with DI_NOIO. +This sets the path state to the return value of path_offline(). If a +path is in the PATH_DOWN state but path_offline() returns PATH_UP, when +that path gets a change event, its state will get moved to PATH_UP +without either reinstating the path, or reloading the map. The next +call to check_path() will move the path back to PATH_DOWN. Since +check_path() simply increments and decrements nr_active instead of +calculating it based on the actual number of active paths, nr_active +will get decremented a second time for this failed path, potentially +putting the multipath device into recovery mode. + +This commit does two things to avoid this situation. It makes the +DI_NOIO flag only set pp->state in pathinfo() if DI_CHECKER is also set. +This isn't set in uev_update_path() to avoid changing the path state in +this case. Also, to guard against pp->state getting changed in some +other code path without properly updating the map state, check_path() +now calls set_no_path_retry, which recalculates nr_active based on the +actual number of active paths, and makes sure that the queue_if_no_path +value in the features line is correct. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 11 ++++++----- + multipath/main.c | 2 +- + multipathd/main.c | 4 +++- + 3 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index 10bd8cd..729bcb9 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -1914,11 +1914,12 @@ int pathinfo(struct path *pp, struct config *conf, int mask) + if (path_state == PATH_REMOVED) + goto blank; + else if (mask & DI_NOIO) { +- /* +- * Avoid any IO on the device itself. +- * Behave like DI_CHECKER in the "path unavailable" case. +- */ +- pp->chkrstate = pp->state = path_state; ++ if (mask & DI_CHECKER) ++ /* ++ * Avoid any IO on the device itself. ++ * simply use the path_offline() return as its state ++ */ ++ pp->chkrstate = pp->state = path_state; + return PATHINFO_OK; + } + +diff --git a/multipath/main.c b/multipath/main.c +index 5abb118..69141db 100644 +--- a/multipath/main.c ++++ b/multipath/main.c +@@ -356,7 +356,7 @@ static int check_usable_paths(struct config *conf, + pp->udev = get_udev_device(pp->dev_t, DEV_DEVT); + if (pp->udev == NULL) + continue; +- if (pathinfo(pp, conf, DI_SYSFS|DI_NOIO) != PATHINFO_OK) ++ if (pathinfo(pp, conf, DI_SYSFS|DI_NOIO|DI_CHECKER) != PATHINFO_OK) + continue; + + if (pp->state == PATH_UP && +diff --git a/multipathd/main.c b/multipathd/main.c +index 43830e8..678ecf8 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -392,7 +392,8 @@ static void set_no_path_retry(struct multipath *mpp) + default: + if (mpp->nr_active > 0) { + mpp->retry_tick = 0; +- dm_queue_if_no_path(mpp->alias, 1); ++ if (!is_queueing) ++ dm_queue_if_no_path(mpp->alias, 1); + } else if (is_queueing && mpp->retry_tick == 0) + enter_recovery_mode(mpp); + break; +@@ -2072,6 +2073,7 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) + /* if update_multipath_strings orphaned the path, quit early */ + if (!pp->mpp) + return 0; ++ set_no_path_retry(pp->mpp); + + if ((newstate == PATH_UP || newstate == PATH_GHOST) && + check_path_reinstate_state(pp)) { +-- +2.17.2 + diff --git a/0006-multipathd-avoid-null-pointer-dereference-in-LOG_MSG.patch b/0006-multipathd-avoid-null-pointer-dereference-in-LOG_MSG.patch deleted file mode 100644 index 3d81d07..0000000 --- a/0006-multipathd-avoid-null-pointer-dereference-in-LOG_MSG.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Benjamin Marzinski -Date: Wed, 6 Feb 2019 12:01:32 -0600 -Subject: [PATCH] multipathd: avoid null pointer dereference in LOG_MSG - -LOG_MSG() will dereference pp->mpp. Commit cb5ec664 added a call to -LOG_MSG() before the check for (!pp->mpp) in check_path. This can cause -multipathd to crash. LOG_MSG() should only be called if pp->mpp is set -and a checker is selected. - -Also, checker_message() should fail to a generic message if c->cls isn't -set (which means that a checker hasn't been selected). - -Fixes: cb5ec664 (multipathd: check_path: improve logging for "unusable - path" case) -Signed-off-by: Benjamin Marzinski ---- - libmultipath/checkers.c | 2 +- - multipathd/main.c | 6 ++++-- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c -index 848c4c3..ca95cae 100644 ---- a/libmultipath/checkers.c -+++ b/libmultipath/checkers.c -@@ -295,7 +295,7 @@ const char *checker_message(const struct checker *c) - { - int id; - -- if (!c || c->msgid < 0 || -+ if (!c || !c->cls || c->msgid < 0 || - (c->msgid >= CHECKER_GENERIC_MSGTABLE_SIZE && - c->msgid < CHECKER_FIRST_MSGID)) - goto bad_id; -diff --git a/multipathd/main.c b/multipathd/main.c -index 0e3ac2c..1caa40f 100644 ---- a/multipathd/main.c -+++ b/multipathd/main.c -@@ -2017,8 +2017,10 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) - } - - if (newstate == PATH_WILD || newstate == PATH_UNCHECKED) { -- condlog(2, "%s: unusable path - checker failed", pp->dev); -- LOG_MSG(2, verbosity, pp); -+ condlog(2, "%s: unusable path (%s) - checker failed", pp->dev, -+ checker_state_name(newstate)); -+ if (pp->mpp && checker_selected(&pp->checker)) -+ LOG_MSG(2, verbosity, pp); - conf = get_multipath_config(); - pthread_cleanup_push(put_multipath_config, conf); - pathinfo(pp, conf, 0); --- -2.17.2 - diff --git a/0007-multipath-blacklist-zram-devices.patch b/0007-multipath-blacklist-zram-devices.patch deleted file mode 100644 index 1976a35..0000000 --- a/0007-multipath-blacklist-zram-devices.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Benjamin Marzinski -Date: Wed, 6 Feb 2019 13:46:10 -0600 -Subject: [PATCH] multipath: blacklist zram devices - -Signed-off-by: Benjamin Marzinski ---- - libmultipath/blacklist.c | 2 +- - multipath/multipath.conf.5 | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c -index 709895e..e0d0279 100644 ---- a/libmultipath/blacklist.c -+++ b/libmultipath/blacklist.c -@@ -192,7 +192,7 @@ setup_default_blist (struct config * conf) - char * str; - int i; - -- str = STRDUP("^(ram|raw|loop|fd|md|dm-|sr|scd|st|dcssblk)[0-9]"); -+ str = STRDUP("^(ram|zram|raw|loop|fd|md|dm-|sr|scd|st|dcssblk)[0-9]"); - if (!str) - return 1; - if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT)) -diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 -index 88b8edd..0fe8461 100644 ---- a/multipath/multipath.conf.5 -+++ b/multipath/multipath.conf.5 -@@ -1218,7 +1218,7 @@ Regular expression matching the device nodes to be excluded/included. - .RS - .PP - The default \fIblacklist\fR consists of the regular expressions --"^(ram|raw|loop|fd|md|dm-|sr|scd|st|dcssblk)[0-9]" and -+"^(ram|zram|raw|loop|fd|md|dm-|sr|scd|st|dcssblk)[0-9]" and - "^(td|hd|vd)[a-z]". This causes virtual devices, non-disk devices, and some other - device types to be excluded from multipath handling by default. - .RE --- -2.17.2 - diff --git a/0007-multipathd-ignore-failed-wwid-recheck.patch b/0007-multipathd-ignore-failed-wwid-recheck.patch new file mode 100644 index 0000000..37fdae1 --- /dev/null +++ b/0007-multipathd-ignore-failed-wwid-recheck.patch @@ -0,0 +1,71 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 20 Feb 2019 17:05:08 -0600 +Subject: [PATCH] multipathd: ignore failed wwid recheck + +If disable_changed_wwids is set, when multipathd gets a change event on +a path, it verifies that the wwid hasn't changed in uev_update_path(). +If get_uid() failed, uev_update_path treated this as a wwid change to 0. +This could cause paths to suddenly be dropped due to an issue with +getting the wwid. Even if get_uid() failed because the path was down, +it no change uevent happend when it later became active, multipathd +would continue to ignore the path. Also, scsi_uid_fallback() clears the +failure return if it doesn't attempt to fallback, causing get_uid() +to return success, when it actually failed. + +Multipathd should neither set nor clear wwid_changed if get_uid() +returned failure. Also, scsi_uid_fallback() should retain the old return +value if it doesn't attempt to fallback. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 6 +++--- + multipathd/main.c | 6 ++++-- + 2 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index 729bcb9..b08cb2d 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -1755,9 +1755,9 @@ get_vpd_uid(struct path * pp) + } + + static ssize_t scsi_uid_fallback(struct path *pp, int path_state, +- const char **origin) ++ const char **origin, ssize_t old_len) + { +- ssize_t len = 0; ++ ssize_t len = old_len; + int retrigger; + struct config *conf; + +@@ -1828,7 +1828,7 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev) + origin = "sysfs"; + } + if (len <= 0 && pp->bus == SYSFS_BUS_SCSI) +- len = scsi_uid_fallback(pp, path_state, &origin); ++ len = scsi_uid_fallback(pp, path_state, &origin, len); + } + if ( len < 0 ) { + condlog(1, "%s: failed to get %s uid: %s", +diff --git a/multipathd/main.c b/multipathd/main.c +index 678ecf8..fd83a6a 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1234,9 +1234,11 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + goto out; + + strcpy(wwid, pp->wwid); +- get_uid(pp, pp->state, uev->udev); ++ rc = get_uid(pp, pp->state, uev->udev); + +- if (strncmp(wwid, pp->wwid, WWID_SIZE) != 0) { ++ if (rc != 0) ++ strcpy(pp->wwid, wwid); ++ else if (strncmp(wwid, pp->wwid, WWID_SIZE) != 0) { + condlog(0, "%s: path wwid changed from '%s' to '%s'. %s", + uev->kernel, wwid, pp->wwid, + (disable_changed_wwids ? "disallowing" : +-- +2.17.2 + diff --git a/0008-libmutipath-continue-to-use-old-state-on-PATH_PENDIN.patch b/0008-libmutipath-continue-to-use-old-state-on-PATH_PENDIN.patch new file mode 100644 index 0000000..aa43b94 --- /dev/null +++ b/0008-libmutipath-continue-to-use-old-state-on-PATH_PENDIN.patch @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 21 Feb 2019 13:05:43 -0600 +Subject: [PATCH] libmutipath: continue to use old state on PATH_PENDING + +When pathinfo() sets pp->state to PATH_PENDING, it can cause problems +with path checking. It should act more like check_path(). When +check_path() sees a new state of PATH_PENDING, it doesn't update the +path state at all, so a path's old state is normally never PATH_PENDING. + +As and example of the problems of setting a path to PATH_PENDING, If +check_path() sets a path's state to PATH_UP, then a call to pathinfo() +sets the state to PATH_PENDING, and then another call the check_path() +sets the state to PATH_DOWN, multipathd won't fail the path in the +kernel. Also, if a path's state is PATH_PENDING, and nr_active is +recalculated, that path will count as down, even if the state was +previously PATH_UP. If a path already has a state of PATH_WILD or +PATH_UNCHECKED, changing it to PATH_PENDING won't hurt anything, and it +will help anyone who sees it know what's actually happening. But +otherwise, pathinfo() should leave the previous state alone. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index b08cb2d..28c00e5 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -1946,8 +1946,11 @@ int pathinfo(struct path *pp, struct config *conf, int mask) + + if (mask & DI_CHECKER) { + if (path_state == PATH_UP) { +- pp->chkrstate = pp->state = get_state(pp, conf, 0, +- path_state); ++ int newstate = get_state(pp, conf, 0, path_state); ++ if (newstate != PATH_PENDING || ++ pp->state == PATH_UNCHECKED || ++ pp->state == PATH_WILD) ++ pp->chkrstate = pp->state = newstate; + if (pp->state == PATH_TIMEOUT) + pp->state = PATH_DOWN; + if (pp->state == PATH_UP && !pp->size) { +-- +2.17.2 + diff --git a/0009-multipathd-use-update_path_groups-instead-of-reload_.patch b/0009-multipathd-use-update_path_groups-instead-of-reload_.patch new file mode 100644 index 0000000..cc429c5 --- /dev/null +++ b/0009-multipathd-use-update_path_groups-instead-of-reload_.patch @@ -0,0 +1,76 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 21 Feb 2019 17:00:17 -0600 +Subject: [PATCH] multipathd: use update_path_groups instead of reload_map + +reload_map() doesn't do the work to sync the state after reloading the +map. Instead of calling it directly, cli_reload() and uev_update_path() +should call update_path_groups(), which calls reload_map() with all the +necessary syncing. + +Signed-off-by: Benjamin Marzinski +--- + multipathd/cli_handlers.c | 2 +- + multipathd/main.c | 13 ++++++++----- + multipathd/main.h | 2 ++ + 3 files changed, 11 insertions(+), 6 deletions(-) + +diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c +index f95813e..60e17d6 100644 +--- a/multipathd/cli_handlers.c ++++ b/multipathd/cli_handlers.c +@@ -877,7 +877,7 @@ cli_reload(void *v, char **reply, int *len, void *data) + return 1; + } + +- return reload_map(vecs, mpp, 0, 1); ++ return update_path_groups(mpp, vecs, 0); + } + + int resize_map(struct multipath *mpp, unsigned long long size, +diff --git a/multipathd/main.c b/multipathd/main.c +index fd83a6a..7a317d9 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1273,10 +1273,13 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + else { + if (ro == 1) + pp->mpp->force_readonly = 1; +- retval = reload_map(vecs, mpp, 0, 1); +- pp->mpp->force_readonly = 0; +- condlog(2, "%s: map %s reloaded (retval %d)", +- uev->kernel, mpp->alias, retval); ++ retval = update_path_groups(mpp, vecs, 0); ++ if (retval == 2) ++ condlog(2, "%s: map removed during reload", pp->dev); ++ else { ++ pp->mpp->force_readonly = 0; ++ condlog(2, "%s: map %s reloaded (retval %d)", uev->kernel, mpp->alias, retval); ++ } + } + } + } +@@ -1832,7 +1835,7 @@ int update_path_groups(struct multipath *mpp, struct vectors *vecs, int refresh) + + dm_lib_release(); + if (setup_multipath(vecs, mpp) != 0) +- return 1; ++ return 2; + sync_map_state(mpp); + + return 0; +diff --git a/multipathd/main.h b/multipathd/main.h +index 8fd426b..e5c1398 100644 +--- a/multipathd/main.h ++++ b/multipathd/main.h +@@ -43,5 +43,7 @@ int __setup_multipath (struct vectors * vecs, struct multipath * mpp, + int reset); + #define setup_multipath(vecs, mpp) __setup_multipath(vecs, mpp, 1) + int update_multipath (struct vectors *vecs, char *mapname, int reset); ++int update_path_groups(struct multipath *mpp, struct vectors *vecs, ++ int refresh); + + #endif /* MAIN_H */ +-- +2.17.2 + diff --git a/0010-multipath.conf-add-missing-options-to-man-page.patch b/0010-multipath.conf-add-missing-options-to-man-page.patch new file mode 100644 index 0000000..394952d --- /dev/null +++ b/0010-multipath.conf-add-missing-options-to-man-page.patch @@ -0,0 +1,56 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Tue, 26 Feb 2019 12:22:59 -0600 +Subject: [PATCH] multipath.conf: add missing options to man page + +Signed-off-by: Benjamin Marzinski +--- + multipath/multipath.conf.5 | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 +index 0fe8461..864d7eb 100644 +--- a/multipath/multipath.conf.5 ++++ b/multipath/multipath.conf.5 +@@ -1468,6 +1468,8 @@ section: + .TP + .B uid_attribute + .TP ++.B getuid_callout ++.TP + .B path_selector + .TP + .B path_checker +@@ -1494,6 +1496,8 @@ section: + .TP + .B flush_on_last_del + .TP ++.B user_friendly_names ++.TP + .B retain_attached_hw_handler + .TP + .B detect_prio +@@ -1525,6 +1529,8 @@ section: + .B max_sectors_kb + .TP + .B ghost_delay ++.TP ++.B all_tg_pt + .RE + .PD + .LP +@@ -1604,7 +1610,11 @@ the values are taken from the \fIdevices\fR or \fIdefaults\fR sections: + .TP + .B skip_kpartx + .TP ++.B max_sectors_kb ++.TP + .B ghost_delay ++.TP ++.B all_tg_pt + .RE + .PD + .LP +-- +2.17.2 + diff --git a/0011-libmultipath-add-get_uid-fallback-code-for-NVMe-devi.patch b/0011-libmultipath-add-get_uid-fallback-code-for-NVMe-devi.patch new file mode 100644 index 0000000..31cabca --- /dev/null +++ b/0011-libmultipath-add-get_uid-fallback-code-for-NVMe-devi.patch @@ -0,0 +1,90 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 7 Mar 2019 16:14:35 -0600 +Subject: [PATCH] libmultipath: add get_uid fallback code for NVMe devices + +If multipath can't get the uid for NVMe devices from udev, it can get it +directly from sysfs. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 49 ++++++++++++++++++++++++++++------------ + 1 file changed, 34 insertions(+), 15 deletions(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index 28c00e5..bece67c 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -1754,8 +1754,8 @@ get_vpd_uid(struct path * pp) + return get_vpd_sysfs(parent, 0x83, pp->wwid, WWID_SIZE); + } + +-static ssize_t scsi_uid_fallback(struct path *pp, int path_state, +- const char **origin, ssize_t old_len) ++static ssize_t uid_fallback(struct path *pp, int path_state, ++ const char **origin, ssize_t old_len) + { + ssize_t len = old_len; + int retrigger; +@@ -1764,17 +1764,36 @@ static ssize_t scsi_uid_fallback(struct path *pp, int path_state, + conf = get_multipath_config(); + retrigger = conf->retrigger_tries; + put_multipath_config(conf); +- if (pp->retriggers >= retrigger && +- !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { +- len = get_vpd_uid(pp); +- *origin = "sysfs"; +- pp->uid_attribute = NULL; +- if (len < 0 && path_state == PATH_UP) { +- condlog(1, "%s: failed to get sysfs uid: %s", +- pp->dev, strerror(-len)); +- len = get_vpd_sgio(pp->fd, 0x83, pp->wwid, +- WWID_SIZE); +- *origin = "sgio"; ++ if (pp->retriggers >= retrigger) { ++ if (pp->bus == SYSFS_BUS_SCSI && ++ !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { ++ len = get_vpd_uid(pp); ++ *origin = "sysfs"; ++ pp->uid_attribute = NULL; ++ if (len < 0 && path_state == PATH_UP) { ++ condlog(1, "%s: failed to get sysfs uid: %s", ++ pp->dev, strerror(-len)); ++ len = get_vpd_sgio(pp->fd, 0x83, pp->wwid, ++ WWID_SIZE); ++ *origin = "sgio"; ++ } ++ } else if (pp->bus == SYSFS_BUS_NVME) { ++ char value[256]; ++ len = sysfs_attr_get_value(pp->udev, "wwid", value, ++ sizeof(value)); ++ if (len <= 0) ++ return -1; ++ len = strlcpy(pp->wwid, value, WWID_SIZE); ++ if (len >= WWID_SIZE) { ++ len = fix_broken_nvme_wwid(pp, value, ++ WWID_SIZE); ++ if (len > 0) ++ return len; ++ condlog(0, "%s: wwid overflow", pp->dev); ++ len = WWID_SIZE; ++ } ++ *origin = "sysfs"; ++ pp->uid_attribute = NULL; + } + } + return len; +@@ -1827,8 +1846,8 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev) + len = get_vpd_uid(pp); + origin = "sysfs"; + } +- if (len <= 0 && pp->bus == SYSFS_BUS_SCSI) +- len = scsi_uid_fallback(pp, path_state, &origin, len); ++ if (len <= 0) ++ len = uid_fallback(pp, path_state, &origin, len); + } + if ( len < 0 ) { + condlog(1, "%s: failed to get %s uid: %s", +-- +2.17.2 + diff --git a/0012-libmulitpath-cleanup-uid_fallback-code.patch b/0012-libmulitpath-cleanup-uid_fallback-code.patch new file mode 100644 index 0000000..c47f70a --- /dev/null +++ b/0012-libmulitpath-cleanup-uid_fallback-code.patch @@ -0,0 +1,129 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 27 Mar 2019 12:21:57 -0500 +Subject: [PATCH] libmulitpath: cleanup uid_fallback code + +Instead of always calling uid_fallback() if the configured method to get +the uid failed, get_uid now checks if the path supports fallbacks and if +all the retriggers have occurred. If so, it calls uid_fallback(), which +just attempts to get the uid using the appropriate fallback method. None +of these changes should make the code function any differently. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 85 ++++++++++++++++++++++------------------ + 1 file changed, 46 insertions(+), 39 deletions(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index bece67c..3ec60d6 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -1755,50 +1755,50 @@ get_vpd_uid(struct path * pp) + } + + static ssize_t uid_fallback(struct path *pp, int path_state, +- const char **origin, ssize_t old_len) ++ const char **origin) + { +- ssize_t len = old_len; +- int retrigger; +- struct config *conf; +- +- conf = get_multipath_config(); +- retrigger = conf->retrigger_tries; +- put_multipath_config(conf); +- if (pp->retriggers >= retrigger) { +- if (pp->bus == SYSFS_BUS_SCSI && +- !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { +- len = get_vpd_uid(pp); +- *origin = "sysfs"; +- pp->uid_attribute = NULL; +- if (len < 0 && path_state == PATH_UP) { +- condlog(1, "%s: failed to get sysfs uid: %s", +- pp->dev, strerror(-len)); +- len = get_vpd_sgio(pp->fd, 0x83, pp->wwid, ++ ssize_t len = -1; ++ ++ if (pp->bus == SYSFS_BUS_SCSI && ++ !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { ++ len = get_vpd_uid(pp); ++ *origin = "sysfs"; ++ pp->uid_attribute = NULL; ++ if (len < 0 && path_state == PATH_UP) { ++ condlog(1, "%s: failed to get sysfs uid: %s", ++ pp->dev, strerror(-len)); ++ len = get_vpd_sgio(pp->fd, 0x83, pp->wwid, ++ WWID_SIZE); ++ *origin = "sgio"; ++ } ++ } else if (pp->bus == SYSFS_BUS_NVME) { ++ char value[256]; ++ len = sysfs_attr_get_value(pp->udev, "wwid", value, ++ sizeof(value)); ++ if (len <= 0) ++ return -1; ++ len = strlcpy(pp->wwid, value, WWID_SIZE); ++ if (len >= WWID_SIZE) { ++ len = fix_broken_nvme_wwid(pp, value, + WWID_SIZE); +- *origin = "sgio"; +- } +- } else if (pp->bus == SYSFS_BUS_NVME) { +- char value[256]; +- len = sysfs_attr_get_value(pp->udev, "wwid", value, +- sizeof(value)); +- if (len <= 0) +- return -1; +- len = strlcpy(pp->wwid, value, WWID_SIZE); +- if (len >= WWID_SIZE) { +- len = fix_broken_nvme_wwid(pp, value, +- WWID_SIZE); +- if (len > 0) +- return len; +- condlog(0, "%s: wwid overflow", pp->dev); +- len = WWID_SIZE; +- } +- *origin = "sysfs"; +- pp->uid_attribute = NULL; ++ if (len > 0) ++ return len; ++ condlog(0, "%s: wwid overflow", pp->dev); ++ len = WWID_SIZE; + } ++ *origin = "sysfs"; ++ pp->uid_attribute = NULL; + } + return len; + } + ++static int has_uid_fallback(struct path *pp) ++{ ++ return ((pp->bus == SYSFS_BUS_SCSI && ++ !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) || ++ pp->bus == SYSFS_BUS_NVME); ++} ++ + int + get_uid (struct path * pp, int path_state, struct udev_device *udev) + { +@@ -1846,8 +1846,15 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev) + len = get_vpd_uid(pp); + origin = "sysfs"; + } +- if (len <= 0) +- len = uid_fallback(pp, path_state, &origin, len); ++ if (len <= 0 && has_uid_fallback(pp)) { ++ int retrigger_tries; ++ ++ conf = get_multipath_config(); ++ retrigger_tries = conf->retrigger_tries; ++ put_multipath_config(conf); ++ if (pp->retriggers >= retrigger_tries) ++ len = uid_fallback(pp, path_state, &origin); ++ } + } + if ( len < 0 ) { + condlog(1, "%s: failed to get %s uid: %s", +-- +2.17.2 + diff --git a/0013-multipathd-handle-changed-wwids-by-removal-and-addit.patch b/0013-multipathd-handle-changed-wwids-by-removal-and-addit.patch new file mode 100644 index 0000000..45c0366 --- /dev/null +++ b/0013-multipathd-handle-changed-wwids-by-removal-and-addit.patch @@ -0,0 +1,83 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 27 Mar 2019 23:27:47 -0500 +Subject: [PATCH] multipathd: handle changed wwids by removal and addition + +If a path's WWID changes, it's not necessarily failed. But it certainly +has to be removed from an existing map, otherwise data corruption is +imminent. Instead of keeping the path in the map, failing it, and +remembering the "changed WWID" state, this patch simply removes and +re-adds the path. + +This is patch is heavily based on the previous patch of the same name +by Martin Wilck. + +Signed-off-by: Benjamin Marzinski +--- + multipathd/main.c | 28 ++++++---------------------- + 1 file changed, 6 insertions(+), 22 deletions(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index 7a317d9..b3571d9 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1191,7 +1191,6 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + int ro, retval = 0, rc; + struct path * pp; + struct config *conf; +- int disable_changed_wwids; + int needs_reinit = 0; + + switch ((rc = change_foreign(uev->udev))) { +@@ -1209,12 +1208,6 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + break; + } + +- conf = get_multipath_config(); +- disable_changed_wwids = conf->disable_changed_wwids; +- put_multipath_config(conf); +- +- ro = uevent_get_disk_ro(uev); +- + pthread_cleanup_push(cleanup_lock, &vecs->lock); + lock(&vecs->lock); + pthread_testcancel(); +@@ -1239,22 +1232,12 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + if (rc != 0) + strcpy(pp->wwid, wwid); + else if (strncmp(wwid, pp->wwid, WWID_SIZE) != 0) { +- condlog(0, "%s: path wwid changed from '%s' to '%s'. %s", +- uev->kernel, wwid, pp->wwid, +- (disable_changed_wwids ? "disallowing" : +- "continuing")); +- strcpy(pp->wwid, wwid); +- if (disable_changed_wwids) { +- if (!pp->wwid_changed) { +- pp->wwid_changed = 1; +- pp->tick = 1; +- if (pp->mpp) +- dm_fail_path(pp->mpp->alias, pp->dev_t); +- } +- goto out; +- } ++ condlog(0, "%s: path wwid changed from '%s' to '%s'", ++ uev->kernel, wwid, pp->wwid); ++ ev_remove_path(pp, vecs, 1); ++ needs_reinit = 1; ++ goto out; + } else { +- pp->wwid_changed = 0; + udev_device_unref(pp->udev); + pp->udev = udev_device_ref(uev->udev); + conf = get_multipath_config(); +@@ -1265,6 +1248,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + pthread_cleanup_pop(1); + } + ++ ro = uevent_get_disk_ro(uev); + if (mpp && ro >= 0) { + condlog(2, "%s: update path write_protect to '%d' (uevent)", uev->kernel, ro); + +-- +2.17.2 + diff --git a/0014-multipathd-remove-wwid_changed-path-attribute.patch b/0014-multipathd-remove-wwid_changed-path-attribute.patch new file mode 100644 index 0000000..59279e5 --- /dev/null +++ b/0014-multipathd-remove-wwid_changed-path-attribute.patch @@ -0,0 +1,46 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 18 Mar 2019 13:12:34 +0100 +Subject: [PATCH] multipathd: remove "wwid_changed" path attribute + +This is now not needed any more. + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmultipath/structs.h | 1 - + multipathd/main.c | 6 ------ + 2 files changed, 7 deletions(-) + +diff --git a/libmultipath/structs.h b/libmultipath/structs.h +index b794b0d..7879d76 100644 +--- a/libmultipath/structs.h ++++ b/libmultipath/structs.h +@@ -280,7 +280,6 @@ struct path { + int fd; + int initialized; + int retriggers; +- int wwid_changed; + unsigned int path_failures; + time_t dis_reinstate_time; + int disable_reinstate; +diff --git a/multipathd/main.c b/multipathd/main.c +index b3571d9..e4f95a0 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -2001,12 +2001,6 @@ check_path (struct vectors * vecs, struct path * pp, int ticks) + if (newstate == PATH_REMOVED) + newstate = PATH_DOWN; + +- if (pp->wwid_changed) { +- condlog(2, "%s: path wwid has changed. Refusing to use", +- pp->dev); +- newstate = PATH_DOWN; +- } +- + if (newstate == PATH_WILD || newstate == PATH_UNCHECKED) { + condlog(2, "%s: unusable path (%s) - checker failed", + pp->dev, checker_state_name(newstate)); +-- +2.17.2 + diff --git a/0015-multipathd-ignore-disable_changed_wwids.patch b/0015-multipathd-ignore-disable_changed_wwids.patch new file mode 100644 index 0000000..8565203 --- /dev/null +++ b/0015-multipathd-ignore-disable_changed_wwids.patch @@ -0,0 +1,98 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 18 Mar 2019 13:12:35 +0100 +Subject: [PATCH] multipathd: ignore "disable_changed_wwids" + +This option has no effect any more. + +Signed-off-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmultipath/config.c | 1 - + libmultipath/config.h | 1 - + libmultipath/dict.c | 18 +++++++++++++++--- + multipath/multipath.conf.5 | 8 ++------ + 4 files changed, 17 insertions(+), 11 deletions(-) + +diff --git a/libmultipath/config.c b/libmultipath/config.c +index 24d71ae..141f092 100644 +--- a/libmultipath/config.c ++++ b/libmultipath/config.c +@@ -715,7 +715,6 @@ load_config (char * file) + conf->retrigger_tries = DEFAULT_RETRIGGER_TRIES; + conf->retrigger_delay = DEFAULT_RETRIGGER_DELAY; + conf->uev_wait_timeout = DEFAULT_UEV_WAIT_TIMEOUT; +- conf->disable_changed_wwids = DEFAULT_DISABLE_CHANGED_WWIDS; + conf->remove_retries = 0; + conf->ghost_delay = DEFAULT_GHOST_DELAY; + conf->all_tg_pt = DEFAULT_ALL_TG_PT; +diff --git a/libmultipath/config.h b/libmultipath/config.h +index b938c26..f5bf5b1 100644 +--- a/libmultipath/config.h ++++ b/libmultipath/config.h +@@ -182,7 +182,6 @@ struct config { + int delayed_reconfig; + int uev_wait_timeout; + int skip_kpartx; +- int disable_changed_wwids; + int remove_retries; + int max_sectors_kb; + int ghost_delay; +diff --git a/libmultipath/dict.c b/libmultipath/dict.c +index eaad4f1..96815f8 100644 +--- a/libmultipath/dict.c ++++ b/libmultipath/dict.c +@@ -156,6 +156,12 @@ out: + return len; + } + ++static int ++print_ignored (char *buff, int len) ++{ ++ return snprintf(buff, len, "ignored"); ++} ++ + static int + print_yes_no (char *buff, int len, long v) + { +@@ -548,9 +554,15 @@ declare_hw_handler(skip_kpartx, set_yes_no_undef) + declare_hw_snprint(skip_kpartx, print_yes_no_undef) + declare_mp_handler(skip_kpartx, set_yes_no_undef) + declare_mp_snprint(skip_kpartx, print_yes_no_undef) +- +-declare_def_handler(disable_changed_wwids, set_yes_no) +-declare_def_snprint(disable_changed_wwids, print_yes_no) ++static int def_disable_changed_wwids_handler(struct config *conf, vector strvec) ++{ ++ return 0; ++} ++static int snprint_def_disable_changed_wwids(struct config *conf, char *buff, ++ int len, const void *data) ++{ ++ return print_ignored(buff, len); ++} + + declare_def_handler(remove_retries, set_int) + declare_def_snprint(remove_retries, print_int) +diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 +index 864d7eb..646c156 100644 +--- a/multipath/multipath.conf.5 ++++ b/multipath/multipath.conf.5 +@@ -1148,12 +1148,8 @@ The default is: \fBno\fR + . + .TP + .B disable_changed_wwids +-If set to \fIyes\fR, multipathd will check the path wwid on change events, and +-if it has changed from the wwid of the multipath device, multipathd will +-disable access to the path until the wwid changes back. +-.RS +-.TP +-The default is: \fBno\fR ++This option is deprecated and ignored. If the WWID of a path suddenly changes, ++multipathd handles it as if it was removed and then added again. + .RE + . + . +-- +2.17.2 + diff --git a/0016-multipathd-Don-t-use-fallback-code-after-getting-wwi.patch b/0016-multipathd-Don-t-use-fallback-code-after-getting-wwi.patch new file mode 100644 index 0000000..61e0f0d --- /dev/null +++ b/0016-multipathd-Don-t-use-fallback-code-after-getting-wwi.patch @@ -0,0 +1,135 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 28 Mar 2019 15:17:48 -0500 +Subject: [PATCH] multipathd: Don't use fallback code after getting wwid + +The fallback code is necessary to set up mutipath devices, if multipath +temporarily can't get the information from udev. However, once the +devices are set up, udev is the definitive source of this information. + +The wwid gotten from the fallback code and the udev code should always +be the same, in which case it doesn't matter where we get the wwid +from. But if they are different, it's important to try to do the +right thing. + +Working under the assumption that udev will either never give us this +information, or that it usually will. multipath should assume that if +there are multiple paths to a device, either they will all never get +a wwid from udev, or some of them will likely already have gotten the +correct wwid from udev. In this case, we should fix this as soon as +possible. + +This does mean that devices where udev will never give out the uuid +will not notice if the wwid changes, but that's a small price to pay +for doing the right thing most of the time. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/discovery.c | 22 +++++++++------------- + libmultipath/discovery.h | 3 ++- + multipathd/main.c | 2 +- + 3 files changed, 12 insertions(+), 15 deletions(-) + +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index 3ec60d6..744cf2c 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -1763,7 +1763,6 @@ static ssize_t uid_fallback(struct path *pp, int path_state, + !strcmp(pp->uid_attribute, DEFAULT_UID_ATTRIBUTE)) { + len = get_vpd_uid(pp); + *origin = "sysfs"; +- pp->uid_attribute = NULL; + if (len < 0 && path_state == PATH_UP) { + condlog(1, "%s: failed to get sysfs uid: %s", + pp->dev, strerror(-len)); +@@ -1787,7 +1786,6 @@ static ssize_t uid_fallback(struct path *pp, int path_state, + len = WWID_SIZE; + } + *origin = "sysfs"; +- pp->uid_attribute = NULL; + } + return len; + } +@@ -1800,12 +1798,14 @@ static int has_uid_fallback(struct path *pp) + } + + int +-get_uid (struct path * pp, int path_state, struct udev_device *udev) ++get_uid (struct path * pp, int path_state, struct udev_device *udev, ++ int allow_fallback) + { + char *c; + const char *origin = "unknown"; + ssize_t len = 0; + struct config *conf; ++ int used_fallback = 0; + + if (!pp->uid_attribute && !pp->getuid) { + conf = get_multipath_config(); +@@ -1846,14 +1846,9 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev) + len = get_vpd_uid(pp); + origin = "sysfs"; + } +- if (len <= 0 && has_uid_fallback(pp)) { +- int retrigger_tries; +- +- conf = get_multipath_config(); +- retrigger_tries = conf->retrigger_tries; +- put_multipath_config(conf); +- if (pp->retriggers >= retrigger_tries) +- len = uid_fallback(pp, path_state, &origin); ++ if (len <= 0 && allow_fallback && has_uid_fallback(pp)) { ++ used_fallback = 1; ++ len = uid_fallback(pp, path_state, &origin); + } + } + if ( len < 0 ) { +@@ -1870,7 +1865,7 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev) + c--; + } + } +- condlog(3, "%s: uid = %s (%s)", pp->dev, ++ condlog((used_fallback)? 1 : 3, "%s: uid = %s (%s)", pp->dev, + *pp->wwid == '\0' ? "" : pp->wwid, origin); + return 0; + } +@@ -1994,7 +1989,8 @@ int pathinfo(struct path *pp, struct config *conf, int mask) + } + + if ((mask & DI_WWID) && !strlen(pp->wwid)) { +- get_uid(pp, path_state, pp->udev); ++ get_uid(pp, path_state, pp->udev, ++ (pp->retriggers >= conf->retrigger_tries)); + if (!strlen(pp->wwid)) { + if (pp->bus == SYSFS_BUS_UNDEF) + return PATHINFO_SKIPPED; +diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h +index 9aacf75..8fd126b 100644 +--- a/libmultipath/discovery.h ++++ b/libmultipath/discovery.h +@@ -52,7 +52,8 @@ ssize_t sysfs_get_vpd (struct udev_device * udev, int pg, unsigned char * buff, + size_t len); + int sysfs_get_asymmetric_access_state(struct path *pp, + char *buff, int buflen); +-int get_uid(struct path * pp, int path_state, struct udev_device *udev); ++int get_uid(struct path * pp, int path_state, struct udev_device *udev, ++ int allow_fallback); + + /* + * discovery bitmask +diff --git a/multipathd/main.c b/multipathd/main.c +index e4f95a0..1413c6d 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1227,7 +1227,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + goto out; + + strcpy(wwid, pp->wwid); +- rc = get_uid(pp, pp->state, uev->udev); ++ rc = get_uid(pp, pp->state, uev->udev, 0); + + if (rc != 0) + strcpy(pp->wwid, wwid); +-- +2.17.2 + diff --git a/0017-libmultipath-silence-dm_is_mpath-error-messages.patch b/0017-libmultipath-silence-dm_is_mpath-error-messages.patch new file mode 100644 index 0000000..203ed74 --- /dev/null +++ b/0017-libmultipath-silence-dm_is_mpath-error-messages.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 28 Mar 2019 17:49:38 -0500 +Subject: [PATCH] libmultipath: silence dm_is_mpath error messages + +When "multipath -F" is run, dm_is_mpath was printing error messages +about partition devices, because they had already been removed, when +it checked. Lower the error logging level so this doesn't happen on +the default verbosity. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/devmapper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c +index 3294bd4..2e79667 100644 +--- a/libmultipath/devmapper.c ++++ b/libmultipath/devmapper.c +@@ -746,7 +746,7 @@ out_task: + dm_task_destroy(dmt); + out: + if (r < 0) +- condlog(2, "%s: dm command failed in %s", name, __FUNCTION__); ++ condlog(3, "%s: dm command failed in %s: %s", name, __FUNCTION__, strerror(errno)); + return r; + } + +-- +2.17.2 + diff --git a/0008-RH-fixup-udev-rules-for-redhat.patch b/0018-RH-fixup-udev-rules-for-redhat.patch similarity index 100% rename from 0008-RH-fixup-udev-rules-for-redhat.patch rename to 0018-RH-fixup-udev-rules-for-redhat.patch diff --git a/0009-RH-Remove-the-property-blacklist-exception-builtin.patch b/0019-RH-Remove-the-property-blacklist-exception-builtin.patch similarity index 97% rename from 0009-RH-Remove-the-property-blacklist-exception-builtin.patch rename to 0019-RH-Remove-the-property-blacklist-exception-builtin.patch index e4aa8c3..81c12b9 100644 --- a/0009-RH-Remove-the-property-blacklist-exception-builtin.patch +++ b/0019-RH-Remove-the-property-blacklist-exception-builtin.patch @@ -49,10 +49,10 @@ index e0d0279..556c0b9 100644 udev_device_get_properties_list_entry(udev)) { diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 -index 0fe8461..ad653a8 100644 +index 646c156..768ab83 100644 --- a/multipath/multipath.conf.5 +++ b/multipath/multipath.conf.5 -@@ -1239,16 +1239,14 @@ keywords. Both are regular expressions. For a full description of these keywords +@@ -1235,16 +1235,14 @@ keywords. Both are regular expressions. For a full description of these keywords Regular expression for an udev property. All devices that have matching udev properties will be excluded/included. The handling of the \fIproperty\fR keyword is special, diff --git a/0010-RH-don-t-start-without-a-config-file.patch b/0020-RH-don-t-start-without-a-config-file.patch similarity index 97% rename from 0010-RH-don-t-start-without-a-config-file.patch rename to 0020-RH-don-t-start-without-a-config-file.patch index a5b206b..d840c33 100644 --- a/0010-RH-don-t-start-without-a-config-file.patch +++ b/0020-RH-don-t-start-without-a-config-file.patch @@ -20,7 +20,7 @@ Signed-off-by: Benjamin Marzinski 5 files changed, 20 insertions(+) diff --git a/libmultipath/config.c b/libmultipath/config.c -index 24d71ae..9b6d71e 100644 +index 141f092..544d2fb 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c @@ -26,6 +26,7 @@ @@ -31,7 +31,7 @@ index 24d71ae..9b6d71e 100644 static int hwe_strmatch (const struct hwentry *hwe1, const struct hwentry *hwe2) -@@ -746,6 +747,20 @@ load_config (char * file) +@@ -745,6 +746,20 @@ load_config (char * file) goto out; } factorize_hwtable(conf->hwtable, builtin_hwtable_size, file); @@ -53,7 +53,7 @@ index 24d71ae..9b6d71e 100644 conf->processed_main_config = 1; diff --git a/libmultipath/config.h b/libmultipath/config.h -index b938c26..a871a95 100644 +index f5bf5b1..8803967 100644 --- a/libmultipath/config.h +++ b/libmultipath/config.h @@ -9,6 +9,7 @@ diff --git a/0011-RH-use-rpm-optflags-if-present.patch b/0021-RH-use-rpm-optflags-if-present.patch similarity index 100% rename from 0011-RH-use-rpm-optflags-if-present.patch rename to 0021-RH-use-rpm-optflags-if-present.patch diff --git a/0012-RH-add-mpathconf.patch b/0022-RH-add-mpathconf.patch similarity index 99% rename from 0012-RH-add-mpathconf.patch rename to 0022-RH-add-mpathconf.patch index db4e652..afa2761 100644 --- a/0012-RH-add-mpathconf.patch +++ b/0022-RH-add-mpathconf.patch @@ -21,10 +21,10 @@ Signed-off-by: Benjamin Marzinski create mode 100644 multipath/mpathconf.8 diff --git a/libmultipath/config.c b/libmultipath/config.c -index 9b6d71e..be40bbf 100644 +index 544d2fb..deb80c2 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c -@@ -749,6 +749,8 @@ load_config (char * file) +@@ -748,6 +748,8 @@ load_config (char * file) factorize_hwtable(conf->hwtable, builtin_hwtable_size, file); } else { condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices."); diff --git a/0013-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch b/0023-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch similarity index 99% rename from 0013-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch rename to 0023-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch index b1651d7..86bb2db 100644 --- a/0013-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch +++ b/0023-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch @@ -86,7 +86,7 @@ index 0c6ee54..e32a0b0 100644 enum { WWID_IS_NOT_FAILED = 0, diff --git a/multipath/main.c b/multipath/main.c -index 5abb118..1481e7f 100644 +index 69141db..e7771c0 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -133,7 +133,7 @@ usage (char * progname) diff --git a/0014-RH-warn-on-invalid-regex-instead-of-failing.patch b/0024-RH-warn-on-invalid-regex-instead-of-failing.patch similarity index 93% rename from 0014-RH-warn-on-invalid-regex-instead-of-failing.patch rename to 0024-RH-warn-on-invalid-regex-instead-of-failing.patch index db670a3..ded4ccb 100644 --- a/0014-RH-warn-on-invalid-regex-instead-of-failing.patch +++ b/0024-RH-warn-on-invalid-regex-instead-of-failing.patch @@ -16,7 +16,7 @@ Signed-off-by: Benjamin Marzinski 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/libmultipath/dict.c b/libmultipath/dict.c -index eaad4f1..95ae09b 100644 +index 96815f8..3b1b652 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -58,6 +58,21 @@ set_str(vector strvec, void *ptr) @@ -41,7 +41,7 @@ index eaad4f1..95ae09b 100644 static int set_yes_no(vector strvec, void *ptr) { -@@ -1374,7 +1389,7 @@ ble_ ## option ## _handler (struct config *conf, vector strvec) \ +@@ -1386,7 +1401,7 @@ ble_ ## option ## _handler (struct config *conf, vector strvec) \ if (!conf->option) \ return 1; \ \ @@ -50,7 +50,7 @@ index eaad4f1..95ae09b 100644 if (!buff) \ return 1; \ \ -@@ -1390,7 +1405,7 @@ ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \ +@@ -1402,7 +1417,7 @@ ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \ if (!conf->option) \ return 1; \ \ @@ -59,7 +59,7 @@ index eaad4f1..95ae09b 100644 if (!buff) \ return 1; \ \ -@@ -1493,16 +1508,16 @@ device_handler(struct config *conf, vector strvec) +@@ -1505,16 +1520,16 @@ device_handler(struct config *conf, vector strvec) return 0; } diff --git a/0015-RH-reset-default-find_mutipaths-value-to-off.patch b/0025-RH-reset-default-find_mutipaths-value-to-off.patch similarity index 100% rename from 0015-RH-reset-default-find_mutipaths-value-to-off.patch rename to 0025-RH-reset-default-find_mutipaths-value-to-off.patch diff --git a/0016-RH-Fix-nvme-compilation-warning.patch b/0026-RH-Fix-nvme-compilation-warning.patch similarity index 100% rename from 0016-RH-Fix-nvme-compilation-warning.patch rename to 0026-RH-Fix-nvme-compilation-warning.patch diff --git a/0027-Fix-systemd-version-detection.patch b/0027-Fix-systemd-version-detection.patch new file mode 100644 index 0000000..7414638 --- /dev/null +++ b/0027-Fix-systemd-version-detection.patch @@ -0,0 +1,27 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Igor Gnatenko +Date: Tue, 26 Mar 2019 16:34:32 -0500 +Subject: [PATCH] Fix systemd version detection + +Signed-off-by: Igor Gnatenko +Signed-off-by: Benjamin Marzinski +--- + Makefile.inc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.inc b/Makefile.inc +index b98800a..da49852 100644 +--- a/Makefile.inc ++++ b/Makefile.inc +@@ -37,7 +37,7 @@ endif + + ifndef SYSTEMD + ifeq ($(shell systemctl --version > /dev/null 2>&1 && echo 1), 1) +- SYSTEMD = $(shell systemctl --version 2> /dev/null | sed -n 's/systemd \([0-9]*\)/\1/p') ++ SYSTEMD = $(shell systemctl --version 2> /dev/null | sed -n 's/systemd \([0-9]*\).*/\1/p') + endif + endif + +-- +2.17.2 + diff --git a/device-mapper-multipath-fix-systemd-detection.diff b/device-mapper-multipath-fix-systemd-detection.diff deleted file mode 100644 index 57fa3cb..0000000 --- a/device-mapper-multipath-fix-systemd-detection.diff +++ /dev/null @@ -1,12 +0,0 @@ -diff -uNr multipath-tools-2df6110.orig/Makefile.inc multipath-tools-2df6110/Makefile.inc ---- multipath-tools-2df6110.orig/Makefile.inc 2019-02-18 00:03:30.709950703 +0100 -+++ multipath-tools-2df6110/Makefile.inc 2019-02-18 00:07:53.603837498 +0100 -@@ -37,7 +37,7 @@ - - ifndef SYSTEMD - ifeq ($(shell systemctl --version > /dev/null 2>&1 && echo 1), 1) -- SYSTEMD = $(shell systemctl --version 2> /dev/null | sed -n 's/systemd \([0-9]*\)/\1/p') -+ SYSTEMD = $(shell systemctl --version 2> /dev/null | sed -n 's/systemd \([0-9]*\).*/\1/p') - endif - endif - diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index 310f8f9..d923a0b 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,6 +1,6 @@ Name: device-mapper-multipath -Version: 0.7.9 -Release: 6.git2df6110%{?dist} +Version: 0.8.0 +Release: 1%{?dist} Summary: Tools to manage multipath devices using device-mapper License: GPLv2 URL: http://christophe.varoqui.free.fr/ @@ -8,26 +8,35 @@ URL: http://christophe.varoqui.free.fr/ # The source for this package was pulled from upstream's git repo. Use the # following command to generate the tarball # curl "https://git.opensvc.com/?p=multipath-tools/.git;a=snapshot;h=17a6101;sf=tgz" -o multipath-tools-17a6101.tgz -Source0: multipath-tools-2df6110.tgz +Source0: multipath-tools-0.8.0.tgz Source1: multipath.conf Patch0001: 0001-BZ-1668693-disable-user_friendly_names-for-NetApp.patch Patch0002: 0002-libmultipath-handle-existing-paths-in-marginal_path-.patch Patch0003: 0003-multipathd-cleanup-marginal-paths-checking-timers.patch Patch0004: 0004-libmultipath-fix-marginal-paths-queueing-errors.patch Patch0005: 0005-libmultipath-fix-marginal_paths-nr_active-check.patch -Patch0006: 0006-multipathd-avoid-null-pointer-dereference-in-LOG_MSG.patch -Patch0007: 0007-multipath-blacklist-zram-devices.patch -Patch0008: 0008-RH-fixup-udev-rules-for-redhat.patch -Patch0009: 0009-RH-Remove-the-property-blacklist-exception-builtin.patch -Patch0010: 0010-RH-don-t-start-without-a-config-file.patch -Patch0011: 0011-RH-use-rpm-optflags-if-present.patch -Patch0012: 0012-RH-add-mpathconf.patch -Patch0013: 0013-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch -Patch0014: 0014-RH-warn-on-invalid-regex-instead-of-failing.patch -Patch0015: 0015-RH-reset-default-find_mutipaths-value-to-off.patch -Patch0016: 0016-RH-Fix-nvme-compilation-warning.patch - -Patch100: device-mapper-multipath-fix-systemd-detection.diff +Patch0006: 0006-multipathd-Fix-miscounting-active-paths.patch +Patch0007: 0007-multipathd-ignore-failed-wwid-recheck.patch +Patch0008: 0008-libmutipath-continue-to-use-old-state-on-PATH_PENDIN.patch +Patch0009: 0009-multipathd-use-update_path_groups-instead-of-reload_.patch +Patch0010: 0010-multipath.conf-add-missing-options-to-man-page.patch +Patch0011: 0011-libmultipath-add-get_uid-fallback-code-for-NVMe-devi.patch +Patch0012: 0012-libmulitpath-cleanup-uid_fallback-code.patch +Patch0013: 0013-multipathd-handle-changed-wwids-by-removal-and-addit.patch +Patch0014: 0014-multipathd-remove-wwid_changed-path-attribute.patch +Patch0015: 0015-multipathd-ignore-disable_changed_wwids.patch +Patch0016: 0016-multipathd-Don-t-use-fallback-code-after-getting-wwi.patch +Patch0017: 0017-libmultipath-silence-dm_is_mpath-error-messages.patch +Patch0018: 0018-RH-fixup-udev-rules-for-redhat.patch +Patch0019: 0019-RH-Remove-the-property-blacklist-exception-builtin.patch +Patch0020: 0020-RH-don-t-start-without-a-config-file.patch +Patch0021: 0021-RH-use-rpm-optflags-if-present.patch +Patch0022: 0022-RH-add-mpathconf.patch +Patch0023: 0023-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch +Patch0024: 0024-RH-warn-on-invalid-regex-instead-of-failing.patch +Patch0025: 0025-RH-reset-default-find_mutipaths-value-to-off.patch +Patch0026: 0026-RH-Fix-nvme-compilation-warning.patch +Patch0027: 0027-Fix-systemd-version-detection.patch # runtime Requires: %{name}-libs = %{version}-%{release} @@ -110,7 +119,7 @@ This package contains the files needed to develop applications that use device-mapper-multipath's libdmmp C API library %prep -%autosetup -n multipath-tools-2df6110 -p1 +%autosetup -n multipath-tools-0.8.0 -p1 cp %{SOURCE1} . %build @@ -222,6 +231,29 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog +* Thu Apr 4 2019 Benjamin Marzinski - 0.8.0-1 +- Update Source to upstream version 0.8.0 + * Previous patches 0006 & 0007 are included in this commit +- Rename files + * Previous patches 0008-0016 & 0100 are now patches 0018-0027 +- Add 0006-multipathd-Fix-miscounting-active-paths.patch +- Add 0007-multipathd-ignore-failed-wwid-recheck.patch + * multipathd will no longer disable paths if it is unable to + get their wwid on a change event +- Add 0008-libmutipath-continue-to-use-old-state-on-PATH_PENDIN.patch +- Add 0009-multipathd-use-update_path_groups-instead-of-reload_.patch +- Add 0010-multipath.conf-add-missing-options-to-man-page.patch +- Add 0011-libmultipath-add-get_uid-fallback-code-for-NVMe-devi.patch +- Add 0012-libmulitpath-cleanup-uid_fallback-code.patch +- Add 0013-multipathd-handle-changed-wwids-by-removal-and-addit.patch + * if a path device changes wwid, it will now be removed and re-added + to the correct multipath device. +- Add 0014-multipathd-remove-wwid_changed-path-attribute.patch +- Add 0015-multipathd-ignore-disable_changed_wwids.patch +- Add 0016-multipathd-Don-t-use-fallback-code-after-getting-wwi.patch +- Add 0017-libmultipath-silence-dm_is_mpath-error-messages.patch + * The above 12 patches have been submitted upstream + * Sun Feb 17 2019 Igor Gnatenko - 0.7.9-6.git2df6110 - Rebuild for readline 8.0 diff --git a/sources b/sources index 1ea65ab..3be9e67 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (multipath-tools-2df6110.tgz) = 5083e95157d2a978c8f5ed234b9c0fa4eced7bce7d4f28d82479b4fc504fc74b4f00ec78ec0a830a44df01de76a40d33af41bedb0731be2afaccfda1fb9e7d0b +SHA512 (multipath-tools-0.8.0.tgz) = e2ed6936f76da8b703babea22b6b02be19abea3ba55105a13596f306e483c453d105316c2416027be3524e49834ea27ff745963e86e933ffe4c9ee729a2371ba SHA512 (multipath.conf) = 71953dce5a68adcf60a942305f5a66023e6f4c4baf53b1bfdb4edf65ed5b8e03db804363c36d1dcfd85591f4766f52b515269904c53b84d7b076da0b80b09942