3ec0ebefcd
- Update Source to latest upstream commit * Previous patches 0001-0011 are included in this commit - Rename files * Previous patches 0012-0019 are now patches 0021-0028 - Add 0001-libmultipath-fix-tur-checker-timeout.patch - Add 0002-libmultipath-fix-tur-checker-double-locking.patch - Add 0003-libmultipath-fix-tur-memory-misuse.patch - Add 0004-libmultipath-cleanup-tur-locking.patch - Add 0005-libmultipath-fix-tur-checker-timeout-issue.patch * The above 5 patches cleanup locking issues with the tur checker threads - Add 0006-libmultipath-fix-set_int-error-path.patch - Add 0007-libmultipath-fix-length-issues-in-get_vpd_sgio.patch - Add 0008-libmultipath-_install_keyword-cleanup.patch - Add 0009-libmultipath-remove-unused-code.patch - Add 0010-libmultipath-fix-memory-issue-in-path_latency-prio.patch - Add 0011-libmultipath-fix-null-dereference-int-alloc_path_gro.patch - Add 0012-libmutipath-don-t-use-malformed-uevents.patch - Add 0013-multipath-fix-max-array-size-in-print_cmd_valid.patch - Add 0014-multipathd-function-return-value-tweaks.patch - Add 0015-multipathd-minor-fixes.patch - Add 0016-multipathd-remove-useless-check-and-fix-format.patch - Add 0017-multipathd-fix-memory-leak-on-error-in-configure.patch * The above 12 patches fix minor issues found by coverity - Add 0018-libmultipath-Don-t-blank-intialized-paths.patch - Add 0019-libmultipath-Fixup-updating-paths.patch * Fix issues with paths whose wwid was not set or later changes - Add 0020-multipath-tweak-logging-style.patch * multipathd interactive commands now send errors to stderr, instead of syslog * The above 20 patches have been submitted upstream
95 lines
3.3 KiB
Diff
95 lines
3.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Date: Fri, 21 Sep 2018 16:05:43 -0500
|
|
Subject: [PATCH] libmultipath: Fixup updating paths
|
|
|
|
Commit 582c56cc broke some code paths in uev_update_path. First, it
|
|
changed the handling of paths that were not fully initialized.
|
|
uev_update_path was simply setting the wwids for all of these paths.
|
|
Instead, it should ignore the ones that had not requested a new uevent.
|
|
These paths are likely down, and are already getting handled by
|
|
check_path, after it verifies that they have become active. Also,
|
|
setting the wwid doesn't update all of the other information that
|
|
may have been missed when the path was initially added.
|
|
|
|
Also, it wasn't possible for pp->wwid_changed to transition back to
|
|
zero, unless the path's wwid was empty, in which case there was no
|
|
reason to worry about the wwid change in the first place, since the path
|
|
hadn't been fully initialized yet. So, even if a path's wwid changed and
|
|
then changed back to the original value, the path still could not be
|
|
used.
|
|
|
|
This patch fixes these issues, and also moves the check for paths that
|
|
have requested a new uevent up in the functions. These paths will get
|
|
fully reinitialized anyway, so there is no reason to do all the other
|
|
work first.
|
|
|
|
Fixes: 582c56cc ("libmultipath: uev_update_path: always warn if WWID
|
|
changed")
|
|
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
---
|
|
multipathd/main.c | 24 ++++++++++++++----------
|
|
1 file changed, 14 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
index 61ca455..d6d122a 100644
|
|
--- a/multipathd/main.c
|
|
+++ b/multipathd/main.c
|
|
@@ -1207,6 +1207,15 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
struct multipath *mpp = pp->mpp;
|
|
char wwid[WWID_SIZE];
|
|
|
|
+ if (pp->initialized == INIT_REQUESTED_UDEV) {
|
|
+ needs_reinit = 1;
|
|
+ goto out;
|
|
+ }
|
|
+ /* Don't deal with other types of failed initialization
|
|
+ * now. check_path will handle it */
|
|
+ if (!strlen(pp->wwid))
|
|
+ goto out;
|
|
+
|
|
strcpy(wwid, pp->wwid);
|
|
get_uid(pp, pp->state, uev->udev);
|
|
|
|
@@ -1215,9 +1224,8 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
uev->kernel, wwid, pp->wwid,
|
|
(disable_changed_wwids ? "disallowing" :
|
|
"continuing"));
|
|
- if (disable_changed_wwids &&
|
|
- (strlen(wwid) || pp->wwid_changed)) {
|
|
- strcpy(pp->wwid, wwid);
|
|
+ strcpy(pp->wwid, wwid);
|
|
+ if (disable_changed_wwids) {
|
|
if (!pp->wwid_changed) {
|
|
pp->wwid_changed = 1;
|
|
pp->tick = 1;
|
|
@@ -1225,11 +1233,9 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
dm_fail_path(pp->mpp->alias, pp->dev_t);
|
|
}
|
|
goto out;
|
|
- } else if (!disable_changed_wwids)
|
|
- strcpy(pp->wwid, wwid);
|
|
- else
|
|
- pp->wwid_changed = 0;
|
|
+ }
|
|
} else {
|
|
+ pp->wwid_changed = 0;
|
|
udev_device_unref(pp->udev);
|
|
pp->udev = udev_device_ref(uev->udev);
|
|
conf = get_multipath_config();
|
|
@@ -1240,9 +1246,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
pthread_cleanup_pop(1);
|
|
}
|
|
|
|
- if (pp->initialized == INIT_REQUESTED_UDEV)
|
|
- needs_reinit = 1;
|
|
- else if (mpp && ro >= 0) {
|
|
+ if (mpp && ro >= 0) {
|
|
condlog(2, "%s: update path write_protect to '%d' (uevent)", uev->kernel, ro);
|
|
|
|
if (mpp->wait_for_udev)
|
|
--
|
|
2.7.4
|
|
|