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