From 98ccf5525443b8b670bcf2b779b76e0e9db6caac Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 1 Feb 2023 18:31:32 -0600 Subject: [PATCH] device-mapper-multipath-0.8.7-18 Add 0079-libmultipath-use-select_reload_action-in-select_acti.patch Add 0080-libmultipath-select-resize-action-even-if-reload-is-.patch Add 0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch Add 0082-libmultipath-keep-renames-from-stopping-other-multip.patch Resolves: bz #2162536 --- ...-select_reload_action-in-select_acti.patch | 38 ++++ ...ect-resize-action-even-if-reload-is-.patch | 45 +++++ ...anup-ACT_CREATE-code-in-select_actio.patch | 67 +++++++ ...p-renames-from-stopping-other-multip.patch | 185 ++++++++++++++++++ device-mapper-multipath.spec | 13 +- 5 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 0079-libmultipath-use-select_reload_action-in-select_acti.patch create mode 100644 0080-libmultipath-select-resize-action-even-if-reload-is-.patch create mode 100644 0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch create mode 100644 0082-libmultipath-keep-renames-from-stopping-other-multip.patch diff --git a/0079-libmultipath-use-select_reload_action-in-select_acti.patch b/0079-libmultipath-use-select_reload_action-in-select_acti.patch new file mode 100644 index 0000000..1551cd2 --- /dev/null +++ b/0079-libmultipath-use-select_reload_action-in-select_acti.patch @@ -0,0 +1,38 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Mon, 30 Jan 2023 19:54:19 -0600 +Subject: [PATCH] libmultipath: use select_reload_action in select_action + +Since we have a function to set the action to reload, use it. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index 193bf27d..09d7de0f 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -771,9 +771,7 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + + if (force_reload) { + mpp->force_udev_reload = 1; +- mpp->action = ACT_RELOAD; +- condlog(3, "%s: set ACT_RELOAD (forced by user)", +- mpp->alias); ++ select_reload_action(mpp, "forced by user"); + return; + } + if (cmpp->size != mpp->size) { +@@ -786,9 +784,7 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + + if (!is_udev_ready(cmpp) && count_active_paths(mpp) > 0) { + mpp->force_udev_reload = 1; +- mpp->action = ACT_RELOAD; +- condlog(3, "%s: set ACT_RELOAD (udev incomplete)", +- mpp->alias); ++ select_reload_action(mpp, "udev incomplete"); + return; + } + diff --git a/0080-libmultipath-select-resize-action-even-if-reload-is-.patch b/0080-libmultipath-select-resize-action-even-if-reload-is-.patch new file mode 100644 index 0000000..4bb7c6f --- /dev/null +++ b/0080-libmultipath-select-resize-action-even-if-reload-is-.patch @@ -0,0 +1,45 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Tue, 31 Jan 2023 09:58:55 -0600 +Subject: [PATCH] libmultipath: select resize action even if reload is forced + +The ACT_RESIZE action is the same as the ACT_RELOAD action, except that +it flushes outstanding IO because the device size is changing and +the new size might be too small for some of the outstanding IO. If we've +detected a size change, and a forced reload is requested, we still need +to flush the IO because the reload will change the device size. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index 09d7de0f..c91a8139 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -769,11 +769,6 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + return; + } + +- if (force_reload) { +- mpp->force_udev_reload = 1; +- select_reload_action(mpp, "forced by user"); +- return; +- } + if (cmpp->size != mpp->size) { + mpp->force_udev_reload = 1; + mpp->action = ACT_RESIZE; +@@ -782,6 +777,12 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + return; + } + ++ if (force_reload) { ++ mpp->force_udev_reload = 1; ++ select_reload_action(mpp, "forced by user"); ++ return; ++ } ++ + if (!is_udev_ready(cmpp) && count_active_paths(mpp) > 0) { + mpp->force_udev_reload = 1; + select_reload_action(mpp, "udev incomplete"); diff --git a/0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch b/0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch new file mode 100644 index 0000000..c98d41a --- /dev/null +++ b/0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch @@ -0,0 +1,67 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Tue, 31 Jan 2023 10:35:10 -0600 +Subject: [PATCH] libmultipath: cleanup ACT_CREATE code in select_action + +Combine the two separate blocks that set ACT_CREATE into one. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 38 +++++++++++++++++--------------------- + 1 file changed, 17 insertions(+), 21 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index c91a8139..24d051dd 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -728,33 +728,29 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + cmpp = find_mp_by_wwid(curmp, mpp->wwid); + cmpp_by_name = find_mp_by_alias(curmp, mpp->alias); + +- if (!cmpp_by_name) { +- if (cmpp) { +- condlog(2, "%s: rename %s to %s", mpp->wwid, +- cmpp->alias, mpp->alias); +- strlcpy(mpp->alias_old, cmpp->alias, WWID_SIZE); +- mpp->action = ACT_RENAME; +- if (force_reload) { +- mpp->force_udev_reload = 1; +- mpp->action = ACT_FORCERENAME; +- } +- return; ++ if (!cmpp) { ++ if (cmpp_by_name) { ++ condlog(1, "%s: can't use alias \"%s\" used by %s, falling back to WWID", ++ mpp->wwid, mpp->alias, cmpp_by_name->wwid); ++ /* We can do this because wwid wasn't found */ ++ free(mpp->alias); ++ mpp->alias = strdup(mpp->wwid); + } + mpp->action = ACT_CREATE; +- condlog(3, "%s: set ACT_CREATE (map does not exist)", +- mpp->alias); ++ condlog(3, "%s: set ACT_CREATE (map does not exist%s)", ++ mpp->alias, cmpp_by_name ? ", name changed" : ""); + return; + } + +- if (!cmpp) { +- condlog(1, "%s: can't use alias \"%s\" used by %s, falling back to WWID", +- mpp->wwid, mpp->alias, cmpp_by_name->wwid); +- /* We can do this because wwid wasn't found */ +- free(mpp->alias); +- mpp->alias = strdup(mpp->wwid); +- mpp->action = ACT_CREATE; +- condlog(3, "%s: set ACT_CREATE (map does not exist, name changed)", ++ if (!cmpp_by_name) { ++ condlog(2, "%s: rename %s to %s", mpp->wwid, cmpp->alias, + mpp->alias); ++ strlcpy(mpp->alias_old, cmpp->alias, WWID_SIZE); ++ mpp->action = ACT_RENAME; ++ if (force_reload) { ++ mpp->force_udev_reload = 1; ++ mpp->action = ACT_FORCERENAME; ++ } + return; + } + diff --git a/0082-libmultipath-keep-renames-from-stopping-other-multip.patch b/0082-libmultipath-keep-renames-from-stopping-other-multip.patch new file mode 100644 index 0000000..754c93f --- /dev/null +++ b/0082-libmultipath-keep-renames-from-stopping-other-multip.patch @@ -0,0 +1,185 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Benjamin Marzinski +Date: Tue, 31 Jan 2023 12:00:31 -0600 +Subject: [PATCH] libmultipath: keep renames from stopping other multipath + actions + +If select_action() is called and a multipath device needs to be renamed, +the code currently checks if force_reload is set, and if so, does the +reload after the rename. But if force_reload isn't set, only the rename +happens, regardless of what other actions are needed. This can happen if +multipathd starts up and a device needs both a reload and a rename. + +Make multipath check for resize, reload, and switch pathgroup along with +rename, and do both if necessary. + +Signed-off-by: Benjamin Marzinski +--- + libmultipath/configure.c | 62 +++++++++++++++++----------------------- + libmultipath/configure.h | 4 ++- + 2 files changed, 30 insertions(+), 36 deletions(-) + +diff --git a/libmultipath/configure.c b/libmultipath/configure.c +index 24d051dd..bbdbb8ca 100644 +--- a/libmultipath/configure.c ++++ b/libmultipath/configure.c +@@ -714,7 +714,8 @@ static bool is_udev_ready(struct multipath *cmpp) + static void + select_reload_action(struct multipath *mpp, const char *reason) + { +- mpp->action = ACT_RELOAD; ++ mpp->action = mpp->action == ACT_RENAME ? ACT_RELOAD_RENAME : ++ ACT_RELOAD; + condlog(3, "%s: set ACT_RELOAD (%s)", mpp->alias, reason); + } + +@@ -725,6 +726,7 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + struct multipath * cmpp_by_name; + char * mpp_feat, * cmpp_feat; + ++ mpp->action = ACT_NOTHING; + cmpp = find_mp_by_wwid(curmp, mpp->wwid); + cmpp_by_name = find_mp_by_alias(curmp, mpp->alias); + +@@ -747,14 +749,8 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + mpp->alias); + strlcpy(mpp->alias_old, cmpp->alias, WWID_SIZE); + mpp->action = ACT_RENAME; +- if (force_reload) { +- mpp->force_udev_reload = 1; +- mpp->action = ACT_FORCERENAME; +- } +- return; +- } +- +- if (cmpp != cmpp_by_name) { ++ /* don't return here. Check for other needed actions */ ++ } else if (cmpp != cmpp_by_name) { + condlog(2, "%s: unable to rename %s to %s (%s is used by %s)", + mpp->wwid, cmpp->alias, mpp->alias, + mpp->alias, cmpp_by_name->wwid); +@@ -762,12 +758,13 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + FREE(mpp->alias); + mpp->alias = STRDUP(cmpp->alias); + mpp->action = ACT_IMPOSSIBLE; +- return; ++ /* don't return here. Check for other needed actions */ + } + + if (cmpp->size != mpp->size) { + mpp->force_udev_reload = 1; +- mpp->action = ACT_RESIZE; ++ mpp->action = mpp->action == ACT_RENAME ? ACT_RESIZE_RENAME : ++ ACT_RESIZE; + condlog(3, "%s: set ACT_RESIZE (size change)", + mpp->alias); + return; +@@ -843,14 +840,14 @@ void select_action (struct multipath *mpp, const struct _vector *curmp, + return; + } + if (cmpp->nextpg != mpp->bestpg) { +- mpp->action = ACT_SWITCHPG; ++ mpp->action = mpp->action == ACT_RENAME ? ACT_SWITCHPG_RENAME : ++ ACT_SWITCHPG; + condlog(3, "%s: set ACT_SWITCHPG (next path group change)", + mpp->alias); + return; + } +- mpp->action = ACT_NOTHING; +- condlog(3, "%s: set ACT_NOTHING (map unchanged)", +- mpp->alias); ++ if (mpp->action == ACT_NOTHING) ++ condlog(3, "%s: set ACT_NOTHING (map unchanged)", mpp->alias); + return; + } + +@@ -951,6 +948,17 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + } + } + ++ if (mpp->action == ACT_RENAME || mpp->action == ACT_SWITCHPG_RENAME || ++ mpp->action == ACT_RELOAD_RENAME || ++ mpp->action == ACT_RESIZE_RENAME) { ++ conf = get_multipath_config(); ++ pthread_cleanup_push(put_multipath_config, conf); ++ r = dm_rename(mpp->alias_old, mpp->alias, ++ conf->partition_delim, mpp->skip_kpartx); ++ pthread_cleanup_pop(1); ++ if (r == DOMAP_FAIL) ++ return r; ++ } + switch (mpp->action) { + case ACT_REJECT: + case ACT_NOTHING: +@@ -958,6 +966,7 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + return DOMAP_EXIST; + + case ACT_SWITCHPG: ++ case ACT_SWITCHPG_RENAME: + dm_switchgroup(mpp->alias, mpp->bestpg); + /* + * we may have avoided reinstating paths because there where in +@@ -984,6 +993,7 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + break; + + case ACT_RELOAD: ++ case ACT_RELOAD_RENAME: + sysfs_set_max_sectors_kb(mpp, 1); + if (mpp->ghost_delay_tick > 0 && pathcount(mpp, PATH_UP)) + mpp->ghost_delay_tick = 0; +@@ -991,6 +1001,7 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + break; + + case ACT_RESIZE: ++ case ACT_RESIZE_RENAME: + sysfs_set_max_sectors_kb(mpp, 1); + if (mpp->ghost_delay_tick > 0 && pathcount(mpp, PATH_UP)) + mpp->ghost_delay_tick = 0; +@@ -998,29 +1009,10 @@ int domap(struct multipath *mpp, char *params, int is_daemon) + break; + + case ACT_RENAME: +- conf = get_multipath_config(); +- pthread_cleanup_push(put_multipath_config, conf); +- r = dm_rename(mpp->alias_old, mpp->alias, +- conf->partition_delim, mpp->skip_kpartx); +- pthread_cleanup_pop(1); +- break; +- +- case ACT_FORCERENAME: +- conf = get_multipath_config(); +- pthread_cleanup_push(put_multipath_config, conf); +- r = dm_rename(mpp->alias_old, mpp->alias, +- conf->partition_delim, mpp->skip_kpartx); +- pthread_cleanup_pop(1); +- if (r) { +- sysfs_set_max_sectors_kb(mpp, 1); +- if (mpp->ghost_delay_tick > 0 && +- pathcount(mpp, PATH_UP)) +- mpp->ghost_delay_tick = 0; +- r = dm_addmap_reload(mpp, params, 0); +- } + break; + + default: ++ r = DOMAP_FAIL; + break; + } + +diff --git a/libmultipath/configure.h b/libmultipath/configure.h +index 2bf73e65..9d935db3 100644 +--- a/libmultipath/configure.h ++++ b/libmultipath/configure.h +@@ -18,9 +18,11 @@ enum actions { + ACT_RENAME, + ACT_CREATE, + ACT_RESIZE, +- ACT_FORCERENAME, ++ ACT_RELOAD_RENAME, + ACT_DRY_RUN, + ACT_IMPOSSIBLE, ++ ACT_RESIZE_RENAME, ++ ACT_SWITCHPG_RENAME, + }; + + /* diff --git a/device-mapper-multipath.spec b/device-mapper-multipath.spec index 844e7d5..b1a4439 100644 --- a/device-mapper-multipath.spec +++ b/device-mapper-multipath.spec @@ -1,6 +1,6 @@ Name: device-mapper-multipath Version: 0.8.7 -Release: 17%{?dist} +Release: 18%{?dist} Summary: Tools to manage multipath devices using device-mapper License: GPLv2 URL: http://christophe.varoqui.free.fr/ @@ -88,6 +88,10 @@ Patch0075: 0075-libmultipath-enforce-queue_mode-bio-for-nmve-tcp-pat.patch Patch0076: 0076-multipath.conf-5-remove-io-affinity-information.patch Patch0077: 0077-libmultipath-don-t-leak-memory-on-invalid-strings.patch Patch0078: 0078-libmutipath-validate-the-argument-count-of-config-st.patch +Patch0079: 0079-libmultipath-use-select_reload_action-in-select_acti.patch +Patch0080: 0080-libmultipath-select-resize-action-even-if-reload-is-.patch +Patch0081: 0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch +Patch0082: 0082-libmultipath-keep-renames-from-stopping-other-multip.patch # runtime @@ -290,6 +294,13 @@ fi %{_pkgconfdir}/libdmmp.pc %changelog +* Wed Feb 1 2023 Benjamin Marzinski - 0.8.7-18 +- Add 0079-libmultipath-use-select_reload_action-in-select_acti.patch +- Add 0080-libmultipath-select-resize-action-even-if-reload-is-.patch +- Add 0081-libmultipath-cleanup-ACT_CREATE-code-in-select_actio.patch +- Add 0082-libmultipath-keep-renames-from-stopping-other-multip.patch +- Resolves: bz #2162536 + * Wed Dec 21 2022 Benjamin Marzinski - 0.8.7-17 - Add 0077-libmultipath-don-t-leak-memory-on-invalid-strings.patch - Add 0078-libmutipath-validate-the-argument-count-of-config-st.patch