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

Roger Heflin rogerheflin at gmail.com
Tue Jul 9 16:40:33 UTC 2019


We have an observed behavior as follows:

When the host boots up, a uuid symbolic link is created pointing at
/dev/sda1 (device for /boot)

Multipath starts up and creates an multipath device to manage /dev/sda
and a udev rule deletes /dev/sda1 invalidating the symbolic link.

The symbolic link does not appear to get re-created to point to the
new multipath device which would lead one to suspect that there was no
event happening for when the multipath device is created.

When /boot attempts to mount via uuid it fails as the symbolic link is
still pointing at /dev/sda1 that no longer exists in /dev.

Right now our solution is a manual solution of blacklisting the device
with /boot on it.

Would this fix triggering an event on the multipath device partitions
be expected to correct the above issue?

If so, I will submit a ticket to our OS vendor to have it backport it
into the versions that are having the issue with.

Thanks.

On Tue, Jul 9, 2019 at 2:42 AM Martin Wilck <Martin.Wilck at suse.com> 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>
> ---
>  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
>
>
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list