From: KATOH Yasufumi Date: Wed, 5 Nov 2014 07:03:34 +0000 (+0900) Subject: Fix clone issues X-Git-Tag: lxc-1.1.0.alpha3~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac00e8f2542be885ece143ceff959936ee35312d;p=thirdparty%2Flxc.git Fix clone issues 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 Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c index ae5c77c07..c95f3f06d 100644 --- a/src/lxc/bdev.c +++ b/src/lxc/bdev.c @@ -3328,6 +3328,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 @@ -3338,12 +3339,35 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, return NULL; } - orig = bdev_init(c0->lxc_conf, src, src, NULL); + orig = bdev_init(c0->lxc_conf, 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