44 lines
1.0 KiB
Diff
44 lines
1.0 KiB
Diff
|
---
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
/*
|