flock is not supported on nfs. fcntl is at least supported on newer (v3 and above) nfs.
Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/lxccontainer.c | 22 +++++++++++++++++----- src/lxc/lxclock.c | 16 ++++++++++++++-- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 2edf749..cf5252b 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -23,6 +23,7 @@ #include <sys/types.h> #include <sys/wait.h> #include <errno.h> +#include <fcntl.h> #include <sched.h> #include "config.h" #include "lxc.h" @@ -39,7 +40,6 @@ #include <lxc/utils.h> #include <lxc/monitor.h> #include <sched.h> -#include <fcntl.h> #include <arpa/inet.h> #include <ifaddrs.h> @@ -66,6 +66,8 @@ int ongoing_create(struct lxc_container *c) int len = strlen(c->config_path) + strlen(c->name) + 10; char *path = alloca(len); int fd, ret; + struct flock lk; + ret = snprintf(path, len, "%s/%s/partial", c->config_path, c->name); if (ret < 0 || ret >= len) { ERROR("Error writing partial pathname"); @@ -82,8 +84,12 @@ int ongoing_create(struct lxc_container *c) process_unlock(); return 0; } - if ((ret = flock(fd, LOCK_EX | LOCK_NB)) == -1 && - errno == EWOULDBLOCK) { + lk.l_type = F_WRLCK; + lk.l_whence = SEEK_SET; + lk.l_start = 0; + lk.l_len = 0; + lk.l_pid = -1; + if (fcntl(fd, F_GETLK, &lk) == 0 && lk.l_pid != -1) { // create is still ongoing close(fd); process_unlock(); @@ -101,6 +107,8 @@ int create_partial(struct lxc_container *c) int len = strlen(c->config_path) + strlen(c->name) + 10; char *path = alloca(len); int fd, ret; + struct flock lk; + ret = snprintf(path, len, "%s/%s/partial", c->config_path, c->name); if (ret < 0 || ret >= len) { ERROR("Error writing partial pathname"); @@ -108,12 +116,16 @@ int create_partial(struct lxc_container *c) } if (process_lock()) return -1; - if ((fd=open(path, O_CREAT | O_EXCL, 0755)) < 0) { + if ((fd=open(path, O_RDWR | O_CREAT | O_EXCL, 0755)) < 0) { SYSERROR("Erorr creating partial file"); process_unlock(); return -1; } - if (flock(fd, LOCK_EX) < 0) { + lk.l_type = F_WRLCK; + lk.l_whence = SEEK_SET; + lk.l_start = 0; + lk.l_len = 0; + if (fcntl(fd, F_SETLKW, &lk) < 0) { SYSERROR("Error locking partial file %s", path); close(fd); process_unlock(); diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index 4bbe873..d004cc5 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -23,6 +23,7 @@ #include <stdio.h> #include <errno.h> #include <unistd.h> +#include <fcntl.h> #include <lxc/utils.h> #include <lxc/log.h> #include <lxc/lxccontainer.h> @@ -111,6 +112,7 @@ out: int lxclock(struct lxc_lock *l, int timeout) { int ret = -1, saved_errno = errno; + struct flock lk; switch(l->type) { case LXC_LOCK_ANON_SEM: @@ -152,7 +154,11 @@ int lxclock(struct lxc_lock *l, int timeout) goto out; } } - ret = flock(l->u.f.fd, LOCK_EX); + lk.l_type = F_WRLCK; + lk.l_whence = SEEK_SET; + lk.l_start = 0; + lk.l_len = 0; + ret = fcntl(l->u.f.fd, F_SETLKW, &lk); process_unlock(); if (ret == -1) saved_errno = errno; @@ -167,6 +173,7 @@ out: int lxcunlock(struct lxc_lock *l) { int ret = 0, saved_errno = errno; + struct flock lk; switch(l->type) { case LXC_LOCK_ANON_SEM: @@ -179,7 +186,12 @@ int lxcunlock(struct lxc_lock *l) case LXC_LOCK_FLOCK: process_lock(); if (l->u.f.fd != -1) { - if ((ret = flock(l->u.f.fd, LOCK_UN)) < 0) + lk.l_type = F_UNLCK; + lk.l_whence = SEEK_SET; + lk.l_start = 0; + lk.l_len = 0; + ret = fcntl(l->u.f.fd, F_SETLK, &lk); + if (ret < 0) saved_errno = errno; close(l->u.f.fd); l->u.f.fd = -1; -- 1.7.9.5 ------------------------------------------------------------------------------ How ServiceNow helps IT people transform IT departments: 1. A cloud service to automate IT design, transition and operations 2. Dashboards that offer high-level views of enterprise services 3. A single system of record for all IT processes http://p.sf.net/sfu/servicenow-d2d-j _______________________________________________ Lxc-users mailing list Lxc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-users