[lxc-devel] [PATCH 2/2] lxc-create: fix conflict of rootfs.path and template default path

Sheng Yong shyodx at gmail.com
Sun Oct 27 06:38:03 UTC 2013


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 <shyodx at gmail.com>
---
 src/lxc/lxccontainer.c |   30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 443d607..71daacd 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;
 	}
-- 
1.7.9.5





More information about the lxc-devel mailing list