Hi Serge, On Wed, Jun 5, 2013 at 1:56 PM, Serge Hallyn <serge.hal...@ubuntu.com> wrote: > flock is not supported on nfs. fcntl is at least supported on newer > (v3 and above) nfs. >
Applied on top of lxc-0.9.0.0~staging~20130605-1508 and it is now working ok here. Thank you Serge! Best Regards, Norberto > 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