From: Benjamin Marzinski <bmarzins@redhat.com>
To: mwilck@suse.com
Cc: dm-devel@redhat.com
Subject: Re: [PATCH v2 76/80] libmultipath: select_action(): force udev reload for uninitialized maps
Date: Mon, 17 Aug 2020 16:31:05 -0500 [thread overview]
Message-ID: <20200817213105.GH19233@octiron.msp.redhat.com> (raw)
In-Reply-To: <20200812113543.26576-2-mwilck@suse.com>
On Wed, Aug 12, 2020 at 01:35:40PM +0200, mwilck@suse.com wrote:
> From: Martin Wilck <mwilck@suse.com>
>
> If we are in the reconfigure() code path, and we encounter maps to
> be reloaded, we usually set the DM_SUBSYSTEM_UDEV_FLAG0 flag to tell
> udev not to repeat device detection steps above the multipath layer.
> However, if the map was previously uninitialized, we have to force
> udev to reload.
Actually, this patch looks all broken now. select_reload_action()
doesn't have a cmpp argument, but still has
mpp_ud = get_udev_for_mpp(cmpp);
Also, it's setting the action on cmpp from select_action, not mpp. I'm
pretty sure that the next patch makes everything work o.k. again.
-Ben
>
> Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
> Signed-off-by: Martin Wilck <mwilck@suse.com>
> ---
> libmultipath/configure.c | 61 ++++++++++++++++++++++++----------------
> 1 file changed, 37 insertions(+), 24 deletions(-)
>
> diff --git a/libmultipath/configure.c b/libmultipath/configure.c
> index cc54818..ac57b88 100644
> --- a/libmultipath/configure.c
> +++ b/libmultipath/configure.c
> @@ -660,6 +660,32 @@ sysfs_set_max_sectors_kb(struct multipath *mpp, int is_reload)
> return err;
> }
>
> +static void
> +select_reload_action(struct multipath *mpp, const char *reason)
> +{
> + struct udev_device *mpp_ud;
> + const char *env;
> +
> + /*
> + * MPATH_DEVICE_READY != 1 can mean two things:
> + * (a) no usable paths
> + * (b) device was never fully processed (e.g. udev killed)
> + * If we are in this code path (startup or forced reconfigure),
> + * (b) can mean that upper layers like kpartx have never been
> + * run for this map. Thus force udev reload.
> + */
> +
> + mpp_ud = get_udev_for_mpp(cmpp);
> + env = udev_device_get_property_value(mpp_ud, "MPATH_DEVICE_READY");
> + if ((!env || strcmp(env, "1")) && count_active_paths(mpp) > 0)
> + mpp->force_udev_reload = 1;
> + udev_device_unref(mpp_ud);
> + mpp->action = ACT_RELOAD;
> + condlog(3, "%s: set ACT_RELOAD (%s%s)", mpp->alias,
> + mpp->force_udev_reload ? "forced, " : "",
> + reason);
> +}
> +
> static void
> select_action (struct multipath * mpp, vector curmp, int force_reload)
> {
> @@ -728,9 +754,7 @@ select_action (struct multipath * mpp, vector curmp, int force_reload)
> if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF &&
> !!strstr(mpp->features, "queue_if_no_path") !=
> !!strstr(cmpp->features, "queue_if_no_path")) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (no_path_retry change)",
> - mpp->alias);
> + select_reload_action(cmpp, "no_path_retry change");
> return;
> }
> if ((mpp->retain_hwhandler != RETAIN_HWHANDLER_ON ||
> @@ -738,9 +762,7 @@ select_action (struct multipath * mpp, vector curmp, int force_reload)
> (strlen(cmpp->hwhandler) != strlen(mpp->hwhandler) ||
> strncmp(cmpp->hwhandler, mpp->hwhandler,
> strlen(mpp->hwhandler)))) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (hwhandler change)",
> - mpp->alias);
> + select_reload_action(cmpp, "hwhandler change");
> return;
> }
>
> @@ -748,9 +770,7 @@ select_action (struct multipath * mpp, vector curmp, int force_reload)
> !!strstr(mpp->features, "retain_attached_hw_handler") !=
> !!strstr(cmpp->features, "retain_attached_hw_handler") &&
> get_linux_version_code() < KERNEL_VERSION(4, 3, 0)) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (retain_hwhandler change)",
> - mpp->alias);
> + select_reload_action(cmpp, "retain_hwhandler change");
> return;
> }
>
> @@ -762,9 +782,10 @@ select_action (struct multipath * mpp, vector curmp, int force_reload)
> remove_feature(&cmpp_feat, "queue_if_no_path");
> remove_feature(&cmpp_feat, "retain_attached_hw_handler");
> if (strncmp(mpp_feat, cmpp_feat, PARAMS_SIZE)) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (features change)",
> - mpp->alias);
> + select_reload_action(cmpp, "features change");
> + FREE(cmpp_feat);
> + FREE(mpp_feat);
> + return;
> }
> }
> FREE(cmpp_feat);
> @@ -772,27 +793,19 @@ select_action (struct multipath * mpp, vector curmp, int force_reload)
>
> if (!cmpp->selector || strncmp(cmpp->selector, mpp->selector,
> strlen(mpp->selector))) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (selector change)",
> - mpp->alias);
> + select_reload_action(cmpp, "selector change");
> return;
> }
> if (cmpp->minio != mpp->minio) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (minio change, %u->%u)",
> - mpp->alias, cmpp->minio, mpp->minio);
> + select_reload_action(cmpp, "minio change");
> return;
> }
> if (!cmpp->pg || VECTOR_SIZE(cmpp->pg) != VECTOR_SIZE(mpp->pg)) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (path group number change)",
> - mpp->alias);
> + select_reload_action(cmpp, "path group number change");
> return;
> }
> if (pgcmp(mpp, cmpp)) {
> - mpp->action = ACT_RELOAD;
> - condlog(3, "%s: set ACT_RELOAD (path group topology change)",
> - mpp->alias);
> + select_reload_action(cmpp, "path group topology change");
> return;
> }
> if (cmpp->nextpg != mpp->bestpg) {
> --
> 2.28.0
next prev parent reply other threads:[~2020-08-17 21:31 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-12 11:35 [PATCH v2 00/80] multipath-tools series part VI: incomplete udev initialization mwilck
2020-08-12 11:35 ` [PATCH v2 76/80] libmultipath: select_action(): force udev reload for uninitialized maps mwilck
2020-08-17 21:31 ` Benjamin Marzinski [this message]
2020-08-18 7:37 ` Martin Wilck
2020-08-12 11:35 ` [PATCH v2 77/80] libmultipath: log dm_task_run() errors mwilck
2020-08-17 21:33 ` Benjamin Marzinski
2020-08-12 11:35 ` [PATCH v2 79/80] multipathd: rename update_path_groups() -> reload_and_sync_map() mwilck
2020-08-12 11:35 ` [PATCH v2 80/80] libmultipath: select_action(): don't drop map if alias clashes mwilck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200817213105.GH19233@octiron.msp.redhat.com \
--to=bmarzins@redhat.com \
--cc=dm-devel@redhat.com \
--cc=mwilck@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.