On Wed, Aug 12, 2020 at 01:35:40PM +0200, mwi...@suse.com wrote:
> From: Martin Wilck <mwi...@suse.com>
> 
> If we are in the reconfigure() code path, and we encounter maps to
> be reloaded, we usually set the DM_SUBSYSTEM_UDEV_FLAG0 flag to tell
> udev not to repeat device detection steps above the multipath layer.
> However, if the map was previously uninitialized, we have to force
> udev to reload.

Actually, this patch looks all broken now. select_reload_action()
doesn't have a cmpp argument, but still has

mpp_ud = get_udev_for_mpp(cmpp);

Also, it's setting the action on cmpp from select_action, not mpp. I'm
pretty sure that the next patch makes everything work o.k. again.

-Ben

> 
> Reviewed-by: Benjamin Marzinski <bmarz...@redhat.com>
> Signed-off-by: Martin Wilck <mwi...@suse.com>
> ---
>  libmultipath/configure.c | 61 ++++++++++++++++++++++++----------------
>  1 file changed, 37 insertions(+), 24 deletions(-)
> 
> diff --git a/libmultipath/configure.c b/libmultipath/configure.c
> index cc54818..ac57b88 100644
> --- a/libmultipath/configure.c
> +++ b/libmultipath/configure.c
> @@ -660,6 +660,32 @@ sysfs_set_max_sectors_kb(struct multipath *mpp, int 
> is_reload)
>       return err;
>  }
>  
> +static void
> +select_reload_action(struct multipath *mpp, const char *reason)
> +{
> +     struct udev_device *mpp_ud;
> +     const char *env;
> +
> +     /*
> +      * MPATH_DEVICE_READY != 1 can mean two things:
> +      *  (a) no usable paths
> +      *  (b) device was never fully processed (e.g. udev killed)
> +      * If we are in this code path (startup or forced reconfigure),
> +      * (b) can mean that upper layers like kpartx have never been
> +      * run for this map. Thus force udev reload.
> +      */
> +
> +     mpp_ud = get_udev_for_mpp(cmpp);
> +     env = udev_device_get_property_value(mpp_ud, "MPATH_DEVICE_READY");
> +     if ((!env || strcmp(env, "1")) && count_active_paths(mpp) > 0)
> +             mpp->force_udev_reload = 1;
> +     udev_device_unref(mpp_ud);
> +     mpp->action = ACT_RELOAD;
> +     condlog(3, "%s: set ACT_RELOAD (%s%s)", mpp->alias,
> +             mpp->force_udev_reload ? "forced, " : "",
> +             reason);
> +}
> +
>  static void
>  select_action (struct multipath * mpp, vector curmp, int force_reload)
>  {
> @@ -728,9 +754,7 @@ select_action (struct multipath * mpp, vector curmp, int 
> force_reload)
>       if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF &&
>           !!strstr(mpp->features, "queue_if_no_path") !=
>           !!strstr(cmpp->features, "queue_if_no_path")) {
> -             mpp->action =  ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (no_path_retry change)",
> -                     mpp->alias);
> +             select_reload_action(cmpp, "no_path_retry change");
>               return;
>       }
>       if ((mpp->retain_hwhandler != RETAIN_HWHANDLER_ON ||
> @@ -738,9 +762,7 @@ select_action (struct multipath * mpp, vector curmp, int 
> force_reload)
>           (strlen(cmpp->hwhandler) != strlen(mpp->hwhandler) ||
>            strncmp(cmpp->hwhandler, mpp->hwhandler,
>                   strlen(mpp->hwhandler)))) {
> -             mpp->action = ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (hwhandler change)",
> -                     mpp->alias);
> +             select_reload_action(cmpp, "hwhandler change");
>               return;
>       }
>  
> @@ -748,9 +770,7 @@ select_action (struct multipath * mpp, vector curmp, int 
> force_reload)
>           !!strstr(mpp->features, "retain_attached_hw_handler") !=
>           !!strstr(cmpp->features, "retain_attached_hw_handler") &&
>           get_linux_version_code() < KERNEL_VERSION(4, 3, 0)) {
> -             mpp->action = ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (retain_hwhandler change)",
> -                     mpp->alias);
> +             select_reload_action(cmpp, "retain_hwhandler change");
>               return;
>       }
>  
> @@ -762,9 +782,10 @@ select_action (struct multipath * mpp, vector curmp, int 
> force_reload)
>               remove_feature(&cmpp_feat, "queue_if_no_path");
>               remove_feature(&cmpp_feat, "retain_attached_hw_handler");
>               if (strncmp(mpp_feat, cmpp_feat, PARAMS_SIZE)) {
> -                     mpp->action =  ACT_RELOAD;
> -                     condlog(3, "%s: set ACT_RELOAD (features change)",
> -                             mpp->alias);
> +                     select_reload_action(cmpp, "features change");
> +                     FREE(cmpp_feat);
> +                     FREE(mpp_feat);
> +                     return;
>               }
>       }
>       FREE(cmpp_feat);
> @@ -772,27 +793,19 @@ select_action (struct multipath * mpp, vector curmp, 
> int force_reload)
>  
>       if (!cmpp->selector || strncmp(cmpp->selector, mpp->selector,
>                   strlen(mpp->selector))) {
> -             mpp->action = ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (selector change)",
> -                     mpp->alias);
> +             select_reload_action(cmpp, "selector change");
>               return;
>       }
>       if (cmpp->minio != mpp->minio) {
> -             mpp->action = ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (minio change, %u->%u)",
> -                     mpp->alias, cmpp->minio, mpp->minio);
> +             select_reload_action(cmpp, "minio change");
>               return;
>       }
>       if (!cmpp->pg || VECTOR_SIZE(cmpp->pg) != VECTOR_SIZE(mpp->pg)) {
> -             mpp->action = ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (path group number change)",
> -                     mpp->alias);
> +             select_reload_action(cmpp, "path group number change");
>               return;
>       }
>       if (pgcmp(mpp, cmpp)) {
> -             mpp->action = ACT_RELOAD;
> -             condlog(3, "%s: set ACT_RELOAD (path group topology change)",
> -                     mpp->alias);
> +             select_reload_action(cmpp, "path group topology change");
>               return;
>       }
>       if (cmpp->nextpg != mpp->bestpg) {
> -- 
> 2.28.0

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to