From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski 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 --- 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 61f68f8..81b0bc4 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -444,6 +444,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) { @@ -842,8 +864,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 27a7e6f..545cbc2 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, 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); diff --git a/libmultipath/wwids.c b/libmultipath/wwids.c index 9722714..9e9baed 100644 --- a/libmultipath/wwids.c +++ b/libmultipath/wwids.c @@ -321,7 +321,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) @@ -355,7 +355,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 baf6759..12d6f15 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -427,7 +427,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", @@ -782,16 +782,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 841d3e9..417fc7e 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -2323,7 +2323,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); } @@ -2403,10 +2404,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