[lxc-devel] [PATCH] lxc-create: fix that creation fails if lxc.rootfs is set

Young Sheng shyodx at gmail.com
Sat Oct 26 00:35:13 UTC 2013


On Fri, Oct 25, 2013 at 9:55 PM, Serge Hallyn <serge.hallyn at ubuntu.com>wrote:

> Quoting Sheng Yong (shyodx at gmail.com):
> > [code] ### lxccontainer.c: 1111
> > if (lxcapi_is_defined(c) && c->lxc_conf && c->lxc_conf->rootfs.path &&
> access(c->lxc_conf->rootfs.path, F_OK) == 0)
> >       goto out;
> > [/code]
> >
> >       If lxc.rootfs is set and no failure happens before we check
> >       whether the container is already created, the condition will be
> >       always true. In "out" section, lxcapi_destroy() is called to
> >       remove rootfs directory indicated by lxc.rootfs.
> >
> >       If lxc.rootfs is set, we believe that rootfs is ready. Then the
> >       creation should be successful.
> >
> > NOTE: the situation where both -t options and lxc.rootfs are set should
> > be considered.
>
> Hi,
>
> thanks for the patch.  Please sign off commits in the future (you can do
> this using 'git commit -s').  However, nack to this particular version.
> How about the below alternative?
>
This is much better. Thanks for giving me the suggestion :-)

regards,
shyodx

>
> Subject: [PATCH 1/1] lxcapi_create: don't delete if container already
> exists
>
> 1. don't save the starting config until we've ensured the container
>    does noet yet exist.
> 2. If the container exists, return false (because creation did not
>    happen) but don't delete the container.
>
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
> Cc: Sheng Yong <shyodx at gmail.com>
> ---
>  src/lxc/lxccontainer.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 9aea614..6699e9c 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -1090,6 +1090,7 @@ static bool lxcapi_create(struct lxc_container *c,
> const char *t,
>         pid_t pid;
>         char *tpath = NULL;
>         int partial_fd;
> +       bool delete_on_err = false;
>
>         if (!c)
>                 return false;
> @@ -1102,15 +1103,17 @@ static bool lxcapi_create(struct lxc_container *c,
> const char *t,
>                 }
>         }
>
> +       /* container is already created if we have a config and
> rootfs.path is accessible */
> +       if (lxcapi_is_defined(c) && c->lxc_conf &&
> c->lxc_conf->rootfs.path && access(c->lxc_conf->rootfs.path, F_OK) == 0)
> +               goto out;
> +
> +       delete_on_err = true;
> +
>         if (!c->save_config(c, NULL)) {
>                 ERROR("failed to save starting configuration for %s\n",
> c->name);
>                 goto out;
>         }
>
> -       /* container is already created if we have a config and
> rootfs.path is accessible */
> -       if (lxcapi_is_defined(c) && c->lxc_conf &&
> c->lxc_conf->rootfs.path && access(c->lxc_conf->rootfs.path, F_OK) == 0)
> -               goto out;
> -
>         /* Mark that this container is being created */
>         if ((partial_fd = create_partial(c)) < 0)
>                 goto out;
> @@ -1183,7 +1186,7 @@ out_unlock:
>  out:
>         if (tpath)
>                 free(tpath);
> -       if (!bret && c)
> +       if (delete_on_err && !bret && c)
>                 lxcapi_destroy(c);
>         return bret;
>  }
> --
> 1.8.1.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20131026/7ec37b7b/attachment.html>


More information about the lxc-devel mailing list