[dm-devel] [PATCH] libmultipath: trigger uevents for partitions, too

Benjamin Marzinski bmarzins at redhat.com
Mon Aug 5 16:14:11 UTC 2019


On Tue, Jul 02, 2019 at 10:09:42PM +0000, Martin Wilck wrote:
> 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>

Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>

> ---
>  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




More information about the dm-devel mailing list