[lxc-devel] [PATCH] Fix clone issues

KATOH Yasufumi karma at jazz.email.ne.jp
Wed Nov 5 07:03:34 UTC 2014


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 at jazz.email.ne.jp>
---
 src/lxc/bdev.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
index ae5c77c..c95f3f0 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
-- 
2.1.1



More information about the lxc-devel mailing list