From: NeilBrown Date: Fri, 29 Jan 2010 05:20:08 +0000 (+1100) Subject: mapfile: fix locking. X-Git-Tag: mdadm-3.1.2~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fc7e81e54ec37ece4f1a8ec1729933fc22ec25ff;p=thirdparty%2Fmdadm.git 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 --- diff --git a/mapfile.c b/mapfile.c index ed59db5f..5444452d 100644 --- a/mapfile.c +++ b/mapfile.c @@ -48,6 +48,7 @@ * one that we can. */ #include "mdadm.h" +#include #include #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; }