[dm-devel] [PATCH 4/4] libmultipath: trigger uevents for partitions, too
Martin Wilck
Martin.Wilck at suse.com
Tue Jul 9 07:40:05 UTC 2019
From: Martin Wilck <mwilck at suse.com>
We have added code to re-trigger uevents in various cases where
the status of a device changes from multipath to non-multipath,
or vice-versa. When multipathd triggers uevents for paths of a map
because the status of the map has changed, it needs to trigger
events for the partitions of the path devices, too. The kernel
doesn't do this automatically.
Fixes: c5023200 libmultipath: indicate wwid failure in dm_addmap_create()
Fixes: e5d3c3a0 libmultipath: trigger change uevent on new device creation
Signed-off-by: Martin Wilck <mwilck at suse.com>
---
libmultipath/configure.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index b09ef529..4cdf1363 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -519,6 +519,42 @@ trigger_udev_change(const struct multipath *mpp)
udev_device_unref(udd);
}
+static void trigger_partitions_udev_change(struct udev_device *dev,
+ const char *action, int len)
+{
+ struct udev_enumerate *part_enum;
+ struct udev_list_entry *item;
+
+ part_enum = udev_enumerate_new(udev);
+ if (!part_enum)
+ return;
+
+ if (udev_enumerate_add_match_parent(part_enum, dev) < 0 ||
+ udev_enumerate_add_match_subsystem(part_enum, "block") < 0 ||
+ udev_enumerate_scan_devices(part_enum) < 0)
+ goto unref;
+
+ udev_list_entry_foreach(item,
+ udev_enumerate_get_list_entry(part_enum)) {
+ const char *syspath;
+ struct udev_device *part;
+
+ syspath = udev_list_entry_get_name(item);
+ part = udev_device_new_from_syspath(udev, syspath);
+ if (!part)
+ continue;
+
+ if (!strcmp("partition", udev_device_get_devtype(part))) {
+ condlog(4, "%s: triggering %s event for %s", __func__,
+ action, syspath);
+ sysfs_attr_set_value(part, "uevent", action, len);
+ }
+ udev_device_unref(part);
+ }
+unref:
+ udev_enumerate_unref(part_enum);
+}
+
void
trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
{
@@ -569,6 +605,8 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
action, pp->dev, is_mpath ? "" : "no ");
sysfs_attr_set_value(pp->udev, "uevent",
action, strlen(action));
+ trigger_partitions_udev_change(pp->udev, action,
+ strlen(action));
}
}
--
2.22.0
More information about the dm-devel
mailing list