On Tue, Jul 02, 2019 at 10:09:42PM +0000, Martin Wilck wrote: > From: Martin Wilck <mwilck@xxxxxxxx> > > 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@xxxxxxxx> Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > --- > libmultipath/configure.c | 38 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) > > diff --git a/libmultipath/configure.c b/libmultipath/configure.c > index af4d78de..9f100008 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 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel