Currently, multipath still prints the 'spurious uevent, path not found'
message if a path is blacklisted by something different than a devnode
in the 'change' uevent handling. (uev_trigger() calls filter_devnode()).
Thus blacklisting by device vendor/product and wwid still renders that
message in the system log -- since it's verbosity level 0 -- for paths
that are explicitly marked to be ignored.
This problem happens on common scenarios such as creating filesystems
on a blacklisted device (e.g., mkfs.* /dev/sdX), which is usually run
several times on test environments, and the error message may mislead
the error checker/monitor tools with false negatives.
This patch resolves this problem by calling/checking path_discover()
for PATHINFO_SKIPPED with just enough device information flags for
blacklist verification -- and it prints a debug message (verbosity
level 3) instead of an error message since this case is not an error.
Even though it introduces a bit of overhead to get the path info,
it is only exercised in the error/non-default path -- so not a problem.
Test-case (on QEMU):
/etc/multipath.conf:
blacklist {
device {
vendor "QEMU"
}
}
# multipathd -d &
...
Dec 10 08:06:27 | sda: (QEMU:QEMU HARDDISK) vendor/product blacklisted
...
# mkfs.ext3 -F /dev/sda
...
Dec 10 08:07:05 | sda: spurious uevent, path not found
With the patch applied, no message is printed by default.
It's still possible to get the event logged for debug with '-v3':
Dec 10 09:08:51 | sda: spurious uevent, path blacklisted
Reported-by: Yueh Chyong (Ida) Jackson <[email protected]>
Signed-off-by: Mauricio Faria de Oliveira <[email protected]>
---
multipathd/main.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/multipathd/main.c b/multipathd/main.c
index d6f081f..364fecb 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1010,8 +1010,28 @@ uev_update_path (struct uevent *uev, struct vectors *
vecs)
}
out:
lock_cleanup_pop(vecs->lock);
- if (!pp)
+ if (!pp) {
+ /* If the path is blacklisted, print a debug/non-default
verbosity message. */
+ if (uev->udev) {
+ int flag = DI_BLACKLIST | DI_SYSFS | DI_WWID;
+ struct udev_device *udevice;
+
+ udevice = udev_device_ref(uev->udev);
+ conf = get_multipath_config();
+
+ retval = path_discover(NULL, conf, udevice, flag);
+
+ put_multipath_config(conf);
+ udev_device_unref(uev->udev);
+
+ if (retval == PATHINFO_SKIPPED) {
+ condlog(3, "%s: spurious uevent, path
blacklisted", uev->kernel);
+ return 0;
+ }
+ }
+
condlog(0, "%s: spurious uevent, path not found", uev->kernel);
+ }
return retval;
}
--
2.7.4
--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel