[lxc-devel] [PATCH v2 1/3] lxccontainer.c: split up create_run_template()

Serge Hallyn serge.hallyn at ubuntu.com
Thu Oct 9 18:15:26 UTC 2014


Quoting TAMUKI Shoichi (tamuki at linet.gr.jp):
> Split figureout_rootfs() off from create_run_template() to allow
> common use of the function.  Also, add the tweak to free the bdev.
> 
> Signed-off-by: TAMUKI Shoichi <tamuki at linet.gr.jp>

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
> v2:
>   - add the tweak to free the bdev.
>   - correct misspelling in commit message.
> 
>  src/lxc/lxccontainer.c | 108 ++++++++++++++++++++++++++++---------------------
>  1 file changed, 62 insertions(+), 46 deletions(-)
> 
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index 4c3d4d5..07ffc08 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -876,6 +876,9 @@ static char *lxcbasename(char *path)
>  	return p;
>  }
>  
> +/* Require that callers free the returned string. */
> +static char *figureout_rootfs(struct lxc_conf *conf);
> +
>  static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet,
>  				char *const argv[])
>  {
> @@ -891,8 +894,7 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet
>  	}
>  
>  	if (pid == 0) { // child
> -		char *patharg, *namearg, *rootfsarg, *src;
> -		struct bdev *bdev = NULL;
> +		char *patharg, *namearg, *rootfsarg, *rootfs;
>  		int i;
>  		int ret, len, nargs = 0;
>  		char **newargv;
> @@ -907,49 +909,9 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet
>  			open("/dev/null", O_RDWR);
>  		}
>  
> -		src = c->lxc_conf->rootfs.path;
> -		/*
> -		 * for an overlay create, what the user wants is the template to fill
> -		 * in what will become the readonly lower layer.  So don't mount for
> -		 * the template
> -		 */
> -		if (strncmp(src, "overlayfs:", 10) == 0)
> -			src = overlay_getlower(src+10);
> -		if (strncmp(src, "aufs:", 5) == 0)
> -			src = overlay_getlower(src+5);
> -
> -		bdev = bdev_init(c->lxc_conf, src, c->lxc_conf->rootfs.mount, NULL);
> -		if (!bdev) {
> -			ERROR("Error opening rootfs");
> +		rootfs=figureout_rootfs(conf);
> +		if (!rootfs)
>  			exit(1);
> -		}
> -
> -		if (geteuid() == 0) {
> -			if (unshare(CLONE_NEWNS) < 0) {
> -				ERROR("error unsharing mounts");
> -				exit(1);
> -			}
> -			if (detect_shared_rootfs()) {
> -				if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL)) {
> -					SYSERROR("Failed to make / rslave to run template");
> -					ERROR("Continuing...");
> -				}
> -			}
> -		}
> -		if (strcmp(bdev->type, "dir") && strcmp(bdev->type, "btrfs")) {
> -			if (geteuid() != 0) {
> -				ERROR("non-root users can only create btrfs and directory-backed containers");
> -				exit(1);
> -			}
> -			if (bdev->ops->mount(bdev) < 0) {
> -				ERROR("Error mounting rootfs");
> -				exit(1);
> -			}
> -		} else { // TODO come up with a better way here!
> -			if (bdev->dest)
> -				free(bdev->dest);
> -			bdev->dest = strdup(bdev->src);
> -		}
>  
>  		/*
>  		 * create our new array, pre-pend the template name and
> @@ -981,11 +943,11 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet
>  			exit(1);
>  		newargv[2] = namearg;
>  
> -		len = strlen("--rootfs=") + 1 + strlen(bdev->dest);
> +		len = strlen("--rootfs=") + 1 + strlen(rootfs);
>  		rootfsarg = malloc(len);
>  		if (!rootfsarg)
>  			exit(1);
> -		ret = snprintf(rootfsarg, len, "--rootfs=%s", bdev->dest);
> +		ret = snprintf(rootfsarg, len, "--rootfs=%s", rootfs);
>  		if (ret < 0 || ret >= len)
>  			exit(1);
>  		newargv[3] = rootfsarg;
> @@ -1125,6 +1087,60 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool quiet
>  	return true;
>  }
>  
> +static char *figureout_rootfs(struct lxc_conf *conf)
> +{
> +	char *src, *rootfs = NULL;
> +	struct bdev *bdev = NULL;
> +
> +	src = conf->rootfs.path;
> +	/*
> +	 * for an overlay create, what the user wants is the template to fill
> +	 * in what will become the readonly lower layer.  So don't mount for
> +	 * the template
> +	 */
> +	if (strncmp(src, "overlayfs:", 10) == 0)
> +		src = overlay_getlower(src+10);
> +	if (strncmp(src, "aufs:", 5) == 0)
> +		src = overlay_getlower(src+5);
> +
> +	bdev = bdev_init(conf, src, conf->rootfs.mount, NULL);
> +	if (!bdev) {
> +		ERROR("Error opening rootfs");
> +		return NULL;
> +	}
> +
> +	if (geteuid() == 0) {
> +		if (unshare(CLONE_NEWNS) < 0) {
> +			ERROR("error unsharing mounts");
> +			goto out;
> +		}
> +		if (detect_shared_rootfs()) {
> +			if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL)) {
> +				SYSERROR("Failed to make / rslave to run template");
> +				ERROR("Continuing...");
> +			}
> +		}
> +	}
> +	if (strcmp(bdev->type, "dir") && strcmp(bdev->type, "btrfs")) {
> +		if (geteuid() != 0) {
> +			ERROR("non-root users can only create btrfs and directory-backed containers");
> +			goto out;
> +		}
> +		if (bdev->ops->mount(bdev) < 0) {
> +			ERROR("Error mounting rootfs");
> +			goto out;
> +		}
> +	} else { // TODO come up with a better way here!
> +		if (bdev->dest)
> +			free(bdev->dest);
> +		bdev->dest = strdup(bdev->src);
> +	}
> +	rootfs = strdup(bdev->dest);
> +out:
> +	bdev_put(bdev);
> +	return rootfs;
> +}
> +
>  static bool prepend_lxc_header(char *path, const char *t, char *const argv[])
>  {
>  	long flen;
> -- 
> 1.9.0
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list