[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