[lxc-devel] [PATCH 1/1] clone_paths: use 'rootfs' for destination directory

Stéphane Graber stgraber at ubuntu.com
Thu Jan 29 16:53:04 UTC 2015


On Thu, Jan 29, 2015 at 04:09:45PM +0000, Serge Hallyn wrote:
> We were trying to be smart and use whatever the last part of
> the container's rootfs path was.  However for block devices
> that doesn't make much sense.  I.e. if lxc.rootfs = /dev/md-1,
> chances are that /var/lib/lxc/c1/md-1 does not exist.
> 
> So always use the $lxcpath/$lxcname/rootfs, and if it does
> not exist, try to create it.
> 
> With this, 'lxc-clone -s -o c1 -n c2' where c1 has an lvm backend
> is fixed.  See https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/1414771
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>

Acked-by: Stéphane Graber <stgraber at ubuntu.com>

> ---
>  src/lxc/bdev.c | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
> index 721a72b..197ab55 100644
> --- a/src/lxc/bdev.c
> +++ b/src/lxc/bdev.c
> @@ -3340,7 +3340,6 @@ 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
> @@ -3359,25 +3358,26 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname,
>  
>  	if (!orig->dest) {
>  		int ret;
> -		orig->dest = malloc(MAXPATHLEN);
> +		size_t len;
> +		struct stat sb;
> +
> +		len = strlen(oldpath) + strlen(oldname) + strlen("/rootfs") + 2;
> +		orig->dest = malloc(len);
>  		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) {
> +		ret = snprintf(orig->dest, len, "%s/%s/rootfs", oldpath, oldname);
> +		if (ret < 0 || ret >= len) {
>  			ERROR("rootfs path too long");
>  			bdev_put(orig);
>  			return NULL;
>  		}
> +		ret = stat(orig->dest, &sb);
> +		if (ret < 0 && errno == ENOENT)
> +			if (mkdir_p(orig->dest, 0755) < 0)
> +				WARN("Error creating '%s', continuing.", orig->dest);
>  	}
>  
>  	/*
> -- 
> 2.1.0
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20150129/940b73ff/attachment.sig>


More information about the lxc-devel mailing list