device-mapper-multipath/0021-RH-trigger-change-uevent-on-new-device-creation.patch
Benjamin Marzinski 5bea53fe7e device-mapper-multipath-0.7.4-1.git07e7bd5
Update Source to the latest upstream commit
  * Previous patches 0001-0006 are included in this commit
  * Previous patches 0007-0014 are now patches 0015-0022
Add 0001-libmultipath-fix-tur-checker-locking.patch
  * Fixed spinlock bug. posted upstream
Add 0002-multipath-fix-DEF_TIMEOUT-use.patch
  * Add missing sec to ms conversion. posted upstream
Add 0003-multipathd-remove-coalesce_paths-from-ev_add_map.patch
  * Remove unused code. posted upstream
Add 0004-multipathd-remove-unused-configure-parameter.patch
  * Remove unused code. posted upstream
Add 0005-Fix-set_no_path_retry-regression.patch
  * Fix issue with queueing and path addition. posted upstream
Add 0006-multipathd-change-spurious-uevent-msg-priority.patch
  * Change message priority to Notice. posted upstream
Add 0007-multipath-print-sysfs-state-in-fast-list-mode.patch
  * Show sysfs state correctly in fast list mode (-l). posted upstream
Add 0008-libmultipath-move-remove_map-waiter-code-to-multipat.patch
  * Move code around. posted upstream
Add 0009-move-waiter-code-from-libmultipath-to-multipathd.patch
  * Move code around. posted upstream
Add 0010-call-start_waiter_thread-before-setup_multipath.patch
  * Fix race on multipath device creations. posted upstream
Add 0011-libmultipath-add-helper-functions.patch
  * posted upstream
Add 0012-multipathd-RFC-add-new-polling-dmevents-waiter-threa.patch
  * Add alternate method of getting dmevents, that doesn't
    require a thread per device. posted upstream
Add 0013-libmultipath-condlog-log-to-stderr.patch
  * change condlog to log to stderr instead of stdout. posted upstream
Add 0014-multipathd-fix-compiler-warning-for-uev_pathfail_che.patch
  * fix indentation issue. posted upstream
2018-02-15 13:17:53 -06:00

157 lines
4.7 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Benjamin Marzinski <bmarzins@redhat.com>
Date: Mon, 24 Apr 2017 09:39:57 -0500
Subject: [PATCH] RH: trigger change uevent on new device creation
When multipath first sees a path device with user_friendly names
enabled, it can't know if the device should be multipathed. This means
that it will not claim the device in udev. If the device is eventually
multipathed, multipath should trigger a change uevent to update the udev
database to claim the device.
This also reverts commit 64e27ec066a001012f44550f095c93443e91d845 and
commit ffbb886a8a16cb063d669cd76a1e656fd3ec8c4b.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
libmultipath/configure.c | 26 ++++++++++++++++++++++++--
libmultipath/configure.h | 1 +
libmultipath/wwids.c | 4 ++--
multipath/main.c | 12 +-----------
multipathd/main.c | 7 ++-----
5 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index 22c11a2..7011ef7 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -427,6 +427,28 @@ trigger_udev_change(const struct multipath *mpp)
udev_device_unref(udd);
}
+void
+trigger_paths_udev_change(const struct multipath *mpp)
+{
+ struct pathgroup * pgp;
+ struct path * pp;
+ int i, j;
+
+ if (!mpp || !mpp->pg)
+ return;
+
+ vector_foreach_slot (mpp->pg, pgp, i) {
+ if (!pgp->paths)
+ continue;
+ vector_foreach_slot(pgp->paths, pp, j) {
+ if (!pp->udev)
+ continue;
+ sysfs_attr_set_value(pp->udev, "uevent", "change",
+ strlen("change"));
+ }
+ }
+}
+
static int
is_mpp_known_to_udev(const struct multipath *mpp)
{
@@ -821,8 +843,8 @@ 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);
+ if (mpp->action == ACT_CREATE && remember_wwid(mpp->wwid) == 1)
+ trigger_paths_udev_change(mpp);
if (!is_daemon) {
/* multipath client mode */
dm_switchgroup(mpp->alias, mpp->bestpg);
diff --git a/libmultipath/configure.h b/libmultipath/configure.h
index 0ffc28e..09603ba 100644
--- a/libmultipath/configure.h
+++ b/libmultipath/configure.h
@@ -37,3 +37,4 @@ int get_refwwid (enum mpath_cmds cmd, char * dev, enum devtypes dev_type,
int reload_map(struct vectors *vecs, struct multipath *mpp, int refresh, int is_daemon);
int sysfs_get_host_adapter_name(struct path *pp, char *adapter_name);
struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type);
+void trigger_paths_udev_change(const struct multipath *mpp);
diff --git a/libmultipath/wwids.c b/libmultipath/wwids.c
index 88bb72b..249c6c1 100644
--- a/libmultipath/wwids.c
+++ b/libmultipath/wwids.c
@@ -319,7 +319,7 @@ remember_wwid(char *wwid)
condlog(3, "wrote wwid %s to wwids file", wwid);
else
condlog(4, "wwid %s already in wwids file", wwid);
- return 0;
+ return ret;
}
int remember_cmdline_wwid(void)
@@ -353,7 +353,7 @@ int remember_cmdline_wwid(void)
next++;
}
if (strlen(ptr)) {
- if (remember_wwid(ptr) != 0)
+ if (remember_wwid(ptr) < 0)
ret = -1;
}
else {
diff --git a/multipath/main.c b/multipath/main.c
index ff570ac..ae6b06e 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -416,7 +416,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
}
if (cmd == CMD_ADD_WWID) {
r = remember_wwid(refwwid);
- if (r == 0)
+ if (r >= 0)
printf("wwid '%s' added\n", refwwid);
else
printf("failed adding '%s' to wwids file\n",
@@ -712,16 +712,6 @@ main (int argc, char *argv[])
}
}
- /*
- * FIXME: new device detection with find_multipaths currently
- * doesn't work reliably.
- */
- if (cmd == CMD_VALID_PATH &&
- conf->find_multipaths && conf->ignore_wwids) {
- condlog(2, "ignoring -i flag because find_multipath is set in multipath.conf");
- conf->ignore_wwids = 0;
- }
-
if (getuid() != 0) {
fprintf(stderr, "need to be root\n");
exit(1);
diff --git a/multipathd/main.c b/multipathd/main.c
index 596654c..c860e88 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -2172,7 +2172,8 @@ configure (struct vectors * vecs)
sync_maps_state(mpvec);
vector_foreach_slot(mpvec, mpp, i){
- remember_wwid(mpp->wwid);
+ if (remember_wwid(mpp->wwid) == 1)
+ trigger_paths_udev_change(mpp);
update_map_pr(mpp);
}
@@ -2251,10 +2252,6 @@ reconfigure (struct vectors * vecs)
conf->verbosity = verbosity;
if (bindings_read_only)
conf->bindings_read_only = bindings_read_only;
- if (conf->find_multipaths) {
- condlog(2, "find_multipaths is set: -n is implied");
- ignore_new_devs = 1;
- }
if (ignore_new_devs)
conf->ignore_new_devs = ignore_new_devs;
uxsock_timeout = conf->uxsock_timeout;
--
2.7.4