From: Martin Wilck <mwilck@suse.com>
To: Christophe Varoqui <christophe.varoqui@opensvc.com>,
Benjamin Marzinski <bmarzins@redhat.com>
Cc: Julian Andres Klode <julian.klode@canonical.com>,
dm-devel@redhat.com, Martin Wilck <mwilck@suse.com>
Subject: [PATCH v4 10/20] libmultipath: indicate wwid failure in dm_addmap_create()
Date: Wed, 4 Apr 2018 18:16:17 +0200 [thread overview]
Message-ID: <20180404161627.6244-11-mwilck@suse.com> (raw)
In-Reply-To: <20180404161627.6244-1-mwilck@suse.com>
dm_addmap_create() is where we actually try to set up a new
multipath map. Depending on the result, mark the wwid as
failed (or not), and re-trigger an uevent if necessary.
If a path changes from multipath to non-multipath, use an "add"
event to make sure LVM2 rules pick it up. Increase log level
of this event to 3.
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
libmultipath/configure.c | 37 ++++++++++++++++++++++++++++---------
libmultipath/configure.h | 2 +-
libmultipath/devmapper.c | 9 ++++++++-
libmultipath/structs.h | 1 +
multipathd/main.c | 2 +-
5 files changed, 39 insertions(+), 12 deletions(-)
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index c1a50e4..9aa3d21 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -445,11 +445,18 @@ trigger_udev_change(const struct multipath *mpp)
}
void
-trigger_paths_udev_change(const struct multipath *mpp)
+trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
{
struct pathgroup * pgp;
struct path * pp;
int i, j;
+ /*
+ * If a path changes from multipath to non-multipath, we must
+ * synthesize an artificial "add" event, otherwise the LVM2 rules
+ * (69-lvm2-lvmetad.rules) won't pick it up. Otherwise, we'd just
+ * irritate ourselves with an "add", so use "change".
+ */
+ const char *action = is_mpath ? "change" : "add";
if (!mpp || !mpp->pg)
return;
@@ -468,14 +475,21 @@ trigger_paths_udev_change(const struct multipath *mpp)
*/
env = udev_device_get_property_value(
pp->udev, "DM_MULTIPATH_DEVICE_PATH");
- if (env != NULL && !strcmp(env, "1"))
- continue;
- condlog(4, "triggering change uevent for %s", pp->dev);
- sysfs_attr_set_value(pp->udev, "uevent", "change",
- strlen("change"));
+ if (is_mpath && env != NULL && !strcmp(env, "1"))
+ continue;
+ else if (!is_mpath &&
+ (env == NULL || !strcmp(env, "0")))
+ continue;
+
+ condlog(3, "triggering %s uevent for %s (is %smultipath member)",
+ action, pp->dev, is_mpath ? "" : "no ");
+ sysfs_attr_set_value(pp->udev, "uevent",
+ action, strlen(action));
}
}
+
+ mpp->needs_paths_uevent = 0;
}
static int
@@ -876,8 +890,10 @@ int domap(struct multipath *mpp, char *params, int is_daemon)
* succeeded
*/
mpp->force_udev_reload = 0;
- if (mpp->action == ACT_CREATE && remember_wwid(mpp->wwid) == 1)
- trigger_paths_udev_change(mpp);
+ if (mpp->action == ACT_CREATE &&
+ (remember_wwid(mpp->wwid) == 1 ||
+ mpp->needs_paths_uevent))
+ trigger_paths_udev_change(mpp, true);
if (!is_daemon) {
/* multipath client mode */
dm_switchgroup(mpp->alias, mpp->bestpg);
@@ -902,7 +918,10 @@ int domap(struct multipath *mpp, char *params, int is_daemon)
}
dm_setgeometry(mpp);
return DOMAP_OK;
- }
+ } else if (r == DOMAP_FAIL && mpp->action == ACT_CREATE &&
+ mpp->needs_paths_uevent)
+ trigger_paths_udev_change(mpp, false);
+
return DOMAP_FAIL;
}
diff --git a/libmultipath/configure.h b/libmultipath/configure.h
index 545cbc2..8b56d33 100644
--- a/libmultipath/configure.h
+++ b/libmultipath/configure.h
@@ -37,4 +37,4 @@ int get_refwwid (enum mpath_cmds cmd, char * dev, enum devtypes dev_type,
vector pathvec, char **wwid);
int reload_map(struct vectors *vecs, struct multipath *mpp, int refresh, int is_daemon);
struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type);
-void trigger_paths_udev_change(const struct multipath *mpp);
+void trigger_paths_udev_change(struct multipath *mpp, bool is_mpath);
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
index 2a92105..f2befad 100644
--- a/libmultipath/devmapper.c
+++ b/libmultipath/devmapper.c
@@ -22,6 +22,7 @@
#include "devmapper.h"
#include "sysfs.h"
#include "config.h"
+#include "wwids.h"
#include "log_pthread.h"
#include <sys/types.h>
@@ -415,8 +416,12 @@ int dm_addmap_create (struct multipath *mpp, char * params)
int err;
if (dm_addmap(DM_DEVICE_CREATE, TGT_MPATH, mpp, params, ro,
- udev_flags))
+ udev_flags)) {
+ if (unmark_failed_wwid(mpp->wwid) ==
+ WWID_FAILED_CHANGED)
+ mpp->needs_paths_uevent = 1;
return 1;
+ }
/*
* DM_DEVICE_CREATE is actually DM_DEV_CREATE + DM_TABLE_LOAD.
* Failing the second part leaves an empty map. Clean it up.
@@ -432,6 +437,8 @@ int dm_addmap_create (struct multipath *mpp, char * params)
break;
}
}
+ if (mark_failed_wwid(mpp->wwid) == WWID_FAILED_CHANGED)
+ mpp->needs_paths_uevent = 1;
return 0;
}
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
index c43f2c3..1d3a34f 100644
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -322,6 +322,7 @@ struct multipath {
int max_sectors_kb;
int force_readonly;
int force_udev_reload;
+ int needs_paths_uevent;
int ghost_delay;
int ghost_delay_tick;
unsigned int dev_loss;
diff --git a/multipathd/main.c b/multipathd/main.c
index e6f4e77..7eeb743 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2325,7 +2325,7 @@ configure (struct vectors * vecs)
sync_maps_state(mpvec);
vector_foreach_slot(mpvec, mpp, i){
if (remember_wwid(mpp->wwid) == 1)
- trigger_paths_udev_change(mpp);
+ trigger_paths_udev_change(mpp, true);
update_map_pr(mpp);
}
--
2.16.1
next prev parent reply other threads:[~2018-04-04 16:16 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-04 16:16 [PATCH v4 00/20] multipath path classification Martin Wilck
2018-04-04 16:16 ` [PATCH v4 01/20] Revert "multipath: ignore -i if find_multipaths is set" Martin Wilck
2018-04-04 16:16 ` [PATCH v4 02/20] Revert "multipathd: imply -n " Martin Wilck
2018-04-04 16:16 ` [PATCH v4 03/20] libmultipath: should_multipath: keep existing maps Martin Wilck
2018-04-04 16:16 ` [PATCH v4 04/20] multipath -u -i: respect entries in WWIDs file Martin Wilck
2018-04-04 16:16 ` [PATCH v4 05/20] libmultipath: trigger change uevent on new device creation Martin Wilck
2018-04-04 16:16 ` [PATCH v4 06/20] libmultipath: trigger path uevent only when necessary Martin Wilck
2018-04-04 16:16 ` [PATCH v4 07/20] libmultipath: change find_multipaths option to multi-value Martin Wilck
2018-04-12 18:32 ` Benjamin Marzinski
2018-04-13 18:23 ` Martin Wilck
2018-04-04 16:16 ` [PATCH v4 08/20] libmultipath: use const char* in open_file() Martin Wilck
2018-04-04 16:16 ` [PATCH v4 09/20] libmultipath: functions to indicate mapping failure in /dev/shm Martin Wilck
2018-04-12 18:33 ` Benjamin Marzinski
2018-04-12 20:07 ` Martin Wilck
2018-04-12 21:27 ` Benjamin Marzinski
2018-04-04 16:16 ` Martin Wilck [this message]
2018-04-12 18:33 ` [PATCH v4 10/20] libmultipath: indicate wwid failure in dm_addmap_create() Benjamin Marzinski
2018-04-12 20:16 ` Martin Wilck
2018-04-12 20:22 ` Martin Wilck
2018-04-12 21:32 ` Benjamin Marzinski
2018-04-12 22:43 ` Martin Wilck
2018-04-04 16:16 ` [PATCH v4 11/20] multipath -u: common code path for result message Martin Wilck
2018-04-12 18:34 ` Benjamin Marzinski
2018-04-04 16:16 ` [PATCH v4 12/20] multipath -u: change output to environment/key format Martin Wilck
2018-04-12 18:35 ` Benjamin Marzinski
2018-04-04 16:16 ` [PATCH v4 13/20] multipath -u: treat failed wwids as invalid Martin Wilck
2018-04-12 18:35 ` Benjamin Marzinski
2018-04-04 16:16 ` [PATCH v4 14/20] multipath -u: add DM_MULTIPATH_DEVICE_PATH=2 for "maybe" Martin Wilck
2018-04-04 16:16 ` [PATCH v4 15/20] libmultipath: implement find_multipaths_timeout Martin Wilck
2018-04-12 18:35 ` Benjamin Marzinski
2018-04-04 16:16 ` [PATCH v4 16/20] multipath -u : set FIND_MULTIPATHS_WAIT_UNTIL from /dev/shm Martin Wilck
2018-04-12 18:36 ` Benjamin Marzinski
2018-04-12 20:35 ` Martin Wilck
2018-04-12 21:35 ` Benjamin Marzinski
2018-04-04 16:16 ` [PATCH v4 18/20] multipath -u: quick check if path is multipathed Martin Wilck
2018-04-12 18:46 ` Benjamin Marzinski
2018-04-12 22:19 ` Martin Wilck
2018-04-13 16:12 ` Benjamin Marzinski
2018-04-13 17:59 ` Martin Wilck
2018-04-04 16:16 ` [PATCH v4 19/20] libmultipath: enable find_multipaths "smart" Martin Wilck
2018-04-12 18:47 ` Benjamin Marzinski
2018-04-12 22:27 ` Martin Wilck
2018-04-13 15:59 ` Benjamin Marzinski
2018-04-04 16:16 ` [PATCH v4 20/20] multipath.rules: find_multipaths "smart" logic Martin Wilck
2018-04-12 18:48 ` Benjamin Marzinski
2018-04-13 16:01 ` Benjamin Marzinski
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=20180404161627.6244-11-mwilck@suse.com \
--to=mwilck@suse.com \
--cc=bmarzins@redhat.com \
--cc=christophe.varoqui@opensvc.com \
--cc=dm-devel@redhat.com \
--cc=julian.klode@canonical.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox