[dm-devel] [PATCH 1/7] multipathd: remove missing paths on startup
Martin Wilck
martin.wilck at suse.com
Thu Nov 4 22:12:40 UTC 2021
On Wed, 2021-10-20 at 14:15 -0500, Benjamin Marzinski wrote:
> If a path device was removed from the system while multipathd was not
> running, multipathd would not remove the path from the multipath
> table
> on start-up, or on a weak reconfigure. update_pathvec_from_dm() would
> return that a reload was necessary, but that information wasn't
> propigated back to where it could be used to reload the device.
>
> Multipath devices now remember if they need to be reloaded, and if
> so,
> force_reload is set in select_action(). This means that even when
> configure is called with FORCE_RELOAD_WEAK, these devices will still
> be
> reloaded.
>
> Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
Reviewed-by: Martin Wilck <mwilck at suse.com>
(I found the subject of this patch somewhat disconcerting, because it
describes what your patch set is supposed to prevent - mistakenly
deleting paths. But I understand you meant *completely* missing paths,
i.e. paths that aren't present in sysfs).
> ---
> libmultipath/configure.c | 2 ++
> libmultipath/devmapper.c | 2 ++
> libmultipath/structs.h | 1 +
> libmultipath/structs_vec.c | 1 +
> 4 files changed, 6 insertions(+)
>
> diff --git a/libmultipath/configure.c b/libmultipath/configure.c
> index eb8ec1bd..f1a890af 100644
> --- a/libmultipath/configure.c
> +++ b/libmultipath/configure.c
> @@ -715,6 +715,8 @@ void select_action (struct multipath *mpp, const
> struct _vector *curmp,
>
> 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))
> + force_reload = 1;
>
> if (!cmpp_by_name) {
> if (cmpp) {
> diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
> index c05dc201..3e1a7260 100644
> --- a/libmultipath/devmapper.c
> +++ b/libmultipath/devmapper.c
> @@ -522,6 +522,8 @@ freeout:
> addout:
> dm_task_destroy (dmt);
>
> + if (r)
> + mpp->need_reload = false;
> return r;
> }
>
> diff --git a/libmultipath/structs.h b/libmultipath/structs.h
> index 399540e7..d0b266b7 100644
> --- a/libmultipath/structs.h
> +++ b/libmultipath/structs.h
> @@ -355,6 +355,7 @@ struct multipath {
> int retain_hwhandler;
> int deferred_remove;
> bool in_recovery;
> + bool need_reload;
> int san_path_err_threshold;
> int san_path_err_forget_rate;
> int san_path_err_recovery_time;
> diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
> index 85d97ac1..e52db0c4 100644
> --- a/libmultipath/structs_vec.c
> +++ b/libmultipath/structs_vec.c
> @@ -237,6 +237,7 @@ bool update_pathvec_from_dm(vector pathvec,
> struct multipath *mpp,
> free_pathgroup(pgp, KEEP_PATHS);
> must_reload = true;
> }
> + mpp->need_reload = mpp->need_reload || must_reload;
> return must_reload;
> }
>
More information about the dm-devel
mailing list