[sheepdog] [PATCH] sheep: lock against concurrent access to the store directory
Christoph Hellwig
hch at infradead.org
Thu May 17 17:40:17 CEST 2012
This patch uses lockf on a specially create lock file in the base directory
to detect early on if another sheep is using this directory and abort with
a useful error message.
Signed-off-by: Christoph Hellwig <hch at lst.de>
diff --git a/sheep/store.c b/sheep/store.c
index 5d433f3..e93daef 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -672,11 +672,40 @@ again:
return 0;
}
+#define LOCK_PATH "/lock"
+
int init_base_path(const char *d)
{
int new = 0;
+ int ret;
+ int fd;
+ char *lock_path;
+
+ ret = init_path(d, &new);
+ if (ret)
+ return ret;
+
+ lock_path = zalloc(strlen(d) + strlen(LOCK_PATH) + 1);
+ sprintf(lock_path, "%s" LOCK_PATH, d);
+
+ fd = open(lock_path, O_WRONLY|O_CREAT, def_fmode);
+ if (fd < 0) {
+ eprintf("failed to open lock file %s (%s)\n",
+ lock_path, strerror(errno));
+ return -1;
+ }
+
+ if (lockf(fd, F_TLOCK, 1) < 0) {
+ if (errno == EACCES || errno == EAGAIN) {
+ eprintf("another sheep daemon is using %s\n", d);
+ } else {
+ eprintf("unable to get base dir lock (%s)\n",
+ strerror(errno));
+ }
+ return -1;
+ }
- return init_path(d, &new);
+ return 0;
}
#define OBJ_PATH "/obj/"
More information about the sheepdog
mailing list