diff options
Diffstat (limited to '0019-RHBZ-554598-fix-multipath-locking.patch')
-rw-r--r-- | 0019-RHBZ-554598-fix-multipath-locking.patch | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/0019-RHBZ-554598-fix-multipath-locking.patch b/0019-RHBZ-554598-fix-multipath-locking.patch new file mode 100644 index 0000000..cf101e2 --- /dev/null +++ b/0019-RHBZ-554598-fix-multipath-locking.patch @@ -0,0 +1,43 @@ +--- + libmultipath/configure.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +Index: multipath-tools/libmultipath/configure.c +=================================================================== +--- multipath-tools.orig/libmultipath/configure.c ++++ multipath-tools/libmultipath/configure.c +@@ -284,6 +284,7 @@ lock_multipath (struct multipath * mpp, + struct pathgroup * pgp; + struct path * pp; + int i, j; ++ int x, y; + + if (!mpp || !mpp->pg) + return 0; +@@ -294,12 +295,25 @@ lock_multipath (struct multipath * mpp, + vector_foreach_slot(pgp->paths, pp, j) { + if (lock && flock(pp->fd, LOCK_EX | LOCK_NB) && + errno == EWOULDBLOCK) +- return 1; ++ goto fail; + else if (!lock) + flock(pp->fd, LOCK_UN); + } + } + return 0; ++fail: ++ vector_foreach_slot (mpp->pg, pgp, x) { ++ if (x > i) ++ return 1; ++ if (!pgp->paths) ++ continue; ++ vector_foreach_slot(pgp->paths, pp, y) { ++ if (x == i && y > j) ++ return 1; ++ flock(pp->fd, LOCK_UN); ++ } ++ } ++ return 1; + } + + /* |