On Tue, Jul 09, 2024 at 11:39:30PM +0200, Martin Wilck wrote:
> ... and use cleanup attributes. We need to call the disassemble...()
> functions from multipath directly now, but we fetch exactly the data
> we need from the kernel.
> 
> Signed-off-by: Martin Wilck <[email protected]>
> ---
>  multipath/main.c | 58 ++++++++++++++++++++++++++----------------------
>  1 file changed, 31 insertions(+), 27 deletions(-)
> 
> diff --git a/multipath/main.c b/multipath/main.c
> index c82bc86..b3b6c81 100644
> --- a/multipath/main.c
> +++ b/multipath/main.c
> @@ -222,12 +222,14 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector 
> pathvec, char * refwwid)
>  static int check_usable_paths(struct config *conf,
>                             const char *devpath, enum devtypes dev_type)
>  {
> -     struct udev_device *ud = NULL;
> -     struct multipath *mpp = NULL;
> +     struct udev_device __attribute__((cleanup(cleanup_udev_device))) *ud = 
> NULL;
> +     struct multipath __attribute__((cleanup(cleanup_multipath_and_paths))) 
> *mpp = NULL;
>       struct pathgroup *pg;
>       struct path *pp;
> -     char *mapname;
> -     vector pathvec = NULL;
> +     char __attribute__((cleanup(cleanup_charp))) *params = NULL;
> +     char __attribute__((cleanup(cleanup_charp))) *status = NULL;
> +     vector __attribute((cleanup(cleanup_vector))) pathvec = NULL;
> +     char uuid[DM_UUID_LEN];
>       dev_t devt;
>       int r = 1, i, j;
>  
> @@ -238,31 +240,39 @@ static int check_usable_paths(struct config *conf,
>       devt = udev_device_get_devnum(ud);
>       if (!dm_is_dm_major(major(devt))) {
>               condlog(1, "%s is not a dm device", devpath);
> -             goto out;
> +             return r;
>       }
>  
> -     mapname = dm_mapname(major(devt), minor(devt));
> -     if (mapname == NULL) {
> -             condlog(1, "dm device not found: %s", devpath);
> -             goto out;
> -     }
> -
> -     if (dm_is_mpath(mapname) != DM_IS_MPATH_YES) {
> -             condlog(1, "%s is not a multipath map", devpath);
> -             goto free;
> -     }
> +     mpp = alloc_multipath();
> +     if (!mpp)
> +             return r;
> +     if (!(mpp->alias = malloc(WWID_SIZE)))
> +             return r;
>  
>       /* pathvec is needed for disassemble_map */
>       pathvec = vector_alloc();
>       if (pathvec == NULL)
> -             goto free;
> +             return r;
>  
> -     mpp = dm_get_multipath(mapname);
> -     if (mpp == NULL)
> -             goto free;

I can't see any thing that could go wrong, but we used to be setting
mpp->size in dm_get_multipath() and we no longer are, and setting
mpp->size is cheap and risk-free.

-Ben

> +     if (libmp_mapinfo(DM_MAP_BY_DEV,
> +                       (mapid_t) { ._u = { major(devt), minor(devt) } },
> +                       (mapinfo_t) {
> +                           .name = mpp->alias,
> +                           .uuid = uuid,
> +                           .dmi = &mpp->dmi,
> +                           .tgt_type = TGT_MPATH,
> +                           .target = &params,
> +                           .status = &status,
> +                   }) != DMP_OK)
> +             return r;
>  
> -     if (update_multipath_table(mpp, pathvec, 0) != DMP_OK)
> -                 goto free;
> +     if (!is_mpath_uuid(uuid))
> +             return r;
> +
> +     strlcpy(mpp->wwid, uuid + UUID_PREFIX_LEN, sizeof(mpp->wwid));
> +
> +     if (update_multipath_table__(mpp, pathvec, 0, params, status) != DMP_OK)
> +             return r;
>  
>       vector_foreach_slot (mpp->pg, pg, i) {
>               vector_foreach_slot (pg->paths, pp, j) {
> @@ -284,12 +294,6 @@ static int check_usable_paths(struct config *conf,
>  found:
>       condlog(r == 0 ? 3 : 2, "%s:%s usable paths found",
>               devpath, r == 0 ? "" : " no");
> -free:
> -     free(mapname);
> -     free_multipath(mpp, FREE_PATHS);
> -     vector_free(pathvec);
> -out:
> -     udev_device_unref(ud);
>       return r;
>  }
>  
> -- 
> 2.45.2


Reply via email to