From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Wed, 20 Feb 2019 17:05:08 -0600 Subject: [PATCH] BZ 1673167: ignore failed wwid recheck If disable_changed_wwids is set, when multipathd gets a change event on a path, it verifies that the wwid hasn't changed in uev_update_path(). If get_uid() failed, uev_update_path treated this as a wwid change to 0. This could cause paths to suddenly be dropped due to an issue with getting the wwid. Even if get_uid() failed because the path was down, it no change uevent happend when it later became active, multipathd would continue to ignore the path. Instead, multipathd should neither set nor clear wwid_changed if get_uid() returned failure. Signed-off-by: Benjamin Marzinski --- multipathd/main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/multipathd/main.c b/multipathd/main.c index 82a298b..30eb8fe 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -1211,9 +1211,9 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) goto out; strcpy(wwid, pp->wwid); - get_uid(pp, pp->state, uev->udev); + rc = get_uid(pp, pp->state, uev->udev); - if (strncmp(wwid, pp->wwid, WWID_SIZE) != 0) { + if (rc == 0 && strncmp(wwid, pp->wwid, WWID_SIZE) != 0) { condlog(0, "%s: path wwid changed from '%s' to '%s'. %s", uev->kernel, wwid, pp->wwid, (disable_changed_wwids ? "disallowing" : @@ -1229,7 +1229,8 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) goto out; } } else { - pp->wwid_changed = 0; + if (rc == 0) + pp->wwid_changed = 0; udev_device_unref(pp->udev); pp->udev = udev_device_ref(uev->udev); conf = get_multipath_config(); @@ -1782,6 +1783,7 @@ int update_prio(struct path *pp, int refresh_all) int update_path_groups(struct multipath *mpp, struct vectors *vecs, int refresh) { + condlog(2, "%s: updating path groups for priority change", mpp->alias); if (reload_map(vecs, mpp, refresh, 1)) return 1; -- 2.17.2