summaryrefslogtreecommitdiffstats
path: root/0019-RHBZ-554598-fix-multipath-locking.patch
diff options
context:
space:
mode:
Diffstat (limited to '0019-RHBZ-554598-fix-multipath-locking.patch')
-rw-r--r--0019-RHBZ-554598-fix-multipath-locking.patch43
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;
+ }
+
+ /*