From: Christian Brauner Date: Sat, 1 Jul 2017 20:36:27 +0000 (+0200) Subject: storage: prefix all dir paths X-Git-Tag: lxc-2.1.0~58^2~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e97055507f384122fe7731f45e1817df980e4662;p=thirdparty%2Flxc.git storage: prefix all dir paths Signed-off-by: Christian Brauner --- diff --git a/src/lxc/bdev/bdev.c b/src/lxc/bdev/bdev.c index 48f2c2759..1bc8afcd0 100644 --- a/src/lxc/bdev/bdev.c +++ b/src/lxc/bdev/bdev.c @@ -306,6 +306,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, struct bdev *orig, *new; pid_t pid; int ret; + char *src_no_prefix; bool snap = flags & LXC_CLONE_SNAPSHOT; bool maybe_snap = flags & LXC_CLONE_MAYBE_SNAPSHOT; bool keepbdevtype = flags & LXC_CLONE_KEEPBDEVTYPE; @@ -402,7 +403,9 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, goto err; } - if (am_unpriv() && chown_mapped_root(new->src, c0->lxc_conf) < 0) + src_no_prefix = lxc_storage_get_path(new->src, new->type); + + if (am_unpriv() && chown_mapped_root(src_no_prefix, c0->lxc_conf) < 0) WARN("Failed to update ownership of %s", new->dest); if (snap) @@ -456,6 +459,8 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, "rsync_rootfs_wrapper"); else ret = rsync_rootfs(&data); + if (ret < 0) + ERROR("Failed to rsync"); exit(ret == 0 ? 0 : 1); diff --git a/src/lxc/bdev/lxcdir.c b/src/lxc/bdev/lxcdir.c index be897bb77..652d7e08f 100644 --- a/src/lxc/bdev/lxcdir.c +++ b/src/lxc/bdev/lxcdir.c @@ -39,7 +39,8 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, const char *cname, const char *oldpath, const char *lxcpath, int snap, uint64_t newsize, struct lxc_conf *conf) { - int len, ret; + int ret; + size_t len; if (snap) { ERROR("directories cannot be snapshotted. Try aufs or overlayfs."); @@ -49,38 +50,58 @@ int dir_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, if (!orig->dest || !orig->src) return -1; - len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 3; + len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 4 + 3; new->src = malloc(len); if (!new->src) return -1; - ret = snprintf(new->src, len, "%s/%s/rootfs", lxcpath, cname); - if (ret < 0 || ret >= len) + + ret = snprintf(new->src, len, "dir:%s/%s/rootfs", lxcpath, cname); + if (ret < 0 || (size_t)ret >= len) return -1; - if ((new->dest = strdup(new->src)) == NULL) + + new->dest = strdup(new->src + 4); + if (!new->dest) return -1; return 0; } int dir_create(struct bdev *bdev, const char *dest, const char *n, - struct bdev_specs *specs) + struct bdev_specs *specs) { + int ret; + const char *src; + size_t len; + + /* strlen("dir:") */ + len = 4; if (specs && specs->dir) - bdev->src = strdup(specs->dir); + src = specs->dir; else - bdev->src = strdup(dest); + src = dest; + + len += strlen(src) + 1; + bdev->src = malloc(len); + if (!bdev->src) + return -1; + + ret = snprintf(bdev->src, len, "dir:%s", src); + if (ret < 0 || (size_t)ret >= len) + return -1; + bdev->dest = strdup(dest); - if (!bdev->src || !bdev->dest) { - ERROR("Out of memory"); + if (!bdev->dest) return -1; - } - if (mkdir_p(bdev->src, 0755) < 0) { - ERROR("Error creating %s", bdev->src); + ret = mkdir_p(src, 0755); + if (ret < 0) { + ERROR("Failed to create %s", src); return -1; } - if (mkdir_p(bdev->dest, 0755) < 0) { - ERROR("Error creating %s", bdev->dest); + + ret = mkdir_p(bdev->dest, 0755); + if (ret < 0) { + ERROR("Failed to create %s", bdev->dest); return -1; } @@ -89,8 +110,13 @@ int dir_create(struct bdev *bdev, const char *dest, const char *n, int dir_destroy(struct bdev *orig) { - if (lxc_rmdir_onedev(orig->src, NULL) < 0) + char *src; + + src = lxc_storage_get_path(orig->src, orig->src); + + if (lxc_rmdir_onedev(src, NULL) < 0) return -1; + return 0; } @@ -101,17 +127,19 @@ int dir_detect(const char *path) if (is_dir(path)) return 1; + return 0; } int dir_mount(struct bdev *bdev) { unsigned long mntflags; - char *mntdata; + char *src, *mntdata; int ret; if (strcmp(bdev->type, "dir")) return -22; + if (!bdev->src || !bdev->dest) return -22; @@ -120,7 +148,9 @@ int dir_mount(struct bdev *bdev) return -22; } - ret = mount(bdev->src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata); + src = lxc_storage_get_path(bdev->src, bdev->type); + + ret = mount(src, bdev->dest, "bind", MS_BIND | MS_REC | mntflags, mntdata); free(mntdata); return ret; } @@ -129,7 +159,9 @@ int dir_umount(struct bdev *bdev) { if (strcmp(bdev->type, "dir")) return -22; + if (!bdev->src || !bdev->dest) return -22; + return umount(bdev->dest); } diff --git a/src/lxc/bdev/lxcrsync.c b/src/lxc/bdev/lxcrsync.c index 8af39898d..41eb881c4 100644 --- a/src/lxc/bdev/lxcrsync.c +++ b/src/lxc/bdev/lxcrsync.c @@ -139,4 +139,3 @@ int rsync_rootfs_wrapper(void *data) struct rsync_data *arg = data; return rsync_rootfs(arg); } - diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 26ae25410..56a34941d 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -1154,8 +1154,10 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool need_ exit(1); } } else { // TODO come up with a better way here! + char *src; free(bdev->dest); - bdev->dest = strdup(bdev->src); + src = lxc_storage_get_path(bdev->src, bdev->type); + bdev->dest = strdup(src); } /* @@ -1320,7 +1322,7 @@ static bool create_run_template(struct lxc_container *c, char *tpath, bool need_ } /* execute */ execvp(tpath, newargv); - SYSERROR("failed to execute template %s", tpath); + SYSERROR("Failed to execute template %s", tpath); exit(1); }