On Thu, Jul 09, 2020 at 12:36:13PM +0200, mwi...@suse.com wrote:
> From: Martin Wilck <mwi...@suse.com>
> 
> If pathinfo fails for one path to be adopted, we currently
> fail the entire function. This may cause ev_add_path() for a valid
> path to fail because some other path is broken. Fix it by just
> skipping paths that don't look healthy.

This looks problematic to me.  While I agree that we shouldn't make
ev_add_path fail because some other path failed, but what about if the
path we are trying to add fails in pathinfo().  In this case multipathd
won't orphan the path and it will report "path added to devmap", even
though it wasn't. Also what is the correct response for when you try
to create a multipath device but none of the paths can be added.
Should multipathd create a device with no paths? 
 
> Signed-off-by: Martin Wilck <mwi...@suse.com>
> ---
>  libmultipath/structs_vec.c | 14 +++++++++-----
>  1 file changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
> index 55fca9b..bc47d1e 100644
> --- a/libmultipath/structs_vec.c
> +++ b/libmultipath/structs_vec.c
> @@ -75,16 +75,20 @@ int adopt_paths(vector pathvec, struct multipath *mpp)
>                       if (!mpp->paths && !(mpp->paths = vector_alloc()))
>                               return 1;
>  
> -                     if (!find_path_by_devt(mpp->paths, pp->dev_t) &&
> -                         store_path(mpp->paths, pp))
> -                                     return 1;
>                       conf = get_multipath_config();
>                       pthread_cleanup_push(put_multipath_config, conf);
>                       ret = pathinfo(pp, conf,
>                                      DI_PRIO | DI_CHECKER);
>                       pthread_cleanup_pop(1);
> -                     if (ret)
> -                             return 1;
> +                     if (ret) {
> +                             condlog(3, "%s: pathinfo failed for %s",
> +                                     __func__, pp->dev);
> +                             continue;
> +                     }
> +
> +                     if (!find_path_by_devt(mpp->paths, pp->dev_t) &&
> +                         store_path(mpp->paths, pp))
> +                                     return 1;
>               }
>       }
>       return 0;
> -- 
> 2.26.2

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

Reply via email to