NeilBrown: mapfile: fix locking.

Martin F. Krafft madduck at alioth.debian.org
Fri Jan 29 10:53:21 UTC 2010


Module: mdadm
Branch: upstream
Commit: fc7e81e54ec37ece4f1a8ec1729933fc22ec25ff
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=fc7e81e54ec37ece4f1a8ec1729933fc22ec25ff

Author: NeilBrown <neilb at suse.de>
Date:   Fri Jan 29 16:20:08 2010 +1100

mapfile: fix locking.

The current locking uses lockf, and is completely broken.
When you hold a lockf lock, any close of any fd on that file will
release the lock.  So map_read() call which is made as soon as we get
the lock, will immediately drop the lock.

So change to flock locking which isn't so badly designed.

Signed-off-by: NeilBrown <neilb at suse.de>

---

 mapfile.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/mapfile.c b/mapfile.c
index ed59db5..5444452 100644
--- a/mapfile.c
+++ b/mapfile.c
@@ -48,6 +48,7 @@
  * one that we can.
  */
 #include	"mdadm.h"
+#include	<sys/file.h>
 #include	<ctype.h>
 
 #define mapnames(base) { #base, #base ".new", #base ".lock"}
@@ -115,7 +116,7 @@ int map_lock(struct map_ent **melp)
 		lf = open_map(2, &lwhich);
 		if (lf == NULL)
 			return -1;
-		if (lockf(fileno(lf), F_LOCK, 0) != 0) {
+		if (flock(fileno(lf), LOCK_EX) != 0) {
 			fclose(lf);
 			lf = NULL;
 			return -1;
@@ -129,8 +130,10 @@ int map_lock(struct map_ent **melp)
 
 void map_unlock(struct map_ent **melp)
 {
-	if (lf)
+	if (lf) {
+		flock(fileno(lf), LOCK_UN);
 		fclose(lf);
+	}
 	unlink(mapname[lwhich][2]);
 	lf = NULL;
 }




More information about the pkg-mdadm-commits mailing list