]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Fix clone issues
authorKATOH Yasufumi <karma@jazz.email.ne.jp>
Wed, 5 Nov 2014 07:03:34 +0000 (16:03 +0900)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 2 Dec 2014 17:21:15 +0000 (12:21 -0500)
This commit fixes two issues at the time of clone:
* unnecessary directory is created when clone between overlayfs/aufs
* clone failed when the end of rootfs path is not "/rootfs"

Signed-off-by: KATOH Yasufumi <karma@jazz.email.ne.jp>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/bdev.c

index 489a2fb81b0da029222767f36ca010993829bfed..9ccd666597dc5320ed73089d539a2f6580c87b14 100644 (file)
@@ -3012,6 +3012,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
        const char *oldname = c0->name;
        const char *oldpath = c0->config_path;
        struct rsync_data data;
+       char *rootfs;
 
        /* if the container name doesn't show up in the rootfs path, then
         * we don't know how to come up with a new name
@@ -3022,12 +3023,35 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
                return NULL;
        }
 
-       orig = bdev_init(src, src, NULL);
+       orig = bdev_init(src, NULL, NULL);
        if (!orig) {
                ERROR("failed to detect blockdev type for %s", src);
                return NULL;
        }
 
+       if (!orig->dest) {
+               int ret;
+               orig->dest = malloc(MAXPATHLEN);
+               if (!orig->dest) {
+                       ERROR("out of memory");
+                       bdev_put(orig);
+                       return NULL;
+               }
+               rootfs = strrchr(orig->src, '/');
+               if (!rootfs) {
+                       ERROR("invalid rootfs path");
+                       bdev_put(orig);
+                       return NULL;
+               }
+               rootfs++;
+               ret = snprintf(orig->dest, MAXPATHLEN, "%s/%s/%s", oldpath, oldname, rootfs);
+               if (ret < 0 || ret >= MAXPATHLEN) {
+                       ERROR("rootfs path too long");
+                       bdev_put(orig);
+                       return NULL;
+               }
+       }
+
        /*
         * special case for snapshot - if caller requested maybe_snapshot and
         * keepbdevtype and backing store is directory, then proceed with a copy