From: Christian Brauner Date: Sat, 15 Jul 2017 13:34:39 +0000 (+0200) Subject: btrfs: simplify + bugfix X-Git-Tag: lxc-2.1.0~32^2~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0801b2803312bc860d02f12beb1182965a047235;p=thirdparty%2Flxc.git btrfs: simplify + bugfix Closes #1698. Closes #1703. Signed-off-by: Christian Brauner --- diff --git a/src/lxc/bdev/bdev.c b/src/lxc/bdev/bdev.c index bef79f70f..ffc9d46a0 100644 --- a/src/lxc/bdev/bdev.c +++ b/src/lxc/bdev/bdev.c @@ -392,7 +392,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, *needs_rdep = 1; } - if (strcmp(oldpath, lxcpath) && !bdevtype) + if (strcmp(oldpath, lxcpath) && !bdevtype && !snap) bdevtype = "dir"; else if (!bdevtype) bdevtype = orig->type; @@ -403,6 +403,7 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, bdev_put(orig); return NULL; } + TRACE("Detected \"%s\" storage driver", new->type); if (new->ops->clone_paths(orig, new, oldname, cname, oldpath, lxcpath, snap, newsize, c0->lxc_conf) < 0) { diff --git a/src/lxc/bdev/lxcbtrfs.c b/src/lxc/bdev/lxcbtrfs.c index 1defa76ee..072654907 100644 --- a/src/lxc/bdev/lxcbtrfs.c +++ b/src/lxc/bdev/lxcbtrfs.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -39,14 +40,10 @@ #include "log.h" #include "lxcbtrfs.h" #include "lxcrsync.h" -#include "utils.h" +#include "../utils.h" lxc_log_define(lxcbtrfs, lxc); -/* defined in lxccontainer.c: needs to become common helper */ -extern char *dir_new_path(char *src, const char *oldname, const char *name, - const char *oldpath, const char *lxcpath); - /* * Return the full path of objid under dirid. Let's say dirid is * /lxc/c1/rootfs, and objid is /lxc/c1/rootfs/a/b/c. Then we will @@ -380,30 +377,20 @@ int btrfs_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname, if (!orig->dest || !orig->src) return -1; - if (strcmp(orig->type, "btrfs")) { - int len, ret; - if (snap) { - ERROR("btrfs snapshot from %s backing store is not supported", - orig->type); - return -1; - } - - len = strlen(lxcpath) + strlen(cname) + strlen("rootfs") + 6 + 3; - new->src = malloc(len); - if (!new->src) - return -1; - - ret = snprintf(new->src, len, "btrfs:%s/%s/rootfs", lxcpath, cname); - if (ret < 0 || ret >= len) - return -1; - } else { - /* In case rootfs is in custom path, reuse it. */ - new->src = dir_new_path(orig->src, oldname, cname, oldpath, lxcpath); - if (!new->src) - return -1; - + if (strcmp(orig->type, "btrfs") && snap) { + ERROR("btrfs snapshot from %s backing store is not supported", + orig->type); + return -1; } + new->src = lxc_string_join( + "/", + (const char *[]){"btrfs:", *lxcpath != '/' ? lxcpath : ++lxcpath, + cname, "rootfs", NULL}, + false); + if (!new->src) + return -1; + src = lxc_storage_get_path(new->src, "btrfs"); new->dest = strdup(src); if (!new->dest)