lxccontainer: use thread-safe *_OFD_* locks

If they aren't available fallback to BSD flock()s.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner 2018-04-29 13:39:28 +02:00
parent 0e14584db8
commit 5647455516
No known key found for this signature in database
GPG Key ID: 8EB056D53EECB12D
2 changed files with 18 additions and 12 deletions

View 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;

View File

@ -19,13 +19,14 @@
*/
#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>