diff --git a/SOURCES/0073-multipath.conf-fix-typo-in-checker_timeout-descripti.patch b/SOURCES/0073-multipath.conf-fix-typo-in-checker_timeout-descripti.patch new file mode 100644 index 0000000..849186f --- /dev/null +++ b/SOURCES/0073-multipath.conf-fix-typo-in-checker_timeout-descripti.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 15 Jul 2021 14:48:15 -0500 +Subject: [PATCH] multipath.conf: fix typo in checker_timeout description + +Signed-off-by: Benjamin Marzinski +--- + multipath/multipath.conf.5 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 +index 6da15aad..0c04c7e4 100644 +--- a/multipath/multipath.conf.5 ++++ b/multipath/multipath.conf.5 +@@ -638,7 +638,7 @@ Specify the timeout to use for path checkers and prioritizers, in seconds. + Only prioritizers that issue scsi commands use checker_timeout. Checkers + that support an asynchronous mode (\fItur\fR and \fIdirectio\fR), will + return shortly after being called by multipathd, regardless of whether the +-storage array responds. If the storage array hasn't responded, mulitpathd will ++storage array responds. If the storage array hasn't responded, multipathd will + check for a response every second, until \fIchecker_timeout\fR seconds have + elapsed. + .RS diff --git a/SOURCES/0074-mpathpersist-fail-commands-when-no-usable-paths-exis.patch b/SOURCES/0074-mpathpersist-fail-commands-when-no-usable-paths-exis.patch new file mode 100644 index 0000000..0834837 --- /dev/null +++ b/SOURCES/0074-mpathpersist-fail-commands-when-no-usable-paths-exis.patch @@ -0,0 +1,41 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Thu, 22 Jul 2021 17:48:06 -0500 +Subject: [PATCH] mpathpersist: fail commands when no usable paths exist + +"mpathpersist -oCK " will return success if it +is run on devices with no usable paths, but nothing is actually done. +The -L command will fail, but it should give up sooner, and with a more +helpful error message. + +Signed-off-by: Benjamin Marzinski +--- + libmpathpersist/mpath_persist.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c +index 07a5f17f..d0744773 100644 +--- a/libmpathpersist/mpath_persist.c ++++ b/libmpathpersist/mpath_persist.c +@@ -629,7 +629,8 @@ int mpath_prout_common(struct multipath *mpp,int rq_servact, int rq_scope, + return ret ; + } + } +- return MPATH_PR_SUCCESS; ++ condlog (0, "%s: no path available", mpp->wwid); ++ return MPATH_PR_DMMP_ERROR; + } + + int send_prout_activepath(char * dev, int rq_servact, int rq_scope, +@@ -688,6 +689,11 @@ int mpath_prout_rel(struct multipath *mpp,int rq_servact, int rq_scope, + + active_pathcount = pathcount (mpp, PATH_UP) + pathcount (mpp, PATH_GHOST); + ++ if (active_pathcount == 0) { ++ condlog (0, "%s: no path available", mpp->wwid); ++ return MPATH_PR_DMMP_ERROR; ++ } ++ + struct threadinfo thread[active_pathcount]; + memset(thread, 0, sizeof(thread)); + for (i = 0; i < active_pathcount; i++){ diff --git a/SOURCES/0075-multipath-print-warning-if-multipathd-is-not-running.patch b/SOURCES/0075-multipath-print-warning-if-multipathd-is-not-running.patch new file mode 100644 index 0000000..3c42a01 --- /dev/null +++ b/SOURCES/0075-multipath-print-warning-if-multipathd-is-not-running.patch @@ -0,0 +1,107 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Fri, 16 Jul 2021 12:39:17 -0500 +Subject: [PATCH] multipath: print warning if multipathd is not running. + +If multipath notices that multipath devices exist or were created, and +multipathd is not running, it now prints a warning message, so users are +notified of the issue. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 13 +++++++++++-- + libmultipath/configure.h | 1 + + multipath/main.c | 5 +++++ + 3 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index f24d9283..9c8d3e34 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -1043,7 +1043,8 @@ deadmap (struct multipath * mpp) + return 1; /* dead */ + } + +-int check_daemon(void) ++extern int ++check_daemon(void) + { + int fd; + char *reply; +@@ -1097,6 +1098,8 @@ int coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid, + struct config *conf; + int allow_queueing; + uint64_t *size_mismatch_seen; ++ bool map_processed = false; ++ bool no_daemon = false; + + /* ignore refwwid if it's empty */ + if (refwwid && !strlen(refwwid)) +@@ -1239,7 +1242,9 @@ int coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid, + conf = get_multipath_config(); + allow_queueing = conf->allow_queueing; + put_multipath_config(conf); +- if (!is_daemon && !allow_queueing && !check_daemon()) { ++ if (!is_daemon && !allow_queueing && ++ (no_daemon || !check_daemon())) { ++ no_daemon = true; + if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF && + mpp->no_path_retry != NO_PATH_RETRY_FAIL) + condlog(3, "%s: multipathd not running, unset " +@@ -1267,6 +1272,7 @@ int coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid, + else + remove_map(mpp, vecs, 0); + } ++ map_processed = true; + } + /* + * Flush maps with only dead paths (ie not in sysfs) +@@ -1292,6 +1298,9 @@ int coalesce_paths (struct vectors * vecs, vector newmp, char * refwwid, + condlog(2, "%s: remove (dead)", alias); + } + } ++ if (map_processed && !is_daemon && (no_daemon || !check_daemon())) ++ condlog(2, "multipath devices exist, but multipathd service is not running"); ++ + ret = CP_OK; + out: + free(size_mismatch_seen); +diff --git a/libmultipath/configure.h b/libmultipath/configure.h +index 81090dd4..8a266d31 100644 +--- a/libmultipath/configure.h ++++ b/libmultipath/configure.h +@@ -59,3 +59,4 @@ struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type); + void trigger_paths_udev_change(struct multipath *mpp, bool is_mpath); + void trigger_partitions_udev_change(struct udev_device *dev, const char *action, + int len); ++int check_daemon(void); +diff --git a/multipath/main.c b/multipath/main.c +index 607cada2..14d045c9 100644 +--- a/multipath/main.c ++++ b/multipath/main.c +@@ -254,6 +254,7 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector pathvec, char * refwwid) + int i; + struct multipath * mpp; + char params[PARAMS_SIZE], status[PARAMS_SIZE]; ++ bool maps_present = false; + + if (dm_get_maps(curmp)) + return 1; +@@ -302,6 +303,8 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector pathvec, char * refwwid) + + if (cmd == CMD_CREATE) + reinstate_paths(mpp); ++ ++ maps_present = true; + } + + if (cmd == CMD_LIST_SHORT || cmd == CMD_LIST_LONG) { +@@ -311,6 +314,8 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector pathvec, char * refwwid) + put_multipath_config(conf); + } + ++ if (maps_present && !check_daemon()) ++ condlog(2, "multipath devices exist, but multipathd service is not running"); + return 0; + } + diff --git a/SOURCES/0076-multipathd-don-t-access-path-if-it-was-deleted.patch b/SOURCES/0076-multipathd-don-t-access-path-if-it-was-deleted.patch new file mode 100644 index 0000000..88aa305 --- /dev/null +++ b/SOURCES/0076-multipathd-don-t-access-path-if-it-was-deleted.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Fri, 23 Jul 2021 14:10:06 -0500 +Subject: [PATCH] multipathd: don't access path if it was deleted + +ev_remove_path() could fail and still delete the path. This could cause +problems for handle_path_wwid_change(), which expected that a failure +meant that the path still existed. ev_remove_path now returns a +different error code for failure to reload the multipath device, so that +it can be differentiated from cases where the path was no removed. + +Signed-off-by: Benjamin Marzinski +--- + multipathd/main.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index e6c19ab2..823b53a2 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -86,6 +86,9 @@ + #define FILE_NAME_SIZE 256 + #define CMDSIZE 160 + ++#define PATH_REMOVE_FAILED 1 ++#define MAP_RELOAD_FAILED 2 ++ + #define LOG_MSG(lvl, verb, pp) \ + do { \ + if (pp->mpp && checker_selected(&pp->checker) && \ +@@ -840,7 +843,7 @@ handle_path_wwid_change(struct path *pp, struct vectors *vecs) + return; + + udd = udev_device_ref(pp->udev); +- if (ev_remove_path(pp, vecs, 1) != 0 && pp->mpp) { ++ if (ev_remove_path(pp, vecs, 1) == PATH_REMOVE_FAILED && pp->mpp) { + pp->dmstate = PSTATE_FAILED; + dm_fail_path(pp->mpp->alias, pp->dev_t); + } +@@ -1226,13 +1229,13 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + condlog(0, "%s: failed in domap for " + "removal of path %s", + mpp->alias, pp->dev); +- retval = 1; ++ retval = MAP_RELOAD_FAILED; + } else { + /* + * update our state from kernel + */ + if (setup_multipath(vecs, mpp)) +- return 1; ++ return PATH_REMOVE_FAILED; + sync_map_state(mpp); + + condlog(2, "%s [%s]: path removed from map %s", +@@ -1250,7 +1253,7 @@ out: + + fail: + remove_map_and_stop_waiter(mpp, vecs); +- return 1; ++ return PATH_REMOVE_FAILED; + } + + static int diff --git a/SPECS/device-mapper-multipath.spec b/SPECS/device-mapper-multipath.spec index 103259d..88faf9d 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.8.4 -Release: 14%{?dist} +Release: 17%{?dist} License: GPLv2 Group: System Environment/Base URL: http://christophe.varoqui.free.fr/ @@ -83,6 +83,10 @@ Patch00069: 0069-RH-make-parse_vpd_pg83-match-scsi_id-output.patch Patch00070: 0070-multipathd-improve-getting-parent-udevice-in-rescan_.patch Patch00071: 0071-multipathd-don-t-trigger-uevent-for-partitions-on-ww.patch Patch00072: 0072-RH-mpathconf-correctly-handle-spaces-after-option-na.patch +Patch00073: 0073-multipath.conf-fix-typo-in-checker_timeout-descripti.patch +Patch00074: 0074-mpathpersist-fail-commands-when-no-usable-paths-exis.patch +Patch00075: 0075-multipath-print-warning-if-multipathd-is-not-running.patch +Patch00076: 0076-multipathd-don-t-access-path-if-it-was-deleted.patch # runtime Requires: %{name}-libs = %{version}-%{release} @@ -284,6 +288,23 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog +* Fri Jul 23 2021 Benjamin Marzinski 0.8.4-17 +- Add 0074-mpathpersist-fail-commands-when-no-usable-paths-exis.patch + * Fixes bz #1984723 +- Add 0075-multipath-print-warning-if-multipathd-is-not-running.patch + * Fixes bz #1973592 +- Add 0076-multipathd-don-t-access-path-if-it-was-deleted.patch + * Found by coverity +- Resolves: bz #1973592, #1984723 + +* Thu Jul 22 2021 Benjamin Marzinski 0.8.4-16 +- Add missing patch +- Related: bz #1982598 + +* Thu Jul 22 2021 Benjamin Marzinski 0.8.4-15 +- Add 0073-multipath.conf-fix-typo-in-checker_timeout-descripti.patch +- Resolves: bz #1982598 + * Mon Jul 12 2021 Benjamin Marzinski 0.8.4-14 - Add 0072-RH-mpathconf-correctly-handle-spaces-after-option-na.patch - Resolves: bz #1979470