From 3858c11b3b9ff7fabac2296ddd55d26e5aba7d3a Mon Sep 17 00:00:00 2001 From: KATOH Yasufumi Date: Wed, 5 Nov 2014 16:03:34 +0900 Subject: [PATCH] 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 --- 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 489a2fb81..9ccd66659 100644 --- a/src/lxc/bdev.c +++ b/src/lxc/bdev.c @@ -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 -- 2.47.2