diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 0d59d5779..241a9d21b 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -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; diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index 31dbd1c13..08c96e0b1 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -19,13 +19,14 @@ */ #define _GNU_SOURCE -#include -#include #include -#include #include -#include +#include #include +#include +#include +#include +#include #include