[dm-devel] [PATCH 07/12] Make multipathd orphan paths that were removed externally

Christophe Varoqui christophe.varoqui at opensvc.com
Thu Jul 24 08:41:38 UTC 2014


Applied,
Thanks.


On Mon, Jun 30, 2014 at 7:13 AM, Benjamin Marzinski <bmarzins at redhat.com>
wrote:

> Multipathd was only orphaning paths that it removed, not ones that were
> removed by the multipath command.  This could cause problems if a path
> was failed but not removed, and "multipath -r" was run.  multipath would
> remove the path, and when multipathd updated itself, it would remove
> that path from the multipath device's path list, but not orphan it.
> When the path became active again, multipathd crashed trying to adjust
> the pathgroups of the multipath device it had previously belonged to.
>
> This patch makes sure that whenever multipathd updates the multipath device
> table, it first makes sure the mpp->paths is uptodate.  Once it has
> finished updating the device table, it orphans any paths in mpp->paths
> that are no longer part of the multipath device.
>
> Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
> ---
>  libmultipath/structs_vec.c | 31 +++++++++++++++++++++++++++----
>  multipathd/main.c          |  4 ++++
>  2 files changed, 31 insertions(+), 4 deletions(-)
>
> diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
> index 8cdbe3d..23f5bbb 100644
> --- a/libmultipath/structs_vec.c
> +++ b/libmultipath/structs_vec.c
> @@ -281,12 +281,38 @@ update_multipath_status (struct multipath *mpp)
>         return 0;
>  }
>
> +void sync_paths(struct multipath *mpp, vector pathvec)
> +{
> +       struct path *pp;
> +       struct pathgroup  *pgp;
> +       int found, i, j;
> +
> +       vector_foreach_slot (mpp->paths, pp, i) {
> +               found = 0;
> +               vector_foreach_slot(mpp->pg, pgp, j) {
> +                       if (find_slot(pgp->paths, (void *)pp) != -1) {
> +                               found = 1;
> +                               break;
> +                       }
> +               }
> +               if (!found) {
> +                       condlog(3, "%s dropped path %s", mpp->alias,
> pp->dev);
> +                       vector_del_slot(mpp->paths, i--);
> +                       orphan_path(pp, "path removed externally");
> +               }
> +       }
> +       update_mpp_paths(mpp, pathvec);
> +       vector_foreach_slot (mpp->paths, pp, i)
> +               pp->mpp = mpp;
> +}
> +
>  extern int
>  update_multipath_strings (struct multipath *mpp, vector pathvec)
>  {
>         if (!mpp)
>                 return 1;
>
> +       update_mpp_paths(mpp, pathvec);
>         condlog(4, "%s: %s", mpp->alias, __FUNCTION__);
>
>         free_multipath_attributes(mpp);
> @@ -295,6 +321,7 @@ update_multipath_strings (struct multipath *mpp,
> vector pathvec)
>
>         if (update_multipath_table(mpp, pathvec))
>                 return 1;
> +       sync_paths(mpp, pathvec);
>
>         if (update_multipath_status(mpp))
>                 return 1;
> @@ -508,13 +535,9 @@ int update_multipath (struct vectors *vecs, char
> *mapname, int reset)
>                 return 2;
>         }
>
> -       free_pgvec(mpp->pg, KEEP_PATHS);
> -       mpp->pg = NULL;
> -
>         if (__setup_multipath(vecs, mpp, reset))
>                 return 1; /* mpp freed in setup_multipath */
>
> -       adopt_paths(vecs->pathvec, mpp, 0);
>         /*
>          * compare checkers states with DM states
>          */
> diff --git a/multipathd/main.c b/multipathd/main.c
> index 56d00d3..337bfe9 100644
> --- a/multipathd/main.c
> +++ b/multipathd/main.c
> @@ -1170,6 +1170,10 @@ check_path (struct vectors * vecs, struct path * pp)
>                         pp->dev);
>                 pp->dmstate = PSTATE_UNDEF;
>         }
> +       /* if update_multipath_strings orphaned the path, quit early */
> +       if (!pp->mpp)
> +               return 0;
> +
>         pp->chkrstate = newstate;
>         if (newstate != pp->state) {
>                 int oldstate = pp->state;
> --
> 1.8.3.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/dm-devel/attachments/20140724/7ce059b3/attachment.htm>


More information about the dm-devel mailing list