summaryrefslogtreecommitdiffstats
path: root/0010-call-start_waiter_thread-before-setup_multipath.patch
diff options
context:
space:
mode:
authorBenjamin Marzinski <bmarzins@redhat.com>2018-02-15 13:17:53 -0600
committerBenjamin Marzinski <bmarzins@redhat.com>2018-02-15 13:17:53 -0600
commit5bea53fe7ed7dd7afa8e76f7f84f76fdb89d59d9 (patch)
tree9a89c87df6336311ebe30ae2c51af13f92d6a3d6 /0010-call-start_waiter_thread-before-setup_multipath.patch
parent7e8f34e1813a9ae89b5acc012fa7d45c3d7bbdb8 (diff)
downloaddevice-mapper-multipath-5bea53fe7ed7dd7afa8e76f7f84f76fdb89d59d9.tar.gz
device-mapper-multipath-5bea53fe7ed7dd7afa8e76f7f84f76fdb89d59d9.tar.xz
device-mapper-multipath-5bea53fe7ed7dd7afa8e76f7f84f76fdb89d59d9.zip
device-mapper-multipath-0.7.4-1.git07e7bd5master
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
Diffstat (limited to '0010-call-start_waiter_thread-before-setup_multipath.patch')
-rw-r--r--0010-call-start_waiter_thread-before-setup_multipath.patch129
1 files changed, 129 insertions, 0 deletions
diff --git a/0010-call-start_waiter_thread-before-setup_multipath.patch b/0010-call-start_waiter_thread-before-setup_multipath.patch
new file mode 100644
index 0000000..bb5a479
--- /dev/null
+++ b/0010-call-start_waiter_thread-before-setup_multipath.patch
@@ -0,0 +1,129 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Benjamin Marzinski <bmarzins@redhat.com>
+Date: Mon, 5 Feb 2018 21:59:16 -0600
+Subject: [PATCH] call start_waiter_thread() before setup_multipath()
+
+If setup_multipath() is called before the waiter thread has started,
+there is a window where a dm event can occur between when
+setup_multipath() updates the device state and when the waiter thread
+starts waiting for new events, causing the new event to be missed and
+the multipath device to not get updated.
+
+Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
+---
+ multipathd/main.c | 37 ++++++++++++++++++++-----------------
+ 1 file changed, 20 insertions(+), 17 deletions(-)
+
+diff --git a/multipathd/main.c b/multipathd/main.c
+index 94b2406..efc39d7 100644
+--- a/multipathd/main.c
++++ b/multipathd/main.c
+@@ -321,7 +321,7 @@ set_multipath_wwid (struct multipath * mpp)
+ }
+
+ static int
+-update_map (struct multipath *mpp, struct vectors *vecs)
++update_map (struct multipath *mpp, struct vectors *vecs, int new_map)
+ {
+ int retries = 3;
+ char params[PARAMS_SIZE] = {0};
+@@ -351,6 +351,12 @@ retry:
+ dm_lib_release();
+
+ fail:
++ if (new_map && (retries < 0 || start_waiter_thread(mpp, vecs))) {
++ condlog(0, "%s: failed to create new map", mpp->alias);
++ remove_map(mpp, vecs, 1);
++ return 1;
++ }
++
+ if (setup_multipath(vecs, mpp))
+ return 1;
+
+@@ -395,12 +401,9 @@ add_map_without_path (struct vectors *vecs, char *alias)
+
+ vector_set_slot(vecs->mpvec, mpp);
+
+- if (update_map(mpp, vecs) != 0) /* map removed */
++ if (update_map(mpp, vecs, 1) != 0) /* map removed */
+ return NULL;
+
+- if (start_waiter_thread(mpp, vecs))
+- goto out;
+-
+ return mpp;
+ out:
+ remove_map(mpp, vecs, PURGE_VEC);
+@@ -554,7 +557,7 @@ ev_add_map (char * dev, char * alias, struct vectors * vecs)
+ if (mpp->wait_for_udev > 1) {
+ condlog(2, "%s: performing delayed actions",
+ mpp->alias);
+- if (update_map(mpp, vecs))
++ if (update_map(mpp, vecs, 0))
+ /* setup multipathd removed the map */
+ return 1;
+ }
+@@ -865,6 +868,11 @@ retry:
+ }
+ dm_lib_release();
+
++ if ((mpp->action == ACT_CREATE ||
++ (mpp->action == ACT_NOTHING && start_waiter && !mpp->waiter)) &&
++ start_waiter_thread(mpp, vecs))
++ goto fail_map;
++
+ /*
+ * update our state from kernel regardless of create or reload
+ */
+@@ -873,11 +881,6 @@ retry:
+
+ sync_map_state(mpp);
+
+- if ((mpp->action == ACT_CREATE ||
+- (mpp->action == ACT_NOTHING && start_waiter && !mpp->waiter)) &&
+- start_waiter_thread(mpp, vecs))
+- goto fail_map;
+-
+ if (retries >= 0) {
+ condlog(2, "%s [%s]: path added to devmap %s",
+ pp->dev, pp->dev_t, mpp->alias);
+@@ -1479,7 +1482,8 @@ missing_uev_wait_tick(struct vectors *vecs)
+ if (mpp->wait_for_udev && --mpp->uev_wait_tick <= 0) {
+ timed_out = 1;
+ condlog(0, "%s: timeout waiting on creation uevent. enabling reloads", mpp->alias);
+- if (mpp->wait_for_udev > 1 && update_map(mpp, vecs)) {
++ if (mpp->wait_for_udev > 1 &&
++ update_map(mpp, vecs, 0)) {
+ /* update_map removed map */
+ i--;
+ continue;
+@@ -1511,7 +1515,7 @@ ghost_delay_tick(struct vectors *vecs)
+ condlog(0, "%s: timed out waiting for active path",
+ mpp->alias);
+ mpp->force_udev_reload = 1;
+- if (update_map(mpp, vecs) != 0) {
++ if (update_map(mpp, vecs, 0) != 0) {
+ /* update_map removed map */
+ i--;
+ continue;
+@@ -2169,14 +2173,13 @@ configure (struct vectors * vecs)
+ * start dm event waiter threads for these new maps
+ */
+ vector_foreach_slot(vecs->mpvec, mpp, i) {
+- if (setup_multipath(vecs, mpp)) {
+- i--;
+- continue;
+- }
+ if (start_waiter_thread(mpp, vecs)) {
+ remove_map(mpp, vecs, 1);
+ i--;
++ continue;
+ }
++ if (setup_multipath(vecs, mpp))
++ i--;
+ }
+ return 0;
+ }
+--
+2.7.4
+