From: Sheng Yong Date: Sun, 27 Oct 2013 06:38:03 +0000 (+0800) Subject: lxc-create: fix conflict of rootfs.path and template default path X-Git-Tag: lxc-1.0.0.alpha3~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd219ae6590646d3a56c61f8bd5195c1c01d934b;p=thirdparty%2Flxc.git lxc-create: fix conflict of rootfs.path and template default path 1. rootfs.path set, -t not set: rootfs.path is rootfs path 2. rootfs.path set, -t set: change template default path to rootfs path 3. rootfs.path not set, -t set: template default path is rootfs path 4. rootfs.path not set, -t not set: error 5. rootfs.path set but cannot access: error Signed-off-by: Sheng Yong Signed-off-by: Serge Hallyn --- diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 7a4d75f52..d882fc3ef 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -701,15 +701,23 @@ static struct bdev *do_bdev_create(struct lxc_container *c, const char *type, struct bdev_specs *specs) { char *dest; - const char *lxcpath = lxcapi_get_config_path(c); + const char *lxcpath; size_t len; struct bdev *bdev; int ret; - /* lxcpath/lxcname/rootfs */ - len = strlen(c->name) + strlen(lxcpath) + 9; - dest = alloca(len); - ret = snprintf(dest, len, "%s/%s/rootfs", lxcpath, c->name); + /* rootfs.path or lxcpath/lxcname/rootfs */ + if (c->lxc_conf->rootfs.path && access(c->lxc_conf->rootfs.path, F_OK) == 0) { + lxcpath = c->lxc_conf->rootfs.path; + len = strlen(lxcpath) + 1; + dest = alloca(len); + ret = snprintf(dest, len, "%s", lxcpath); + } else { + lxcpath = lxcapi_get_config_path(c); + len = strlen(c->name) + strlen(lxcpath) + 9; + dest = alloca(len); + ret = snprintf(dest, len, "%s/%s/rootfs", lxcpath, c->name); + } if (ret < 0 || ret >= len) return NULL; @@ -1107,8 +1115,16 @@ static bool lxcapi_create(struct lxc_container *c, const char *t, 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 && !tpath) { + /* + * either template or rootfs.path should be set. + * if both template and rootfs.path are set, template is setup as rootfs.path. + * container is already created if we have a config and rootfs.path is accessible + */ + if (c->lxc_conf && !c->lxc_conf->rootfs.path && !tpath) + goto out; + if (c->lxc_conf->rootfs.path && access(c->lxc_conf->rootfs.path, F_OK) != 0) + goto out; + if (lxcapi_is_defined(c) && c->lxc_conf->rootfs.path && !tpath) { ret = true; goto out; }