]> git.ipfire.org Git - people/stevee/ipfire-3.x.git/blobdiff - multipath-tools/patches/0019-RHBZ-554598-fix-multipath-locking.patch
Move all packages to root.
[people/stevee/ipfire-3.x.git] / multipath-tools / patches / 0019-RHBZ-554598-fix-multipath-locking.patch
diff --git a/multipath-tools/patches/0019-RHBZ-554598-fix-multipath-locking.patch b/multipath-tools/patches/0019-RHBZ-554598-fix-multipath-locking.patch
new file mode 100644 (file)
index 0000000..cf101e2
--- /dev/null
@@ -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;
+ }
+ /*