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 <shy...@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


------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60135991&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to