Re: [PATCH 4/4] libmultipath: keep renames from stopping other multipath actions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2023-01-31 at 13:34 -0600, Benjamin Marzinski wrote:
> If select_action() is called and a multipath device needs to be
> renamed,
> the code currently checks if force_reload is set, and if so, does the
> reload after the rename.  But if force_reload isn't set, only the
> rename
> happens, regardless of what other actions are needed. This can happen
> if
> multipathd starts up and a device needs both a reload and a rename.
> 
> Make multipath check for resize, reload, and switch pathgroup along
> with
> rename, and do both if necessary.
> 
> Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx>

Looks good, but I have some questions below.

> ---
>  libmultipath/configure.c | 60 +++++++++++++++++---------------------
> --
>  libmultipath/configure.h |  4 ++-
>  2 files changed, 29 insertions(+), 35 deletions(-)
> 
> diff --git a/libmultipath/configure.c b/libmultipath/configure.c
> index e870e0f6..2228176d 100644
> --- a/libmultipath/configure.c
> +++ b/libmultipath/configure.c
> @@ -670,7 +670,8 @@ static bool is_udev_ready(struct multipath *cmpp)
>  static void
>  select_reload_action(struct multipath *mpp, const char *reason)
>  {
> -       mpp->action = ACT_RELOAD;
> +       mpp->action = mpp->action == ACT_RENAME ? ACT_RELOAD_RENAME :
> +                     ACT_RELOAD;
>         condlog(3, "%s: set ACT_RELOAD (%s)", mpp->alias, reason);
>  }
>  
> @@ -681,6 +682,7 @@ void select_action (struct multipath *mpp, const
> struct _vector *curmp,
>         struct multipath * cmpp_by_name;
>         char * mpp_feat, * cmpp_feat;
>  
> +       mpp->action = ACT_NOTHING;
>         cmpp = find_mp_by_wwid(curmp, mpp->wwid);
>         cmpp_by_name = find_mp_by_alias(curmp, mpp->alias);
>         if (mpp->need_reload || (cmpp && cmpp->need_reload))
> @@ -705,14 +707,8 @@ void select_action (struct multipath *mpp, const
> struct _vector *curmp,
>                         mpp->alias);
>                 strlcpy(mpp->alias_old, cmpp->alias, WWID_SIZE);
>                 mpp->action = ACT_RENAME;
> -               if (force_reload) {
> -                       mpp->force_udev_reload = 1;
> -                       mpp->action = ACT_FORCERENAME;
> -               }
> -               return;
> -       }
> -
> -       if (cmpp != cmpp_by_name) {
> +               /* don't return here. Check for other needed actions
> */
> +       } else if (cmpp != cmpp_by_name) {

Why does your "check for other needed actions" logic not apply for this
case? AFAICS, even if we can't rename the map, we might need to resize
or reload. 


>                 condlog(2, "%s: unable to rename %s to %s (%s is used
> by %s)",
>                         mpp->wwid, cmpp->alias, mpp->alias,
>                         mpp->alias, cmpp_by_name->wwid);
> @@ -725,7 +721,8 @@ void select_action (struct multipath *mpp, const
> struct _vector *curmp,
>  
>         if (cmpp->size != mpp->size) {
>                 mpp->force_udev_reload = 1;
> -               mpp->action = ACT_RESIZE;
> +               mpp->action = mpp->action == ACT_RENAME ?
> ACT_RESIZE_RENAME :
> +                             ACT_RESIZE;


This code makes we wonder if we should transform the ACT_... enum into
a bitmap of required actions that would be ORed together.
At least ACT_RENAME is now orthogonal to the rest of the actions.

>                 condlog(3, "%s: set ACT_RESIZE (size change)",
>                         mpp->alias);
>                 return;
> @@ -801,14 +798,14 @@ void select_action (struct multipath *mpp,
> const struct _vector *curmp,
>                 return;
>         }
>         if (cmpp->nextpg != mpp->bestpg) {
> -               mpp->action = ACT_SWITCHPG;
> +               mpp->action = mpp->action == ACT_RENAME ?
> ACT_SWITCHPG_RENAME :
> +                             ACT_SWITCHPG;

See above.

>                 condlog(3, "%s: set ACT_SWITCHPG (next path group
> change)",
>                         mpp->alias);
>                 return;
>         }
> -       mpp->action = ACT_NOTHING;
> -       condlog(3, "%s: set ACT_NOTHING (map unchanged)",
> -               mpp->alias);
> +       if (mpp->action == ACT_NOTHING)
> +               condlog(3, "%s: set ACT_NOTHING (map unchanged)",
> mpp->alias);
>         return;
>  }
>  
> @@ -909,6 +906,17 @@ int domap(struct multipath *mpp, char *params,
> int is_daemon)
>                 }
>         }
>  
> +       if (mpp->action == ACT_RENAME || mpp->action ==
> ACT_SWITCHPG_RENAME ||
> +           mpp->action == ACT_RELOAD_RENAME ||
> +           mpp->action == ACT_RESIZE_RENAME) {
> +               conf = get_multipath_config();
> +               pthread_cleanup_push(put_multipath_config, conf);
> +               r = dm_rename(mpp->alias_old, mpp->alias,
> +                             conf->partition_delim, mpp-
> >skip_kpartx);
> +               pthread_cleanup_pop(1);
> +               if (r == DOMAP_FAIL)
> +                       return r;
> +       }
>         switch (mpp->action) {
>         case ACT_REJECT:
>         case ACT_NOTHING:
> @@ -916,6 +924,7 @@ int domap(struct multipath *mpp, char *params,
> int is_daemon)
>                 return DOMAP_EXIST;
>  
>         case ACT_SWITCHPG:
> +       case ACT_SWITCHPG_RENAME:
>                 dm_switchgroup(mpp->alias, mpp->bestpg);
>                 /*
>                  * we may have avoided reinstating paths because
> there where in
> @@ -942,6 +951,7 @@ int domap(struct multipath *mpp, char *params,
> int is_daemon)
>                 break;
>  
>         case ACT_RELOAD:
> +       case ACT_RELOAD_RENAME:
>                 sysfs_set_max_sectors_kb(mpp, 1);
>                 if (mpp->ghost_delay_tick > 0 && pathcount(mpp,
> PATH_UP))
>                         mpp->ghost_delay_tick = 0;
> @@ -949,6 +959,7 @@ int domap(struct multipath *mpp, char *params,
> int is_daemon)
>                 break;
>  
>         case ACT_RESIZE:
> +       case ACT_RESIZE_RENAME:
>                 sysfs_set_max_sectors_kb(mpp, 1);
>                 if (mpp->ghost_delay_tick > 0 && pathcount(mpp,
> PATH_UP))
>                         mpp->ghost_delay_tick = 0;
> @@ -956,29 +967,10 @@ int domap(struct multipath *mpp, char *params,
> int is_daemon)
>                 break;
>  
>         case ACT_RENAME:
> -               conf = get_multipath_config();
> -               pthread_cleanup_push(put_multipath_config, conf);
> -               r = dm_rename(mpp->alias_old, mpp->alias,
> -                             conf->partition_delim, mpp-
> >skip_kpartx);
> -               pthread_cleanup_pop(1);
> -               break;
> -
> -       case ACT_FORCERENAME:
> -               conf = get_multipath_config();
> -               pthread_cleanup_push(put_multipath_config, conf);
> -               r = dm_rename(mpp->alias_old, mpp->alias,
> -                             conf->partition_delim, mpp-
> >skip_kpartx);
> -               pthread_cleanup_pop(1);
> -               if (r) {
> -                       sysfs_set_max_sectors_kb(mpp, 1);
> -                       if (mpp->ghost_delay_tick > 0 &&
> -                           pathcount(mpp, PATH_UP))
> -                               mpp->ghost_delay_tick = 0;
> -                       r = dm_addmap_reload(mpp, params, 0);
> -               }
>                 break;
>  
>         default:
> +               r = DOMAP_FAIL;
>                 break;
>         }
>  
> diff --git a/libmultipath/configure.h b/libmultipath/configure.h
> index 2bf73e65..9d935db3 100644
> --- a/libmultipath/configure.h
> +++ b/libmultipath/configure.h
> @@ -18,9 +18,11 @@ enum actions {
>         ACT_RENAME,
>         ACT_CREATE,
>         ACT_RESIZE,
> -       ACT_FORCERENAME,
> +       ACT_RELOAD_RENAME,
>         ACT_DRY_RUN,
>         ACT_IMPOSSIBLE,
> +       ACT_RESIZE_RENAME,
> +       ACT_SWITCHPG_RENAME,
>  };
>  
>  /*



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





[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux