]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxccontainer: use thread-safe *_OFD_* locks
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 29 Apr 2018 11:39:28 +0000 (13:39 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 29 Apr 2018 11:56:15 +0000 (13:56 +0200)
If they aren't available fallback to BSD flock()s.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/lxccontainer.c
src/lxc/lxclock.c

index 0d59d5779df119e162ab8d860fe6dde866a5a17a..241a9d21b6eb69926ab385da90487403678cde9a 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdarg.h>
 #include <stdint.h>
 #include <stdio.h>
+#include <sys/file.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
 #include <sys/syscall.h>
@@ -140,7 +141,7 @@ static int ongoing_create(struct lxc_container *c)
        int fd, ret;
        size_t len;
        char *path;
-       struct flock lk;
+       struct flock lk = {0};
 
        len = strlen(c->config_path) + strlen(c->name) + 10;
        path = alloca(len);
@@ -157,11 +158,11 @@ static int ongoing_create(struct lxc_container *c)
 
        lk.l_type = F_WRLCK;
        lk.l_whence = SEEK_SET;
-       lk.l_start = 0;
-       lk.l_len = 0;
        lk.l_pid = -1;
 
-       ret = fcntl(fd, F_GETLK, &lk);
+       ret = fcntl(fd, F_OFD_GETLK, &lk);
+       if (ret < 0 && errno == EINVAL)
+               ret = flock(fd, LOCK_EX | LOCK_NB);
        close(fd);
        if (ret == 0 && lk.l_pid != -1) {
                /* create is still ongoing */
@@ -177,7 +178,7 @@ static int create_partial(struct lxc_container *c)
        int fd, ret;
        size_t len;
        char *path;
-       struct flock lk;
+       struct flock lk = {0};
 
        /* $lxcpath + '/' + $name + '/partial' + \0 */
        len = strlen(c->config_path) + strlen(c->name) + 10;
@@ -192,11 +193,15 @@ static int create_partial(struct lxc_container *c)
 
        lk.l_type = F_WRLCK;
        lk.l_whence = SEEK_SET;
-       lk.l_start = 0;
-       lk.l_len = 0;
 
-       ret = fcntl(fd, F_SETLKW, &lk);
+       ret = fcntl(fd, F_OFD_SETLKW, &lk);
        if (ret < 0) {
+               if (errno == EINVAL) {
+                       ret = flock(fd, LOCK_EX);
+                       if (ret == 0)
+                               return fd;
+               }
+
                SYSERROR("Failed to lock partial file %s", path);
                close(fd);
                return -1;
index 31dbd1c13aec01e08d0bc7c24b626aab71f71365..08c96e0b14fbc60403d39f1c1f2c727533c9e3c5 100644 (file)
  */
 
 #define _GNU_SOURCE
-#include <malloc.h>
-#include <stdio.h>
 #include <errno.h>
-#include <unistd.h>
 #include <fcntl.h>
-#include <stdlib.h>
+#include <malloc.h>
 #include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/file.h>
+#include <unistd.h>
 
 #include <lxc/lxccontainer.h>