[Lxc-users] [PATCH] lxclock and lxccontainer: switch from flock to fcntl

zoolook nbensa+lxcusers at gmail.com
Wed Jun 5 18:22:16 UTC 2013


Hi Serge,

On Wed, Jun 5, 2013 at 1:56 PM, Serge Hallyn <serge.hallyn at 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.hallyn at 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
>




More information about the lxc-users mailing list