]> 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>
Thu, 23 Aug 2018 20:57:53 +0000 (22:57 +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 fcc8ca65efe5ace7d0b94d5e6df754ebd420f29e..c0fb9596366ba53071832d75eba9eb31cfd459be 100644 (file)
@@ -19,6 +19,7 @@
  */
 
 #define _GNU_SOURCE
+#include <arpa/inet.h>
 #include <dirent.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <stdarg.h>
 #include <stdint.h>
 #include <stdio.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-#include <sys/sysmacros.h>
+#include <sys/file.h>
 #include <sys/mman.h>
 #include <sys/mount.h>
 #include <sys/syscall.h>
+#include <sys/sysmacros.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <unistd.h>
 
 #include "af_unix.h"
 #include "attach.h"
 #include "cgroup.h"
-#include "conf.h"
-#include "config.h"
 #include "commands.h"
 #include "commands_utils.h"
+#include "conf.h"
+#include "config.h"
 #include "confile.h"
 #include "console.h"
 #include "criu.h"
@@ -59,9 +60,9 @@
 #include "start.h"
 #include "state.h"
 #include "storage.h"
-#include "storage_utils.h"
 #include "storage/btrfs.h"
 #include "storage/overlay.h"
+#include "storage_utils.h"
 #include "sync.h"
 #include "utils.h"
 #include "version.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 */
@@ -176,7 +177,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;
@@ -191,11 +192,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>