From f9d1421d55c926c2b7f8d028f85880a1bebf7a10 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Tue, 18 Jan 2022 15:53:43 -0600 Subject: [PATCH] device-mapper-multipath-0.8.7-4 Add 0035-RH-mpathconf-fix-setting-property_blacklist.patch Add 0036-libmultipath-fix-disassemble-status-for-historical-s.patch * Fixes bz #2042032 Add 0037-libmultipath-make-helper-function-to-trigger-path-ue.patch Add 0038-multipathd-trigger-udev-change-on-path-addition.patch * Fixes bz #2028835 Resolves: bz #2028835, #2042032 --- ...hconf-fix-setting-property_blacklist.patch | 34 +++++ ...-disassemble-status-for-historical-s.patch | 45 ++++++ ...e-helper-function-to-trigger-path-ue.patch | 133 ++++++++++++++++++ ...trigger-udev-change-on-path-addition.patch | 54 +++++++ device-mapper-multipath.spec | 15 +- 5 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 0035-RH-mpathconf-fix-setting-property_blacklist.patch create mode 100644 0036-libmultipath-fix-disassemble-status-for-historical-s.patch create mode 100644 0037-libmultipath-make-helper-function-to-trigger-path-ue.patch create mode 100644 0038-multipathd-trigger-udev-change-on-path-addition.patch diff --git a/0035-RH-mpathconf-fix-setting-property_blacklist.patch b/0035-RH-mpathconf-fix-setting-property_blacklist.patch new file mode 100644 index 0000000..846ba28 --- /dev/null +++ b/0035-RH-mpathconf-fix-setting-property_blacklist.patch @@ -0,0 +1,34 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 13 Dec 2021 14:26:30 -0600 +Subject: [PATCH] RH: mpathconf: fix setting property_blacklist + +If there was no blacklist_exceptions section, setting property_blacklist +didn't work correctly. Fix it. + +Signed-off-by: Benjamin Marzinski +--- + multipath/mpathconf | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/multipath/mpathconf b/multipath/mpathconf +index c00d2555..0de6b121 100644 +--- a/multipath/mpathconf ++++ b/multipath/mpathconf +@@ -496,7 +496,15 @@ if [ "$PROPERTY" = "n" ]; then + CHANGED_CONFIG=1 + fi + elif [ "$PROPERTY" = "y" ]; then +- if [ -z "$HAVE_PROPERTY" ]; then ++ if [ -z "$HAVE_PROPERTY" -a -z "$HAVE_EXCEPTIONS" ]; then ++ cat >> $TMPFILE << _EOF_ ++ ++blacklist_exceptions { ++ property "(SCSI_IDENT_|ID_WWN)" ++} ++_EOF_ ++ CHANGED_CONFIG=1 ++ elif [ -z "$HAVE_PROPERTY" ]; then + sed -i '/^blacklist_exceptions[[:space:]]*{/ a\ + property "(SCSI_IDENT_|ID_WWN)" + ' $TMPFILE diff --git a/0036-libmultipath-fix-disassemble-status-for-historical-s.patch b/0036-libmultipath-fix-disassemble-status-for-historical-s.patch new file mode 100644 index 0000000..bd96ede --- /dev/null +++ b/0036-libmultipath-fix-disassemble-status-for-historical-s.patch @@ -0,0 +1,45 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Wed, 12 Jan 2022 12:26:12 -0600 +Subject: [PATCH] libmultipath: fix disassemble status for + historical-service-time PS + +The historical-service-time path selector prints out 2 path group status +arguments. This is the only path selector that uses the group status +arguments. All the others only have path status arguments. +disassemble_status() was expecting the number of group status arguments +to always be zero, causing it to fail at disassembling the status of +devices that use historical-service-time path selector. Now multipath +actually checks the number of group arguments, and skips them. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/dmparser.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c +index 4ba7f339..bc311421 100644 +--- a/libmultipath/dmparser.c ++++ b/libmultipath/dmparser.c +@@ -437,9 +437,19 @@ int disassemble_status(const char *params, struct multipath *mpp) + FREE(word); + + /* +- * PG Status (discarded, would be '0' anyway) ++ * Path Selector Group Arguments + */ +- p += get_word(p, NULL); ++ p += get_word(p, &word); ++ ++ if (!word) ++ return 1; ++ ++ num_pg_args = atoi(word); ++ free(word); ++ ++ /* Ignore ps group arguments */ ++ for (j = 0; j < num_pg_args; j++) ++ p += get_word(p, NULL); + + p += get_word(p, &word); + diff --git a/0037-libmultipath-make-helper-function-to-trigger-path-ue.patch b/0037-libmultipath-make-helper-function-to-trigger-path-ue.patch new file mode 100644 index 0000000..116893c --- /dev/null +++ b/0037-libmultipath-make-helper-function-to-trigger-path-ue.patch @@ -0,0 +1,133 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 Jan 2022 14:45:38 -0600 +Subject: [PATCH] libmultipath: make helper function to trigger path uevents + +Pull the code that checks if a path needs to trigger a uevent, and +triggers, out of trigger_paths_udev_change() and into a new function, +trigger_path_udev_change(). This function will be used separately by +a future patch. No functional changes. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 79 +++++++++++++++++++++------------------- + libmultipath/configure.h | 1 + + 2 files changed, 43 insertions(+), 37 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index 7edb355b..043e4232 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -565,11 +565,8 @@ unref: + } + + void +-trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) ++trigger_path_udev_change(struct path *pp, bool is_mpath) + { +- struct pathgroup *pgp; +- struct path *pp; +- int i, j; + /* + * If a path changes from multipath to non-multipath, we must + * synthesize an artificial "add" event, otherwise the LVM2 rules +@@ -577,6 +574,45 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) + * irritate ourselves with an "add", so use "change". + */ + const char *action = is_mpath ? "change" : "add"; ++ const char *env; ++ ++ if (!pp->udev) ++ return; ++ /* ++ * Paths that are already classified as multipath ++ * members don't need another uevent. ++ */ ++ env = udev_device_get_property_value( ++ pp->udev, "DM_MULTIPATH_DEVICE_PATH"); ++ ++ if (is_mpath && env != NULL && !strcmp(env, "1")) { ++ /* ++ * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", ++ * path is in "maybe" state and timer is running ++ * Send uevent now (see multipath.rules). ++ */ ++ env = udev_device_get_property_value( ++ pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); ++ if (env == NULL || !strcmp(env, "0")) ++ return; ++ } else if (!is_mpath && ++ (env == NULL || !strcmp(env, "0"))) ++ return; ++ ++ condlog(3, "triggering %s uevent for %s (is %smultipath member)", ++ action, pp->dev, is_mpath ? "" : "no "); ++ sysfs_attr_set_value(pp->udev, "uevent", ++ action, strlen(action)); ++ trigger_partitions_udev_change(pp->udev, action, ++ strlen(action)); ++} ++ ++void ++trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) ++{ ++ struct pathgroup *pgp; ++ struct path *pp; ++ int i, j; + + if (!mpp || !mpp->pg) + return; +@@ -584,39 +620,8 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) + vector_foreach_slot (mpp->pg, pgp, i) { + if (!pgp->paths) + continue; +- vector_foreach_slot(pgp->paths, pp, j) { +- const char *env; +- +- if (!pp->udev) +- continue; +- /* +- * Paths that are already classified as multipath +- * members don't need another uevent. +- */ +- env = udev_device_get_property_value( +- pp->udev, "DM_MULTIPATH_DEVICE_PATH"); +- +- if (is_mpath && env != NULL && !strcmp(env, "1")) { +- /* +- * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", +- * path is in "maybe" state and timer is running +- * Send uevent now (see multipath.rules). +- */ +- env = udev_device_get_property_value( +- pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); +- if (env == NULL || !strcmp(env, "0")) +- continue; +- } else if (!is_mpath && +- (env == NULL || !strcmp(env, "0"))) +- continue; +- +- condlog(3, "triggering %s uevent for %s (is %smultipath member)", +- action, pp->dev, is_mpath ? "" : "no "); +- sysfs_attr_set_value(pp->udev, "uevent", +- action, strlen(action)); +- trigger_partitions_udev_change(pp->udev, action, +- strlen(action)); +- } ++ vector_foreach_slot(pgp->paths, pp, j) ++ trigger_path_udev_change(pp, is_mpath); + } + + mpp->needs_paths_uevent = 0; +diff --git a/libmultipath/configure.h b/libmultipath/configure.h +index efe18b7d..2bf73e65 100644 +--- a/libmultipath/configure.h ++++ b/libmultipath/configure.h +@@ -56,6 +56,7 @@ int coalesce_paths (struct vectors *vecs, vector curmp, char * refwwid, int forc + int get_refwwid (enum mpath_cmds cmd, const char *dev, enum devtypes dev_type, + vector pathvec, char **wwid); + struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type); ++void trigger_path_udev_change(struct path *pp, bool is_mpath); + 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); diff --git a/0038-multipathd-trigger-udev-change-on-path-addition.patch b/0038-multipathd-trigger-udev-change-on-path-addition.patch new file mode 100644 index 0000000..1386f0e --- /dev/null +++ b/0038-multipathd-trigger-udev-change-on-path-addition.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 17 Jan 2022 16:46:18 -0600 +Subject: [PATCH] multipathd: trigger udev change on path addition + +When a multipath device is created for the first time, there is a window +where some path devices way be added to the multipath device, but never +claimed in udev. This can allow other device owners, like lvm, to think +they can use the device. + +When a multipath device is first created, all the existing paths that +are not claimed by multipath have a uevent triggered so that they can +get claimed. After that, multipath assumes all future paths added to the +multipath device will have been claimed by multipath, since the device's +WWID is now in the wwids file. This doesn't work for any paths that +have already been processed by the multipath.rules udev rules before +the multipath device was created. + +To close this window, when path device is added, and a matching +multipath device already exists, multipathd now checks if the device is +claimed by multipath, and if not, triggers a uevent to claim it. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/libmultipath.version | 5 +++++ + multipathd/main.c | 2 ++ + 2 files changed, 7 insertions(+) + +diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version +index dd1b4122..0d89e9e1 100644 +--- a/libmultipath/libmultipath.version ++++ b/libmultipath/libmultipath.version +@@ -292,3 +292,8 @@ LIBMULTIPATH_9.1.0 { + global: + sysfs_get_ro; + } LIBMULTIPATH_9.0.0; ++ ++LIBMULTIPATH_9.1.1 { ++global: ++ trigger_path_udev_change; ++} LIBMULTIPATH_9.1.0; +diff --git a/multipathd/main.c b/multipathd/main.c +index 6145e512..5def5301 100644 +--- a/multipathd/main.c ++++ b/multipathd/main.c +@@ -1062,6 +1062,8 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map) + free_path(pp); + return 1; + } ++ if (mpp) ++ trigger_path_udev_change(pp, true); + if (mpp && mpp->wait_for_udev && + (pathcount(mpp, PATH_UP) > 0 || + (pathcount(mpp, PATH_GHOST) > 0 && diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index f48572c..7083203 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,6 +1,6 @@ Name: device-mapper-multipath Version: 0.8.7 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Tools to manage multipath devices using device-mapper License: GPLv2 URL: http://christophe.varoqui.free.fr/ @@ -44,6 +44,10 @@ Patch0031: 0031-libmultipath-cleanup-invalid-config-handling.patch Patch0032: 0032-libmultipath-don-t-return-error-on-invalid-values.patch Patch0033: 0033-multipathd-avoid-unnecessary-path-read-only-reloads.patch Patch0034: 0034-multipath-fix-exit-status-of-multipath-T.patch +Patch0035: 0035-RH-mpathconf-fix-setting-property_blacklist.patch +Patch0036: 0036-libmultipath-fix-disassemble-status-for-historical-s.patch +Patch0037: 0037-libmultipath-make-helper-function-to-trigger-path-ue.patch +Patch0038: 0038-multipathd-trigger-udev-change-on-path-addition.patch # runtime @@ -243,6 +247,15 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog +* Tue Jan 18 2022 Benjamin Marzinski - 0.8.7-4 +- Add 0035-RH-mpathconf-fix-setting-property_blacklist.patch +- Add 0036-libmultipath-fix-disassemble-status-for-historical-s.patch + * Fixes bz #2042032 +- Add 0037-libmultipath-make-helper-function-to-trigger-path-ue.patch +- Add 0038-multipathd-trigger-udev-change-on-path-addition.patch + * Fixes bz #2028835 +- Resolves: bz #2028835, #2042032 + * Fri Nov 19 2021 Benjamin Marzinski - 0.8.7-3 - Add 0024-libmultipath-use-typedef-for-keyword-handler-functio.patch - Add 0025-libmultipath-print-the-correct-file-when-parsing-fai.patch