From c64a48b95f7e2e6601fd6472b753770a384a9f9b Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 1 Jul 2021 15:23:09 -0500 Subject: [PATCH] device-mapper-multipath-0.8.6-2 Pull in latest upstream post-tag commits * Patches 0001-0015 are from https://github.com/openSUSE/multipath-tools/tree/queue and are already queued for upstream Rename files * Previous patches 0001-0010 and now patches 0016-0025 --- ...-memory-leak-in-checker_cleanup_thre.patch | 32 ++ ...x-compilation-issue-with-liburcu-0.8.patch | 85 +++++ ...-fail-to-remove-path-once-the-map-is.patch | 70 ++++ ...e-duplicate-orphan_paths-in-flush_ma.patch | 27 ++ ...-ev_remove_path-return-code-handling.patch | 226 ++++++++++++ ...-multipath-free-vectors-in-configure.patch | 47 +++ ...ak-memory-when-getblock-returns-NULL.patch | 28 ++ ...-rescan_path-on-wwid-change-in-uev_u.patch | 28 ++ ...andlers-cleanup-setting-reply-length.patch | 82 +++++ ...ipathd-cli_getprkey-fix-return-value.patch | 53 +++ ...path-tools-enable-Wformat-overflow-2.patch | 64 ++++ ...LD_BUILD_TIMESTAMP-when-building-man.patch | 347 ++++++++++++++++++ ...add-info-about-HPE-Alletra-6000-and-.patch | 52 +++ ...multipathd-don-t-start-in-containers.patch | 32 ++ ...fix-build-without-LIBDM_API_DEFERRED.patch | 59 +++ ... 0016-RH-fixup-udev-rules-for-redhat.patch | 2 +- ...property-blacklist-exception-builtin.patch | 0 ...RH-don-t-start-without-a-config-file.patch | 2 +- ...H-Fix-nvme-function-missing-argument.patch | 0 ... 0020-RH-use-rpm-optflags-if-present.patch | 11 +- ...hconf.patch => 0021-RH-add-mpathconf.patch | 0 ...om-kernel-cmdline-mpath.wwids-with-A.patch | 12 +- ...-default-find_mutipaths-value-to-off.patch | 0 ...empt-to-get-ANA-info-via-sysfs-first.patch | 0 ...-parse_vpd_pg83-match-scsi_id-output.patch | 2 +- device-mapper-multipath.spec | 45 ++- 26 files changed, 1281 insertions(+), 25 deletions(-) create mode 100644 0001-libmultipath-fix-memory-leak-in-checker_cleanup_thre.patch create mode 100644 0002-multipathd-fix-compilation-issue-with-liburcu-0.8.patch create mode 100644 0003-multipathd-don-t-fail-to-remove-path-once-the-map-is.patch create mode 100644 0004-multipathd-remove-duplicate-orphan_paths-in-flush_ma.patch create mode 100644 0005-multipathd-fix-ev_remove_path-return-code-handling.patch create mode 100644 0006-multipath-free-vectors-in-configure.patch create mode 100644 0007-kpartx-Don-t-leak-memory-when-getblock-returns-NULL.patch create mode 100644 0008-multipathd-don-t-rescan_path-on-wwid-change-in-uev_u.patch create mode 100644 0009-multipathd-cli_handlers-cleanup-setting-reply-length.patch create mode 100644 0010-multipathd-cli_getprkey-fix-return-value.patch create mode 100644 0011-multipath-tools-enable-Wformat-overflow-2.patch create mode 100644 0012-libdmmp-use-KBUILD_BUILD_TIMESTAMP-when-building-man.patch create mode 100644 0013-multipath-tools-add-info-about-HPE-Alletra-6000-and-.patch create mode 100644 0014-multipathd-don-t-start-in-containers.patch create mode 100644 0015-libmultipath-fix-build-without-LIBDM_API_DEFERRED.patch rename 0001-RH-fixup-udev-rules-for-redhat.patch => 0016-RH-fixup-udev-rules-for-redhat.patch (98%) rename 0002-RH-Remove-the-property-blacklist-exception-builtin.patch => 0017-RH-Remove-the-property-blacklist-exception-builtin.patch (100%) rename 0003-RH-don-t-start-without-a-config-file.patch => 0018-RH-don-t-start-without-a-config-file.patch (99%) rename 0004-RH-Fix-nvme-function-missing-argument.patch => 0019-RH-Fix-nvme-function-missing-argument.patch (100%) rename 0005-RH-use-rpm-optflags-if-present.patch => 0020-RH-use-rpm-optflags-if-present.patch (85%) rename 0006-RH-add-mpathconf.patch => 0021-RH-add-mpathconf.patch (100%) rename 0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch => 0022-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch (95%) rename 0008-RH-reset-default-find_mutipaths-value-to-off.patch => 0023-RH-reset-default-find_mutipaths-value-to-off.patch (100%) rename 0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch => 0024-RH-attempt-to-get-ANA-info-via-sysfs-first.patch (100%) rename 0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch => 0025-RH-make-parse_vpd_pg83-match-scsi_id-output.patch (97%) diff --git a/0001-libmultipath-fix-memory-leak-in-checker_cleanup_thre.patch b/0001-libmultipath-fix-memory-leak-in-checker_cleanup_thre.patch new file mode 100644 index 0000000..5e389f3 --- /dev/null +++ b/0001-libmultipath-fix-memory-leak-in-checker_cleanup_thre.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: lixiaokeng +Date: Fri, 9 Apr 2021 15:15:05 +0800 +Subject: [PATCH] libmultipath: fix memory leak in checker_cleanup_thread + +If checker_cleanup_thread is called after cleanup_checkers, +the checker_class will not be freed. + +Here, we use free_checker_class instead of checker_class_unref +in checker_cleanup_thread. + +Signed-off-by: Lixiaokeng +Reviewed-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + libmultipath/checkers.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libmultipath/checkers.c b/libmultipath/checkers.c +index 2dd9915d..8039c2bf 100644 +--- a/libmultipath/checkers.c ++++ b/libmultipath/checkers.c +@@ -368,7 +368,7 @@ static void checker_cleanup_thread(void *arg) + { + struct checker_class *cls = arg; + +- (void)checker_class_unref(cls); ++ free_checker_class(cls); + rcu_unregister_thread(); + } + diff --git a/0002-multipathd-fix-compilation-issue-with-liburcu-0.8.patch b/0002-multipathd-fix-compilation-issue-with-liburcu-0.8.patch new file mode 100644 index 0000000..a9c4af4 --- /dev/null +++ b/0002-multipathd-fix-compilation-issue-with-liburcu-0.8.patch @@ -0,0 +1,85 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Wed, 12 May 2021 23:06:51 +0200 +Subject: [PATCH] multipathd: fix compilation issue with liburcu < 0.8 + +To avoid race conditions with pending RCU callbacks on exit, it's +necessary to call rcu_barrier() in cleanup_rcu() (see +https://lists.lttng.org/pipermail/lttng-dev/2021-May/029958.html and +follow-ups). + +rcu_barrier() is only available in User-space RCU v0.8 and newer. +Fix it by reverting 5d0dae6 ("multipathd: Fix liburcu memory leak") +if an older version of liburcu is detected. + +Fixes: 5d0dae6 ("multipathd: Fix liburcu memory leak") +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipathd/Makefile | 2 ++ + multipathd/main.c | 17 +++++++++++++++-- + 2 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/multipathd/Makefile b/multipathd/Makefile +index d053c1ed..393b6cbb 100644 +--- a/multipathd/Makefile ++++ b/multipathd/Makefile +@@ -16,6 +16,8 @@ LDFLAGS += $(BIN_LDFLAGS) + LIBDEPS += -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist \ + -L$(mpathcmddir) -lmpathcmd -ludev -ldl -lurcu -lpthread \ + -ldevmapper -lreadline ++CFLAGS += $(shell $(PKGCONFIG) --modversion liburcu 2>/dev/null | \ ++ awk -F. '{ printf("-DURCU_VERSION=0x%06x", 256 * ( 256 * $$1 + $$2) + $$3); }') + + ifdef SYSTEMD + CFLAGS += -DUSE_SYSTEMD=$(SYSTEMD) +diff --git a/multipathd/main.c b/multipathd/main.c +index 102946bf..c34fd9c8 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -3031,6 +3031,10 @@ static void cleanup_threads(void) + pthread_attr_destroy(&waiter_attr); + } + ++#ifndef URCU_VERSION ++# define URCU_VERSION 0 ++#endif ++#if (URCU_VERSION >= 0x000800) + /* + * Use a non-default call_rcu_data for child(). + * +@@ -3040,6 +3044,9 @@ static void cleanup_threads(void) + * can't be joined with pthread_join(), leaving a memory leak. + * + * Therefore we create our own, which can be destroyed and joined. ++ * The cleanup handler needs to call rcu_barrier(), which is only ++ * available in user-space RCU v0.8 and newer. See ++ * https://lists.lttng.org/pipermail/lttng-dev/2021-May/029958.html + */ + static struct call_rcu_data *setup_rcu(void) + { +@@ -3072,6 +3079,7 @@ static void cleanup_rcu(void) + } + rcu_unregister_thread(); + } ++#endif /* URCU_VERSION */ + + static void cleanup_child(void) + { +@@ -3116,9 +3124,14 @@ child (__attribute__((unused)) void *param) + init_unwinder(); + mlockall(MCL_CURRENT | MCL_FUTURE); + signal_init(); ++#if (URCU_VERSION >= 0x000800) + mp_rcu_data = setup_rcu(); +- +- if (atexit(cleanup_rcu) || atexit(cleanup_child)) ++ if (atexit(cleanup_rcu)) ++ fprintf(stderr, "failed to register RCU cleanup handler\n"); ++#else ++ rcu_init(); ++#endif ++ if (atexit(cleanup_child)) + fprintf(stderr, "failed to register cleanup handlers\n"); + + setup_thread_attr(&misc_attr, 64 * 1024, 0); diff --git a/0003-multipathd-don-t-fail-to-remove-path-once-the-map-is.patch b/0003-multipathd-don-t-fail-to-remove-path-once-the-map-is.patch new file mode 100644 index 0000000..89d027a --- /dev/null +++ b/0003-multipathd-don-t-fail-to-remove-path-once-the-map-is.patch @@ -0,0 +1,70 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 May 2021 11:29:54 -0500 +Subject: [PATCH] multipathd: don't fail to remove path once the map is removed + +In ev_remove_path(), if update_mpp_paths() fails, we delete the entire +map. However, since update_mpp_paths() happens before we call +set_path_removed(), pp->initialized isn't set to INIT_REMOVED, so +remove_map_and_stop_waiter() doesn't remove the path when in removes the +map. But with the map removed, there's nothing to keep us from removing +the path. + +Call set_path_removed() before update_mpp_paths() to avoid the odd case +of ev_remove_path() removing the map but not the path. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +--- + libmultipath/structs_vec.c | 4 ++-- + multipathd/main.c | 13 ++++++++----- + 2 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c +index d242c06b..75390198 100644 +--- a/libmultipath/structs_vec.c ++++ b/libmultipath/structs_vec.c +@@ -45,8 +45,8 @@ int update_mpp_paths(struct multipath *mpp, vector pathvec) + + /* + * Avoid adding removed paths to the map again +- * when we reload it. Such paths may exist if +- * domap fails in ev_remove_path(). ++ * when we reload it. Such paths may exist in ++ * ev_remove_paths() or if it returns failure. + */ + pp1 = find_path_by_devt(pathvec, pp->dev_t); + if (pp1 && pp->initialized != INIT_REMOVED && +diff --git a/multipathd/main.c b/multipathd/main.c +index c34fd9c8..2062bc10 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1199,6 +1199,13 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + * avoid referring to the map of an orphaned path + */ + if ((mpp = pp->mpp)) { ++ /* ++ * Mark the path as removed. In case of success, we ++ * will delete it for good. Otherwise, it will be deleted ++ * later, unless all attempts to reload this map fail. ++ */ ++ set_path_removed(pp); ++ + /* + * transform the mp->pg vector of vectors of paths + * into a mp->params string to feed the device-mapper +@@ -1210,13 +1217,9 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + } + + /* +- * Mark the path as removed. In case of success, we +- * will delete it for good. Otherwise, it will be deleted +- * later, unless all attempts to reload this map fail. +- * Note: we have to explicitly remove pp from mpp->paths, ++ * we have to explicitly remove pp from mpp->paths, + * update_mpp_paths() doesn't do that. + */ +- set_path_removed(pp); + i = find_slot(mpp->paths, pp); + if (i != -1) + vector_del_slot(mpp->paths, i); diff --git a/0004-multipathd-remove-duplicate-orphan_paths-in-flush_ma.patch b/0004-multipathd-remove-duplicate-orphan_paths-in-flush_ma.patch new file mode 100644 index 0000000..636a18c --- /dev/null +++ b/0004-multipathd-remove-duplicate-orphan_paths-in-flush_ma.patch @@ -0,0 +1,27 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 May 2021 11:29:55 -0500 +Subject: [PATCH] multipathd: remove duplicate orphan_paths in flush_map + +remove_map_and_stop_waiter() already calls orphan_paths() so flush_map() +doesn't need to call orphan_paths() before calling +remove_map_and_stop_waiter(). + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +--- + multipathd/main.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index 2062bc10..266d6b44 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -660,7 +660,6 @@ flush_map(struct multipath * mpp, struct vectors * vecs, int nopaths) + else + condlog(2, "%s: map flushed", mpp->alias); + +- orphan_paths(vecs->pathvec, mpp, "map flushed"); + remove_map_and_stop_waiter(mpp, vecs); + + return 0; diff --git a/0005-multipathd-fix-ev_remove_path-return-code-handling.patch b/0005-multipathd-fix-ev_remove_path-return-code-handling.patch new file mode 100644 index 0000000..74bf879 --- /dev/null +++ b/0005-multipathd-fix-ev_remove_path-return-code-handling.patch @@ -0,0 +1,226 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 May 2021 11:29:56 -0500 +Subject: [PATCH] multipathd: fix ev_remove_path return code handling + +When ev_remove_path() returned success, callers assumed that the path +(and possibly the map) had been removed. When ev_remove_path() returned +failure, callers assumed that the path had not been removed. However, +the path could be removed on both success or failure. This could cause +callers to dereference the path after it was removed. + +To deal with this, make ev_remove_path() return a different symbolic +value for each outcome, and make the callers react appropriately for +the different values. Found by coverity. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +--- + multipathd/cli_handlers.c | 24 +++++++++++++++++++++-- + multipathd/main.c | 41 ++++++++++++++++++++------------------- + multipathd/main.h | 14 +++++++++++++ + 3 files changed, 57 insertions(+), 22 deletions(-) + +diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c +index 1de6ad8e..6765fcf0 100644 +--- a/multipathd/cli_handlers.c ++++ b/multipathd/cli_handlers.c +@@ -752,7 +752,8 @@ cli_add_path (void * v, char ** reply, int * len, void * data) + /* Have the checker reinstate this path asap */ + pp->tick = 1; + return 0; +- } else if (!ev_remove_path(pp, vecs, true)) ++ } else if (ev_remove_path(pp, vecs, true) & ++ REMOVE_PATH_SUCCESS) + /* Path removed in ev_remove_path() */ + pp = NULL; + else { +@@ -813,6 +814,7 @@ cli_del_path (void * v, char ** reply, int * len, void * data) + struct vectors * vecs = (struct vectors *)data; + char * param = get_keyparam(v, PATH); + struct path *pp; ++ int ret; + + param = convert_dev(param, 1); + condlog(2, "%s: remove path (operator)", param); +@@ -821,7 +823,25 @@ cli_del_path (void * v, char ** reply, int * len, void * data) + condlog(0, "%s: path already removed", param); + return 1; + } +- return ev_remove_path(pp, vecs, 1); ++ ret = ev_remove_path(pp, vecs, 1); ++ if (ret == REMOVE_PATH_DELAY) { ++ *reply = strdup("delayed\n"); ++ if (*reply) ++ *len = strlen(*reply) + 1; ++ else { ++ *len = 0; ++ ret = REMOVE_PATH_FAILURE; ++ } ++ } else if (ret == REMOVE_PATH_MAP_ERROR) { ++ *reply = strdup("map reload error. removed\n"); ++ if (*reply) ++ *len = strlen(*reply) + 1; ++ else { ++ *len = 0; ++ ret = REMOVE_PATH_FAILURE; ++ } ++ } ++ return (ret == REMOVE_PATH_FAILURE); + } + + int +diff --git a/multipathd/main.c b/multipathd/main.c +index 266d6b44..26a4e44e 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -838,7 +838,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) & REMOVE_PATH_SUCCESS) && pp->mpp) { + pp->dmstate = PSTATE_FAILED; + dm_fail_path(pp->mpp->alias, pp->dev_t); + } +@@ -948,8 +948,8 @@ uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map) + * Make another attempt to remove the path + */ + pp->mpp = prev_mpp; +- ret = ev_remove_path(pp, vecs, true); +- if (ret != 0) { ++ if (!(ev_remove_path(pp, vecs, true) & ++ REMOVE_PATH_SUCCESS)) { + /* + * Failure in ev_remove_path will keep + * path in pathvec in INIT_REMOVED state +@@ -960,6 +960,7 @@ uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map) + dm_fail_path(pp->mpp->alias, pp->dev_t); + condlog(1, "%s: failed to re-add path still mapped in %s", + pp->dev, pp->mpp->alias); ++ ret = 1; + } else if (r == PATHINFO_OK) + /* + * Path successfully freed, move on to +@@ -1167,7 +1168,6 @@ static int + uev_remove_path (struct uevent *uev, struct vectors * vecs, int need_do_map) + { + struct path *pp; +- int ret; + + condlog(3, "%s: remove path (uevent)", uev->kernel); + delete_foreign(uev->udev); +@@ -1177,21 +1177,18 @@ uev_remove_path (struct uevent *uev, struct vectors * vecs, int need_do_map) + pthread_testcancel(); + pp = find_path_by_dev(vecs->pathvec, uev->kernel); + if (pp) +- ret = ev_remove_path(pp, vecs, need_do_map); ++ ev_remove_path(pp, vecs, need_do_map); + lock_cleanup_pop(vecs->lock); +- if (!pp) { +- /* Not an error; path might have been purged earlier */ ++ if (!pp) /* Not an error; path might have been purged earlier */ + condlog(0, "%s: path already removed", uev->kernel); +- return 0; +- } +- return ret; ++ return 0; + } + + int + ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + { + struct multipath * mpp; +- int i, retval = 0; ++ int i, retval = REMOVE_PATH_SUCCESS; + char params[PARAMS_SIZE] = {0}; + + /* +@@ -1245,7 +1242,6 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + condlog(2, "%s: removed map after" + " removing all paths", + alias); +- retval = 0; + /* flush_map() has freed the path */ + goto out; + } +@@ -1262,11 +1258,14 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + + if (mpp->wait_for_udev) { + mpp->wait_for_udev = 2; ++ retval = REMOVE_PATH_DELAY; + goto out; + } + +- if (!need_do_map) ++ if (!need_do_map) { ++ retval = REMOVE_PATH_DELAY; + goto out; ++ } + /* + * reload the map + */ +@@ -1275,7 +1274,7 @@ 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 = REMOVE_PATH_FAILURE; + } else { + /* + * update our state from kernel +@@ -1283,12 +1282,12 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map) + char devt[BLK_DEV_SIZE]; + + strlcpy(devt, pp->dev_t, sizeof(devt)); ++ ++ /* setup_multipath will free the path ++ * regardless of whether it succeeds or ++ * fails */ + if (setup_multipath(vecs, mpp)) +- return 1; +- /* +- * Successful map reload without this path: +- * sync_map_state() will free it. +- */ ++ return REMOVE_PATH_MAP_ERROR; + sync_map_state(mpp); + + condlog(2, "%s: path removed from map %s", +@@ -1304,8 +1303,10 @@ out: + return retval; + + fail: ++ condlog(0, "%s: error removing path. removing map %s", pp->dev, ++ mpp->alias); + remove_map_and_stop_waiter(mpp, vecs); +- return 1; ++ return REMOVE_PATH_MAP_ERROR; + } + + static int +diff --git a/multipathd/main.h b/multipathd/main.h +index ddd953f9..bc1f938f 100644 +--- a/multipathd/main.h ++++ b/multipathd/main.h +@@ -13,6 +13,20 @@ enum daemon_status { + DAEMON_STATUS_SIZE, + }; + ++enum remove_path_result { ++ REMOVE_PATH_FAILURE = 0x0, /* path could not be removed. It is still ++ * part of the kernel map, but its state ++ * is set to INIT_REMOVED, and it will be ++ * removed at the next possible occassion */ ++ REMOVE_PATH_SUCCESS = 0x1, /* path was removed */ ++ REMOVE_PATH_DELAY = 0x2, /* path is set to be removed later. it ++ * currently still exists and is part of the ++ * kernel map */ ++ REMOVE_PATH_MAP_ERROR = 0x5, /* map was removed because of error. value ++ * includes REMOVE_PATH_SUCCESS bit ++ * because the path was also removed */ ++}; ++ + struct prout_param_descriptor; + struct prin_resp; + diff --git a/0006-multipath-free-vectors-in-configure.patch b/0006-multipath-free-vectors-in-configure.patch new file mode 100644 index 0000000..9c8a08e --- /dev/null +++ b/0006-multipath-free-vectors-in-configure.patch @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 May 2021 11:29:57 -0500 +Subject: [PATCH] multipath: free vectors in configure + +configure() can retry multiple times, each time reallocing a maps and +paths vector, and leaking the previous ones. Fix this by always freeing +the vectors before configure() exits. Found by coverity. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +--- + multipath/main.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/multipath/main.c b/multipath/main.c +index ef89c7cf..8fc0e15f 100644 +--- a/multipath/main.c ++++ b/multipath/main.c +@@ -466,7 +466,6 @@ configure (struct config *conf, enum mpath_cmds cmd, + */ + curmp = vector_alloc(); + pathvec = vector_alloc(); +- atexit(cleanup_vecs); + + if (!curmp || !pathvec) { + condlog(0, "can not allocate memory"); +@@ -578,6 +577,11 @@ out: + if (refwwid) + FREE(refwwid); + ++ free_multipathvec(curmp, KEEP_PATHS); ++ vecs.mpvec = NULL; ++ free_pathvec(pathvec, FREE_PATHS); ++ vecs.pathvec = NULL; ++ + return r; + } + +@@ -823,6 +827,7 @@ main (int argc, char *argv[]) + conf = get_multipath_config(); + conf->retrigger_tries = 0; + conf->force_sync = 1; ++ atexit(cleanup_vecs); + while ((arg = getopt(argc, argv, ":adDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { + switch(arg) { + case 1: printf("optarg : %s\n",optarg); diff --git a/0007-kpartx-Don-t-leak-memory-when-getblock-returns-NULL.patch b/0007-kpartx-Don-t-leak-memory-when-getblock-returns-NULL.patch new file mode 100644 index 0000000..3cf456a --- /dev/null +++ b/0007-kpartx-Don-t-leak-memory-when-getblock-returns-NULL.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 May 2021 11:29:58 -0500 +Subject: [PATCH] kpartx: Don't leak memory when getblock returns NULL + +If a new block was allocated, but couldn't be filled, getblock will +discard it. When it does so, it needs to free the block to avoid leaking +memory. Found by coverity. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +--- + kpartx/kpartx.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c +index 8ff116b8..7bc64543 100644 +--- a/kpartx/kpartx.c ++++ b/kpartx/kpartx.c +@@ -766,6 +766,8 @@ getblock (int fd, unsigned int blknr) { + if (read(fd, bp->block, secsz) != secsz) { + fprintf(stderr, "read error, sector %d\n", secnr); + blockhead = bp->next; ++ free(bp->block); ++ free(bp); + return NULL; + } + diff --git a/0008-multipathd-don-t-rescan_path-on-wwid-change-in-uev_u.patch b/0008-multipathd-don-t-rescan_path-on-wwid-change-in-uev_u.patch new file mode 100644 index 0000000..384ccb0 --- /dev/null +++ b/0008-multipathd-don-t-rescan_path-on-wwid-change-in-uev_u.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 May 2021 11:29:59 -0500 +Subject: [PATCH] multipathd: don't rescan_path on wwid change in + uev_update_path + +If get_uid() is returning a different wwid in uev_update_path(), then +the uid_attribute must have already gotten updated, which was the +purpose behind calling rescan_path() in the first place. + +Signed-off-by: Benjamin Marzinski +Reviewed-by: Martin Wilck +--- + multipathd/main.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/multipathd/main.c b/multipathd/main.c +index 26a4e44e..2251e02c 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1359,7 +1359,6 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) + condlog(0, "%s: path wwid changed from '%s' to '%s'", + uev->kernel, wwid, pp->wwid); + ev_remove_path(pp, vecs, 1); +- rescan_path(uev->udev); + needs_reinit = 1; + goto out; + } else { diff --git a/0009-multipathd-cli_handlers-cleanup-setting-reply-length.patch b/0009-multipathd-cli_handlers-cleanup-setting-reply-length.patch new file mode 100644 index 0000000..3099df6 --- /dev/null +++ b/0009-multipathd-cli_handlers-cleanup-setting-reply-length.patch @@ -0,0 +1,82 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 17 May 2021 22:37:34 +0200 +Subject: [PATCH] multipathd: cli_handlers: cleanup setting reply length + +Create a macro for setting the reply length for string literals +correctly, and use it where necessary. + +In cli_del_path(), don't change the function's return code +if just the buffer allocation for the reply failed. + +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipathd/cli_handlers.c | 33 ++++++++++++--------------------- + 1 file changed, 12 insertions(+), 21 deletions(-) + +diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c +index 6765fcf0..96064944 100644 +--- a/multipathd/cli_handlers.c ++++ b/multipathd/cli_handlers.c +@@ -32,6 +32,12 @@ + #include "foreign.h" + #include "cli_handlers.h" + ++#define SET_REPLY_AND_LEN(__rep, __len, string_literal) \ ++ do { \ ++ *(__rep) = strdup(string_literal); \ ++ *(__len) = *(__rep) ? sizeof(string_literal) : 0; \ ++ } while (0) ++ + int + show_paths (char ** r, int * len, struct vectors * vecs, char * style, + int pretty) +@@ -802,8 +808,7 @@ cli_add_path (void * v, char ** reply, int * len, void * data) + } + return ev_add_path(pp, vecs, 1); + blacklisted: +- *reply = strdup("blacklisted\n"); +- *len = strlen(*reply) + 1; ++ SET_REPLY_AND_LEN(reply, len, "blacklisted\n"); + condlog(2, "%s: path blacklisted", param); + return 0; + } +@@ -824,23 +829,10 @@ cli_del_path (void * v, char ** reply, int * len, void * data) + return 1; + } + ret = ev_remove_path(pp, vecs, 1); +- if (ret == REMOVE_PATH_DELAY) { +- *reply = strdup("delayed\n"); +- if (*reply) +- *len = strlen(*reply) + 1; +- else { +- *len = 0; +- ret = REMOVE_PATH_FAILURE; +- } +- } else if (ret == REMOVE_PATH_MAP_ERROR) { +- *reply = strdup("map reload error. removed\n"); +- if (*reply) +- *len = strlen(*reply) + 1; +- else { +- *len = 0; +- ret = REMOVE_PATH_FAILURE; +- } +- } ++ if (ret == REMOVE_PATH_DELAY) ++ SET_REPLY_AND_LEN(reply, len, "delayed\n"); ++ else if (ret == REMOVE_PATH_MAP_ERROR) ++ SET_REPLY_AND_LEN(reply, len, "map reload error. removed\n"); + return (ret == REMOVE_PATH_FAILURE); + } + +@@ -865,8 +857,7 @@ cli_add_map (void * v, char ** reply, int * len, void * data) + invalid = 1; + pthread_cleanup_pop(1); + if (invalid) { +- *reply = strdup("blacklisted\n"); +- *len = strlen(*reply) + 1; ++ SET_REPLY_AND_LEN(reply, len, "blacklisted\n"); + condlog(2, "%s: map blacklisted", param); + return 1; + } diff --git a/0010-multipathd-cli_getprkey-fix-return-value.patch b/0010-multipathd-cli_getprkey-fix-return-value.patch new file mode 100644 index 0000000..841190b --- /dev/null +++ b/0010-multipathd-cli_getprkey-fix-return-value.patch @@ -0,0 +1,53 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 17 May 2021 22:45:05 +0200 +Subject: [PATCH] multipathd: cli_getprkey(): fix return value + +By setting (*reply)[19] = '\0', we always truncated a possible +":aptpl" suffix. Fix it, and use the return value of snprintf() +as length. + +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + multipathd/cli_handlers.c | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c +index 96064944..59d44b45 100644 +--- a/multipathd/cli_handlers.c ++++ b/multipathd/cli_handlers.c +@@ -1540,7 +1540,7 @@ cli_getprkey(void * v, char ** reply, int * len, void * data) + struct multipath * mpp; + struct vectors * vecs = (struct vectors *)data; + char *mapname = get_keyparam(v, MAP); +- char *flagstr = ""; ++ uint64_t key; + + mapname = convert_dev(mapname, 0); + condlog(3, "%s: get persistent reservation key (operator)", mapname); +@@ -1553,17 +1553,16 @@ cli_getprkey(void * v, char ** reply, int * len, void * data) + if (!*reply) + return 1; + +- if (!get_be64(mpp->reservation_key)) { ++ key = get_be64(mpp->reservation_key); ++ if (!key) { + sprintf(*reply, "none\n"); +- *len = strlen(*reply) + 1; ++ *len = sizeof("none\n"); + return 0; + } +- if (mpp->sa_flags & MPATH_F_APTPL_MASK) +- flagstr = ":aptpl"; +- snprintf(*reply, 26, "0x%" PRIx64 "%s\n", +- get_be64(mpp->reservation_key), flagstr); +- (*reply)[19] = '\0'; +- *len = strlen(*reply) + 1; ++ ++ /* This snprintf() can't overflow - PRIx64 needs max 16 chars */ ++ *len = snprintf(*reply, 26, "0x%" PRIx64 "%s\n", key, ++ mpp->sa_flags & MPATH_F_APTPL_MASK ? ":aptpl" : "") + 1; + return 0; + } + diff --git a/0011-multipath-tools-enable-Wformat-overflow-2.patch b/0011-multipath-tools-enable-Wformat-overflow-2.patch new file mode 100644 index 0000000..ab6f670 --- /dev/null +++ b/0011-multipath-tools-enable-Wformat-overflow-2.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 17 May 2021 22:43:02 +0200 +Subject: [PATCH] multipath-tools: enable -Wformat-overflow=2 + +Allow the compiler to catch possible format string overflows. +Two were found by gcc 10. + +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + Makefile.inc | 3 ++- + libmultipath/discovery.c | 2 +- + libmultipath/print.c | 4 ++-- + 3 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/Makefile.inc b/Makefile.inc +index f1e23131..91100a20 100644 +--- a/Makefile.inc ++++ b/Makefile.inc +@@ -95,9 +95,10 @@ TEST_CC_OPTION = $(shell \ + STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector) + ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers,) + WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,) ++WFORMATOVERFLOW := $(call TEST_CC_OPTION,-Wformat-overflow=2,) + + OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4 +-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 -Werror=implicit-int \ ++WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \ + -Werror=implicit-function-declaration -Werror=format-security \ + $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) + CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2 +diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c +index ec99a7aa..bfe2f56c 100644 +--- a/libmultipath/discovery.c ++++ b/libmultipath/discovery.c +@@ -635,7 +635,7 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp) + { + struct udev_device *rport_dev = NULL; + char value[16], *eptr; +- char rport_id[32]; ++ char rport_id[42]; + unsigned int tmo; + int ret; + +diff --git a/libmultipath/print.c b/libmultipath/print.c +index 8151e11e..3c69bf48 100644 +--- a/libmultipath/print.c ++++ b/libmultipath/print.c +@@ -1,4 +1,4 @@ +-/* ++ /* + * Copyright (c) 2005 Christophe Varoqui + */ + #include +@@ -594,7 +594,7 @@ int + snprint_tgt_wwpn (char * buff, size_t len, const struct path * pp) + { + struct udev_device *rport_dev = NULL; +- char rport_id[32]; ++ char rport_id[42]; + const char *value = NULL; + int ret; + diff --git a/0012-libdmmp-use-KBUILD_BUILD_TIMESTAMP-when-building-man.patch b/0012-libdmmp-use-KBUILD_BUILD_TIMESTAMP-when-building-man.patch new file mode 100644 index 0000000..af81882 --- /dev/null +++ b/0012-libdmmp-use-KBUILD_BUILD_TIMESTAMP-when-building-man.patch @@ -0,0 +1,347 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Mon, 17 May 2021 23:12:10 +0200 +Subject: [PATCH] libdmmp: use KBUILD_BUILD_TIMESTAMP when building man pages + +Use the latest commit timestamp of the "libdmmp.h" file as +the timestamp for the man pages. This should avoid spurious rebuilds +of the documentation. + +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + libdmmp/Makefile | 2 ++ + libdmmp/docs/man/dmmp_context_free.3 | 2 +- + libdmmp/docs/man/dmmp_context_log_func_set.3 | 2 +- + libdmmp/docs/man/dmmp_context_log_priority_get.3 | 2 +- + libdmmp/docs/man/dmmp_context_log_priority_set.3 | 2 +- + libdmmp/docs/man/dmmp_context_new.3 | 2 +- + libdmmp/docs/man/dmmp_context_timeout_get.3 | 2 +- + libdmmp/docs/man/dmmp_context_timeout_set.3 | 2 +- + libdmmp/docs/man/dmmp_context_userdata_get.3 | 2 +- + libdmmp/docs/man/dmmp_context_userdata_set.3 | 2 +- + libdmmp/docs/man/dmmp_flush_mpath.3 | 2 +- + libdmmp/docs/man/dmmp_last_error_msg.3 | 2 +- + libdmmp/docs/man/dmmp_log_priority_str.3 | 2 +- + libdmmp/docs/man/dmmp_mpath_array_free.3 | 2 +- + libdmmp/docs/man/dmmp_mpath_array_get.3 | 2 +- + libdmmp/docs/man/dmmp_mpath_kdev_name_get.3 | 2 +- + libdmmp/docs/man/dmmp_mpath_name_get.3 | 2 +- + libdmmp/docs/man/dmmp_mpath_wwid_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_array_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_blk_name_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_group_array_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_group_id_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_group_priority_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_group_selector_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_group_status_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_group_status_str.3 | 2 +- + libdmmp/docs/man/dmmp_path_status_get.3 | 2 +- + libdmmp/docs/man/dmmp_path_status_str.3 | 2 +- + libdmmp/docs/man/dmmp_reconfig.3 | 2 +- + libdmmp/docs/man/dmmp_strerror.3 | 2 +- + 30 files changed, 31 insertions(+), 29 deletions(-) + +diff --git a/libdmmp/Makefile b/libdmmp/Makefile +index 764a0bc5..79b92fb2 100644 +--- a/libdmmp/Makefile ++++ b/libdmmp/Makefile +@@ -76,6 +76,8 @@ docs/man/%.3.gz: docs/man/%.3 + docs/man/dmmp_strerror.3: $(HEADERS) + TEMPFILE=$(shell mktemp); \ + cat $^ | perl docs/doc-preclean.pl >$$TEMPFILE; \ ++ LC_ALL=C \ ++ KBUILD_BUILD_TIMESTAMP=`git log -n1 --pretty=%cd --date=iso -- $^` \ + perl docs/kernel-doc -man $$TEMPFILE | \ + perl docs/split-man.pl docs/man; \ + rm -f $$TEMPFILE +diff --git a/libdmmp/docs/man/dmmp_context_free.3 b/libdmmp/docs/man/dmmp_context_free.3 +index 0d26f42c..7c109e13 100644 +--- a/libdmmp/docs/man/dmmp_context_free.3 ++++ b/libdmmp/docs/man/dmmp_context_free.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_free" 3 "dmmp_context_free" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_free" 3 "dmmp_context_free" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_free \- Release the memory of struct dmmp_context. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_log_func_set.3 b/libdmmp/docs/man/dmmp_context_log_func_set.3 +index 986793db..be311ecf 100644 +--- a/libdmmp/docs/man/dmmp_context_log_func_set.3 ++++ b/libdmmp/docs/man/dmmp_context_log_func_set.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_log_func_set" 3 "dmmp_context_log_func_set" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_log_func_set" 3 "dmmp_context_log_func_set" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_log_func_set \- Set log handler function. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_log_priority_get.3 b/libdmmp/docs/man/dmmp_context_log_priority_get.3 +index 9a273a28..be383013 100644 +--- a/libdmmp/docs/man/dmmp_context_log_priority_get.3 ++++ b/libdmmp/docs/man/dmmp_context_log_priority_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_log_priority_get" 3 "dmmp_context_log_priority_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_log_priority_get" 3 "dmmp_context_log_priority_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_log_priority_get \- Get log priority. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_log_priority_set.3 b/libdmmp/docs/man/dmmp_context_log_priority_set.3 +index 469c5a49..79e4d2e8 100644 +--- a/libdmmp/docs/man/dmmp_context_log_priority_set.3 ++++ b/libdmmp/docs/man/dmmp_context_log_priority_set.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_log_priority_set" 3 "dmmp_context_log_priority_set" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_log_priority_set" 3 "dmmp_context_log_priority_set" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_log_priority_set \- Set log priority. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_new.3 b/libdmmp/docs/man/dmmp_context_new.3 +index 0eaeb00d..12505f91 100644 +--- a/libdmmp/docs/man/dmmp_context_new.3 ++++ b/libdmmp/docs/man/dmmp_context_new.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_new" 3 "dmmp_context_new" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_new" 3 "dmmp_context_new" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_new \- Create struct dmmp_context. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_timeout_get.3 b/libdmmp/docs/man/dmmp_context_timeout_get.3 +index 1df27936..2ed825d5 100644 +--- a/libdmmp/docs/man/dmmp_context_timeout_get.3 ++++ b/libdmmp/docs/man/dmmp_context_timeout_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_timeout_get" 3 "dmmp_context_timeout_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_timeout_get" 3 "dmmp_context_timeout_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_timeout_get \- Get IPC timeout. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_timeout_set.3 b/libdmmp/docs/man/dmmp_context_timeout_set.3 +index f3d77092..16bc9d99 100644 +--- a/libdmmp/docs/man/dmmp_context_timeout_set.3 ++++ b/libdmmp/docs/man/dmmp_context_timeout_set.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_timeout_set" 3 "dmmp_context_timeout_set" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_timeout_set" 3 "dmmp_context_timeout_set" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_timeout_set \- Set IPC timeout. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_userdata_get.3 b/libdmmp/docs/man/dmmp_context_userdata_get.3 +index fb713d50..eff446c6 100644 +--- a/libdmmp/docs/man/dmmp_context_userdata_get.3 ++++ b/libdmmp/docs/man/dmmp_context_userdata_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_userdata_get" 3 "dmmp_context_userdata_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_userdata_get" 3 "dmmp_context_userdata_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_userdata_get \- Get user data pointer. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_context_userdata_set.3 b/libdmmp/docs/man/dmmp_context_userdata_set.3 +index c5bf63f3..d7be869f 100644 +--- a/libdmmp/docs/man/dmmp_context_userdata_set.3 ++++ b/libdmmp/docs/man/dmmp_context_userdata_set.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_context_userdata_set" 3 "dmmp_context_userdata_set" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_context_userdata_set" 3 "dmmp_context_userdata_set" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_context_userdata_set \- Set user data pointer. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_flush_mpath.3 b/libdmmp/docs/man/dmmp_flush_mpath.3 +index cdfd5266..359607ed 100644 +--- a/libdmmp/docs/man/dmmp_flush_mpath.3 ++++ b/libdmmp/docs/man/dmmp_flush_mpath.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_flush_mpath" 3 "dmmp_flush_mpath" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_flush_mpath" 3 "dmmp_flush_mpath" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_flush_mpath \- Flush specified multipath device map if unused. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_last_error_msg.3 b/libdmmp/docs/man/dmmp_last_error_msg.3 +index 20acbc6a..378c55a5 100644 +--- a/libdmmp/docs/man/dmmp_last_error_msg.3 ++++ b/libdmmp/docs/man/dmmp_last_error_msg.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_last_error_msg" 3 "dmmp_last_error_msg" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_last_error_msg" 3 "dmmp_last_error_msg" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_last_error_msg \- Retrieves the last error message. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_log_priority_str.3 b/libdmmp/docs/man/dmmp_log_priority_str.3 +index 3b5f8284..b2761602 100644 +--- a/libdmmp/docs/man/dmmp_log_priority_str.3 ++++ b/libdmmp/docs/man/dmmp_log_priority_str.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_log_priority_str" 3 "dmmp_log_priority_str" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_log_priority_str" 3 "dmmp_log_priority_str" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_log_priority_str \- Convert log priority to string. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_mpath_array_free.3 b/libdmmp/docs/man/dmmp_mpath_array_free.3 +index 8c294e0d..0514a66f 100644 +--- a/libdmmp/docs/man/dmmp_mpath_array_free.3 ++++ b/libdmmp/docs/man/dmmp_mpath_array_free.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_mpath_array_free" 3 "dmmp_mpath_array_free" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_mpath_array_free" 3 "dmmp_mpath_array_free" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_mpath_array_free \- Free 'struct dmmp_mpath' pointer array. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_mpath_array_get.3 b/libdmmp/docs/man/dmmp_mpath_array_get.3 +index e211db42..8b0e5b53 100644 +--- a/libdmmp/docs/man/dmmp_mpath_array_get.3 ++++ b/libdmmp/docs/man/dmmp_mpath_array_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_mpath_array_get" 3 "dmmp_mpath_array_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_mpath_array_get" 3 "dmmp_mpath_array_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_mpath_array_get \- Query all existing multipath devices. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_mpath_kdev_name_get.3 b/libdmmp/docs/man/dmmp_mpath_kdev_name_get.3 +index e802fe6d..ddead551 100644 +--- a/libdmmp/docs/man/dmmp_mpath_kdev_name_get.3 ++++ b/libdmmp/docs/man/dmmp_mpath_kdev_name_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_mpath_kdev_name_get" 3 "dmmp_mpath_kdev_name_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_mpath_kdev_name_get" 3 "dmmp_mpath_kdev_name_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_mpath_kdev_name_get \- Retrieve kernel DEVNAME of certain mpath. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_mpath_name_get.3 b/libdmmp/docs/man/dmmp_mpath_name_get.3 +index d70579e5..2b0027e5 100644 +--- a/libdmmp/docs/man/dmmp_mpath_name_get.3 ++++ b/libdmmp/docs/man/dmmp_mpath_name_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_mpath_name_get" 3 "dmmp_mpath_name_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_mpath_name_get" 3 "dmmp_mpath_name_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_mpath_name_get \- Retrieve name(alias) of certain mpath. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_mpath_wwid_get.3 b/libdmmp/docs/man/dmmp_mpath_wwid_get.3 +index 3d060e92..b8e9e7d8 100644 +--- a/libdmmp/docs/man/dmmp_mpath_wwid_get.3 ++++ b/libdmmp/docs/man/dmmp_mpath_wwid_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_mpath_wwid_get" 3 "dmmp_mpath_wwid_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_mpath_wwid_get" 3 "dmmp_mpath_wwid_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_mpath_wwid_get \- Retrieve WWID of certain mpath. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_array_get.3 b/libdmmp/docs/man/dmmp_path_array_get.3 +index 53340b3d..21f486be 100644 +--- a/libdmmp/docs/man/dmmp_path_array_get.3 ++++ b/libdmmp/docs/man/dmmp_path_array_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_array_get" 3 "dmmp_path_array_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_array_get" 3 "dmmp_path_array_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_array_get \- Retrieve path pointer array. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_blk_name_get.3 b/libdmmp/docs/man/dmmp_path_blk_name_get.3 +index da5f9f03..5938f0e7 100644 +--- a/libdmmp/docs/man/dmmp_path_blk_name_get.3 ++++ b/libdmmp/docs/man/dmmp_path_blk_name_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_blk_name_get" 3 "dmmp_path_blk_name_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_blk_name_get" 3 "dmmp_path_blk_name_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_blk_name_get \- Retrieve block name. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_group_array_get.3 b/libdmmp/docs/man/dmmp_path_group_array_get.3 +index 6eee4a2b..ca3187cb 100644 +--- a/libdmmp/docs/man/dmmp_path_group_array_get.3 ++++ b/libdmmp/docs/man/dmmp_path_group_array_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_group_array_get" 3 "dmmp_path_group_array_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_group_array_get" 3 "dmmp_path_group_array_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_group_array_get \- Retrieve path groups pointer array. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_group_id_get.3 b/libdmmp/docs/man/dmmp_path_group_id_get.3 +index 4f07b536..a84f31f0 100644 +--- a/libdmmp/docs/man/dmmp_path_group_id_get.3 ++++ b/libdmmp/docs/man/dmmp_path_group_id_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_group_id_get" 3 "dmmp_path_group_id_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_group_id_get" 3 "dmmp_path_group_id_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_group_id_get \- Retrieve path group ID. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_group_priority_get.3 b/libdmmp/docs/man/dmmp_path_group_priority_get.3 +index a48b2704..1cda8af3 100644 +--- a/libdmmp/docs/man/dmmp_path_group_priority_get.3 ++++ b/libdmmp/docs/man/dmmp_path_group_priority_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_group_priority_get" 3 "dmmp_path_group_priority_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_group_priority_get" 3 "dmmp_path_group_priority_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_group_priority_get \- Retrieve path group priority. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_group_selector_get.3 b/libdmmp/docs/man/dmmp_path_group_selector_get.3 +index 407b3f41..f55477bb 100644 +--- a/libdmmp/docs/man/dmmp_path_group_selector_get.3 ++++ b/libdmmp/docs/man/dmmp_path_group_selector_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_group_selector_get" 3 "dmmp_path_group_selector_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_group_selector_get" 3 "dmmp_path_group_selector_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_group_selector_get \- Retrieve path group selector. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_group_status_get.3 b/libdmmp/docs/man/dmmp_path_group_status_get.3 +index a81aeb3a..53e68b8e 100644 +--- a/libdmmp/docs/man/dmmp_path_group_status_get.3 ++++ b/libdmmp/docs/man/dmmp_path_group_status_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_group_status_get" 3 "dmmp_path_group_status_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_group_status_get" 3 "dmmp_path_group_status_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_group_status_get \- Retrieve path group status. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_group_status_str.3 b/libdmmp/docs/man/dmmp_path_group_status_str.3 +index e4a9f74b..98f877a4 100644 +--- a/libdmmp/docs/man/dmmp_path_group_status_str.3 ++++ b/libdmmp/docs/man/dmmp_path_group_status_str.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_group_status_str" 3 "dmmp_path_group_status_str" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_group_status_str" 3 "dmmp_path_group_status_str" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_group_status_str \- Convert path group status to string. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_status_get.3 b/libdmmp/docs/man/dmmp_path_status_get.3 +index 025cfee5..baa4437d 100644 +--- a/libdmmp/docs/man/dmmp_path_status_get.3 ++++ b/libdmmp/docs/man/dmmp_path_status_get.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_status_get" 3 "dmmp_path_status_get" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_status_get" 3 "dmmp_path_status_get" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_status_get \- Retrieve the path status. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_path_status_str.3 b/libdmmp/docs/man/dmmp_path_status_str.3 +index 3944d399..425e472a 100644 +--- a/libdmmp/docs/man/dmmp_path_status_str.3 ++++ b/libdmmp/docs/man/dmmp_path_status_str.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_path_status_str" 3 "dmmp_path_status_str" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_path_status_str" 3 "dmmp_path_status_str" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_path_status_str \- Convert path status to string. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_reconfig.3 b/libdmmp/docs/man/dmmp_reconfig.3 +index a743e308..36bd5041 100644 +--- a/libdmmp/docs/man/dmmp_reconfig.3 ++++ b/libdmmp/docs/man/dmmp_reconfig.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_reconfig" 3 "dmmp_reconfig" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_reconfig" 3 "dmmp_reconfig" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_reconfig \- Instruct multipathd daemon to do reconfiguration. + .SH SYNOPSIS +diff --git a/libdmmp/docs/man/dmmp_strerror.3 b/libdmmp/docs/man/dmmp_strerror.3 +index 4d753d36..3acd9c9d 100644 +--- a/libdmmp/docs/man/dmmp_strerror.3 ++++ b/libdmmp/docs/man/dmmp_strerror.3 +@@ -1,4 +1,4 @@ +-.TH "dmmp_strerror" 3 "dmmp_strerror" "March 2021" "Device Mapper Multipath API - libdmmp Manual" ++.TH "dmmp_strerror" 3 "dmmp_strerror" "March 2018" "Device Mapper Multipath API - libdmmp Manual" + .SH NAME + dmmp_strerror \- Convert error code to string. + .SH SYNOPSIS diff --git a/0013-multipath-tools-add-info-about-HPE-Alletra-6000-and-.patch b/0013-multipath-tools-add-info-about-HPE-Alletra-6000-and-.patch new file mode 100644 index 0000000..551ba59 --- /dev/null +++ b/0013-multipath-tools-add-info-about-HPE-Alletra-6000-and-.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Xose Vazquez Perez +Date: Sat, 5 Jun 2021 01:01:45 +0200 +Subject: [PATCH] multipath-tools: add info about HPE Alletra 6000 and 9000 + +Cc: Martin Wilck +Cc: Benjamin Marzinski +Cc: Christophe Varoqui +Cc: DM-DEVEL ML +Signed-off-by: Xose Vazquez Perez +Reviewed-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + README.alua | 2 +- + libmultipath/hwtable.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/README.alua b/README.alua +index b15eb487..5d2b1c64 100644 +--- a/README.alua ++++ b/README.alua +@@ -6,7 +6,7 @@ To enable ALUA, the following options should be changed: + - EMC CLARiiON/VNX: + "Failover Mode" should be changed to "4" or "Active-Active mode(ALUA)-failover mode 4" + +-- HPE 3PAR: ++- HPE 3PAR, Primera, and Alletra 9000: + "Host:" should be changed to "Generic-ALUA Persona 2 (UARepLun, SESLun, ALUA)". + + - Promise VTrak/Vess: +diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c +index 58fa7387..e884d8c7 100644 +--- a/libmultipath/hwtable.c ++++ b/libmultipath/hwtable.c +@@ -107,7 +107,7 @@ static struct hwentry default_hw[] = { + * HPE + */ + { +- /* 3PAR / Primera */ ++ /* 3PAR / Primera / Alletra 9000 */ + .vendor = "3PARdata", + .product = "VV", + .pgpolicy = GROUP_BY_PRIO, +@@ -225,7 +225,7 @@ static struct hwentry default_hw[] = { + .prio_name = PRIO_ALUA, + }, + { +- /* Nimble Storage */ ++ /* Nimble Storage / HPE Alletra 6000 */ + .vendor = "Nimble", + .product = "Server", + .hwhandler = "1 alua", diff --git a/0014-multipathd-don-t-start-in-containers.patch b/0014-multipathd-don-t-start-in-containers.patch new file mode 100644 index 0000000..79fcaf5 --- /dev/null +++ b/0014-multipathd-don-t-start-in-containers.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Utkarsh Gupta +Date: Mon, 7 Jun 2021 20:08:24 +0530 +Subject: [PATCH] multipathd: don't start in containers + +Do not attempt to start multipath-tools in containers, +should switch for on-demand udev/socket based +activation in the future. + +Originally reported as: +https://bugs.launchpad.net/ubuntu/+source/multipath-tools/+bug/1823093 + +Author: Dimitri John Ledkov +Co-Author: Utkarsh Gupta +Reviewed-by: Martin Wilck +Signed-off-by: Benjamin Marzinski +--- + multipathd/multipathd.service | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service +index 7d547fa7..0b2ac814 100644 +--- a/multipathd/multipathd.service ++++ b/multipathd/multipathd.service +@@ -8,6 +8,7 @@ DefaultDependencies=no + Conflicts=shutdown.target + ConditionKernelCommandLine=!nompath + ConditionKernelCommandLine=!multipath=off ++ConditionVirtualization=!container + + [Service] + Type=notify diff --git a/0015-libmultipath-fix-build-without-LIBDM_API_DEFERRED.patch b/0015-libmultipath-fix-build-without-LIBDM_API_DEFERRED.patch new file mode 100644 index 0000000..77068c0 --- /dev/null +++ b/0015-libmultipath-fix-build-without-LIBDM_API_DEFERRED.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Wilck +Date: Thu, 20 May 2021 21:26:01 +0200 +Subject: [PATCH] libmultipath: fix build without LIBDM_API_DEFERRED + +Build fails on distributions that don't support DM_DEFERRED_REMOVE +(libdevmapper < 1.02.89). Fix it. + +Resolves: https://github.com/opensvc/multipath-tools/issues/7 +Tested-by: Paul Menzel +Reviewed-by: Benjamin Marzinski +Signed-off-by: Benjamin Marzinski +--- + libmultipath/devmapper.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c +index 095cbc0c..47a6d60e 100644 +--- a/libmultipath/devmapper.c ++++ b/libmultipath/devmapper.c +@@ -49,6 +49,9 @@ static int dm_conf_verbosity; + + #ifdef LIBDM_API_DEFERRED + static int dm_cancel_remove_partmaps(const char * mapname); ++#define __DR_UNUSED__ /* empty */ ++#else ++#define __DR_UNUSED__ __attribute__((unused)) + #endif + + static int do_foreach_partmaps(const char * mapname, +@@ -384,7 +387,8 @@ libmp_dm_task_create(int task) + #define do_deferred(x) ((x) == DEFERRED_REMOVE_ON || (x) == DEFERRED_REMOVE_IN_PROGRESS) + + static int +-dm_simplecmd (int task, const char *name, int no_flush, int need_sync, uint16_t udev_flags, int deferred_remove) { ++dm_simplecmd (int task, const char *name, int no_flush, int need_sync, ++ uint16_t udev_flags, int deferred_remove __DR_UNUSED__) { + int r = 0; + int udev_wait_flag = ((need_sync || udev_flags) && + (task == DM_DEVICE_RESUME || +@@ -1122,7 +1126,8 @@ dm_flush_map_nopaths(const char * mapname, int deferred_remove) + #else + + int +-dm_flush_map_nopaths(const char * mapname, int deferred_remove) ++dm_flush_map_nopaths(const char * mapname, ++ int deferred_remove __attribute__((unused))) + { + return _dm_flush_map(mapname, 1, 0, 0, 0); + } +@@ -1573,7 +1578,7 @@ dm_cancel_deferred_remove (struct multipath *mpp) + #else + + int +-dm_cancel_deferred_remove (struct multipath *mpp) ++dm_cancel_deferred_remove (struct multipath *mpp __attribute__((unused))) + { + return 0; + } diff --git a/0001-RH-fixup-udev-rules-for-redhat.patch b/0016-RH-fixup-udev-rules-for-redhat.patch similarity index 98% rename from 0001-RH-fixup-udev-rules-for-redhat.patch rename to 0016-RH-fixup-udev-rules-for-redhat.patch index e84f9e0..66c702a 100644 --- a/0001-RH-fixup-udev-rules-for-redhat.patch +++ b/0016-RH-fixup-udev-rules-for-redhat.patch @@ -15,7 +15,7 @@ Signed-off-by: Benjamin Marzinski 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.inc b/Makefile.inc -index f1e23131..c593fd3b 100644 +index 91100a20..6c3714eb 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -55,7 +55,7 @@ endif diff --git a/0002-RH-Remove-the-property-blacklist-exception-builtin.patch b/0017-RH-Remove-the-property-blacklist-exception-builtin.patch similarity index 100% rename from 0002-RH-Remove-the-property-blacklist-exception-builtin.patch rename to 0017-RH-Remove-the-property-blacklist-exception-builtin.patch diff --git a/0003-RH-don-t-start-without-a-config-file.patch b/0018-RH-don-t-start-without-a-config-file.patch similarity index 99% rename from 0003-RH-don-t-start-without-a-config-file.patch rename to 0018-RH-don-t-start-without-a-config-file.patch index 1d5c693..5290d9e 100644 --- a/0003-RH-don-t-start-without-a-config-file.patch +++ b/0018-RH-don-t-start-without-a-config-file.patch @@ -81,7 +81,7 @@ index 048a838d..8bd47a80 100644 . .\" ---------------------------------------------------------------------------- diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service -index 7d547fa7..af592057 100644 +index 0b2ac814..6d57c7e8 100644 --- a/multipathd/multipathd.service +++ b/multipathd/multipathd.service @@ -4,6 +4,7 @@ Wants=systemd-udev-trigger.service systemd-udev-settle.service diff --git a/0004-RH-Fix-nvme-function-missing-argument.patch b/0019-RH-Fix-nvme-function-missing-argument.patch similarity index 100% rename from 0004-RH-Fix-nvme-function-missing-argument.patch rename to 0019-RH-Fix-nvme-function-missing-argument.patch diff --git a/0005-RH-use-rpm-optflags-if-present.patch b/0020-RH-use-rpm-optflags-if-present.patch similarity index 85% rename from 0005-RH-use-rpm-optflags-if-present.patch rename to 0020-RH-use-rpm-optflags-if-present.patch index debec54..ca542d3 100644 --- a/0005-RH-use-rpm-optflags-if-present.patch +++ b/0020-RH-use-rpm-optflags-if-present.patch @@ -13,19 +13,20 @@ Signed-off-by: Benjamin Marzinski 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/Makefile.inc b/Makefile.inc -index c593fd3b..87fb39f2 100644 +index 6c3714eb..db35feb6 100644 --- a/Makefile.inc +++ b/Makefile.inc -@@ -92,15 +92,27 @@ TEST_CC_OPTION = $(shell \ +@@ -92,16 +92,28 @@ TEST_CC_OPTION = $(shell \ echo "$(2)"; \ fi) -STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector) ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers,) WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,) + WFORMATOVERFLOW := $(call TEST_CC_OPTION,-Wformat-overflow=2,) -OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4 --WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 -Werror=implicit-int \ +-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \ +ifndef RPM_OPT_FLAGS + STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector) + OPTFLAGS := -O2 -g -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \ @@ -40,7 +41,7 @@ index c593fd3b..87fb39f2 100644 +else + OPTFLAGS := $(RPM_OPT_FLAGS) --param=ssp-buffer-size=4 +endif -+WARNFLAGS := -Werror -Wextra -Wformat=2 -Werror=implicit-int \ ++WARNFLAGS := -Werror -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \ -Werror=implicit-function-declaration -Werror=format-security \ - $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) -CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2 @@ -49,7 +50,7 @@ index c593fd3b..87fb39f2 100644 CFLAGS := --std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \ -DBIN_DIR=\"$(bindir)\" -DLIB_STRING=\"${LIB}\" -DRUN_DIR=\"${RUN}\" \ -MMD -MP -@@ -138,4 +150,4 @@ check_file = $(shell \ +@@ -139,4 +151,4 @@ check_file = $(shell \ %.o: %.c @echo building $@ because of $? diff --git a/0006-RH-add-mpathconf.patch b/0021-RH-add-mpathconf.patch similarity index 100% rename from 0006-RH-add-mpathconf.patch rename to 0021-RH-add-mpathconf.patch diff --git a/0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch b/0022-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch similarity index 95% rename from 0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch rename to 0022-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch index 557669b..e842947 100644 --- a/0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch +++ b/0022-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch @@ -20,7 +20,7 @@ Signed-off-by: Benjamin Marzinski 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/multipath/main.c b/multipath/main.c -index ef89c7cf..f618550d 100644 +index 8fc0e15f..9fe53dcd 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -122,7 +122,7 @@ usage (char * progname) @@ -92,16 +92,16 @@ index ef89c7cf..f618550d 100644 static int configure (struct config *conf, enum mpath_cmds cmd, enum devtypes dev_type, char *devpath) -@@ -823,7 +869,7 @@ main (int argc, char *argv[]) - conf = get_multipath_config(); +@@ -828,7 +874,7 @@ main (int argc, char *argv[]) conf->retrigger_tries = 0; conf->force_sync = 1; + atexit(cleanup_vecs); - while ((arg = getopt(argc, argv, ":adDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { + while ((arg = getopt(argc, argv, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { switch(arg) { case 1: printf("optarg : %s\n",optarg); break; -@@ -900,6 +946,10 @@ main (int argc, char *argv[]) +@@ -905,6 +951,10 @@ main (int argc, char *argv[]) case 'T': cmd = CMD_DUMP_CONFIG; break; @@ -138,10 +138,10 @@ index 5b29a5d9..0478f4e7 100644 Remove the WWID for the specified device from the WWIDs file. . diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service -index af592057..bc8fa07a 100644 +index 6d57c7e8..dfc1e962 100644 --- a/multipathd/multipathd.service +++ b/multipathd/multipathd.service -@@ -15,6 +15,7 @@ Type=notify +@@ -16,6 +16,7 @@ Type=notify NotifyAccess=main LimitCORE=infinity ExecStartPre=-/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath diff --git a/0008-RH-reset-default-find_mutipaths-value-to-off.patch b/0023-RH-reset-default-find_mutipaths-value-to-off.patch similarity index 100% rename from 0008-RH-reset-default-find_mutipaths-value-to-off.patch rename to 0023-RH-reset-default-find_mutipaths-value-to-off.patch diff --git a/0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch b/0024-RH-attempt-to-get-ANA-info-via-sysfs-first.patch similarity index 100% rename from 0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch rename to 0024-RH-attempt-to-get-ANA-info-via-sysfs-first.patch diff --git a/0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch b/0025-RH-make-parse_vpd_pg83-match-scsi_id-output.patch similarity index 97% rename from 0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch rename to 0025-RH-make-parse_vpd_pg83-match-scsi_id-output.patch index 0ab20c5..5ae95ee 100644 --- a/0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch +++ b/0025-RH-make-parse_vpd_pg83-match-scsi_id-output.patch @@ -13,7 +13,7 @@ Signed-off-by: Benjamin Marzinski 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c -index ec99a7aa..2704270e 100644 +index bfe2f56c..4bb7ba2f 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1135,12 +1135,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index a1940f8..5662b4d 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,6 +1,6 @@ Name: device-mapper-multipath Version: 0.8.6 -Release: 1%{?dist}.1 +Release: 2%{?dist} Summary: Tools to manage multipath devices using device-mapper License: GPLv2 URL: http://christophe.varoqui.free.fr/ @@ -10,16 +10,31 @@ URL: http://christophe.varoqui.free.fr/ # curl -L https://github.com/opensvc/multipath-tools/archive/0.8.6.tar.gz -o multipath-tools-0.8.6.tgz Source0: multipath-tools-0.8.6.tgz Source1: multipath.conf -Patch0001: 0001-RH-fixup-udev-rules-for-redhat.patch -Patch0002: 0002-RH-Remove-the-property-blacklist-exception-builtin.patch -Patch0003: 0003-RH-don-t-start-without-a-config-file.patch -Patch0004: 0004-RH-Fix-nvme-function-missing-argument.patch -Patch0005: 0005-RH-use-rpm-optflags-if-present.patch -Patch0006: 0006-RH-add-mpathconf.patch -Patch0007: 0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch -Patch0008: 0008-RH-reset-default-find_mutipaths-value-to-off.patch -Patch0009: 0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch -Patch0010: 0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch +Patch0001: 0001-libmultipath-fix-memory-leak-in-checker_cleanup_thre.patch +Patch0002: 0002-multipathd-fix-compilation-issue-with-liburcu-0.8.patch +Patch0003: 0003-multipathd-don-t-fail-to-remove-path-once-the-map-is.patch +Patch0004: 0004-multipathd-remove-duplicate-orphan_paths-in-flush_ma.patch +Patch0005: 0005-multipathd-fix-ev_remove_path-return-code-handling.patch +Patch0006: 0006-multipath-free-vectors-in-configure.patch +Patch0007: 0007-kpartx-Don-t-leak-memory-when-getblock-returns-NULL.patch +Patch0008: 0008-multipathd-don-t-rescan_path-on-wwid-change-in-uev_u.patch +Patch0009: 0009-multipathd-cli_handlers-cleanup-setting-reply-length.patch +Patch0010: 0010-multipathd-cli_getprkey-fix-return-value.patch +Patch0011: 0011-multipath-tools-enable-Wformat-overflow-2.patch +Patch0012: 0012-libdmmp-use-KBUILD_BUILD_TIMESTAMP-when-building-man.patch +Patch0013: 0013-multipath-tools-add-info-about-HPE-Alletra-6000-and-.patch +Patch0014: 0014-multipathd-don-t-start-in-containers.patch +Patch0015: 0015-libmultipath-fix-build-without-LIBDM_API_DEFERRED.patch +Patch0016: 0016-RH-fixup-udev-rules-for-redhat.patch +Patch0017: 0017-RH-Remove-the-property-blacklist-exception-builtin.patch +Patch0018: 0018-RH-don-t-start-without-a-config-file.patch +Patch0019: 0019-RH-Fix-nvme-function-missing-argument.patch +Patch0020: 0020-RH-use-rpm-optflags-if-present.patch +Patch0021: 0021-RH-add-mpathconf.patch +Patch0022: 0022-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch +Patch0023: 0023-RH-reset-default-find_mutipaths-value-to-off.patch +Patch0024: 0024-RH-attempt-to-get-ANA-info-via-sysfs-first.patch +Patch0025: 0025-RH-make-parse_vpd_pg83-match-scsi_id-output.patch # runtime Requires: %{name}-libs = %{version}-%{release} @@ -217,6 +232,14 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog +* Thu Jul 1 2021 Benjamin Marzinski - 0.8.6-2 +- Pull in latest upstream post-tag commits + * Patches 0001-0015 are from + https://github.com/openSUSE/multipath-tools/tree/queue and are + already queued for upstream +- Rename files + * Previous patches 0001-0010 and now patches 0016-0025 + * Wed Jun 23 2021 Cole Robinson - 0.8.6-1.fc35.1 - Rebuild for userspace-rcu soname bump