]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mapfile: fix locking.
authorNeilBrown <neilb@suse.de>
Fri, 29 Jan 2010 05:20:08 +0000 (16:20 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 29 Jan 2010 05:20:08 +0000 (16:20 +1100)
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@suse.de>
mapfile.c

index ed59db5fe62df9c4db2807906743f4bd7f740f19..5444452df2914f3fc0b0fc128512d92e818e6627 100644 (file)
--- 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;
 }