From 2b8b89c6b3f72b2378867c61159901b6d58d8662 Mon Sep 17 00:00:00 2001 From: Tony Hutter Date: Fri, 18 Mar 2022 14:06:40 -0700 Subject: [PATCH] zed: Fix mpath autoreplace on Centos 7 A prior commit included a udev check for MPATH_DEVICE_READY to determine if a path was multipath when doing an autoreplace: f2f6c18 zed: Misc multipath autoreplace fixes However, MPATH_DEVICE_READY is not provided by the older version of udev that's on Centos 7 (it is on Centos 8). This patch instead looks for 'mpath-' in the UUID, which works on both Centos 7 and 8. Reviewed-by: Brian Behlendorf Signed-off-by: Tony Hutter Closes #13222 --- lib/libzutil/os/linux/zutil_device_path_os.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/libzutil/os/linux/zutil_device_path_os.c b/lib/libzutil/os/linux/zutil_device_path_os.c index 83b077927f..45a6f6f593 100644 --- a/lib/libzutil/os/linux/zutil_device_path_os.c +++ b/lib/libzutil/os/linux/zutil_device_path_os.c @@ -613,27 +613,24 @@ zfs_get_underlying_path(const char *dev_name) /* * A disk is considered a multipath whole disk when: * DEVNAME key value has "dm-" - * MPATH_DEVICE_READY is present - * DM_UUID key exists + * DM_UUID key exists and starts with 'mpath-' * ID_PART_TABLE_TYPE key does not exist or is not gpt * ID_FS_LABEL key does not exist (disk isn't labeled) */ static boolean_t is_mpath_udev_sane(struct udev_device *dev) { - const char *devname, *type, *uuid, *label, *mpath_ready; + const char *devname, *type, *uuid, *label; devname = udev_device_get_property_value(dev, "DEVNAME"); type = udev_device_get_property_value(dev, "ID_PART_TABLE_TYPE"); uuid = udev_device_get_property_value(dev, "DM_UUID"); label = udev_device_get_property_value(dev, "ID_FS_LABEL"); - mpath_ready = udev_device_get_property_value(dev, "MPATH_DEVICE_READY"); if ((devname != NULL && strncmp(devname, "/dev/dm-", 8) == 0) && ((type == NULL) || (strcmp(type, "gpt") != 0)) && - (uuid != NULL) && - (label == NULL) && - (mpath_ready != NULL && strncmp(mpath_ready, "1", 1) == 0)) { + ((uuid != NULL) && (strncmp(uuid, "mpath-", 6) == 0)) && + (label == NULL)) { return (B_TRUE); }