From: Christian Brauner Date: Tue, 15 Aug 2017 16:12:31 +0000 (+0200) Subject: Revert "btrfs: simplify" X-Git-Tag: lxc-2.0.9~98^2~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=97788c7295f8602f8c6d847899cae118a439075e;p=thirdparty%2Flxc.git Revert "btrfs: simplify" This reverts commit 36c55bf31c67d5048b6dd7f85ac425f3b2e22fd3. Signed-off-by: Christian Brauner --- diff --git a/src/lxc/bdev/bdev.c b/src/lxc/bdev/bdev.c index a99a05177..34d8e78d2 100644 --- a/src/lxc/bdev/bdev.c +++ b/src/lxc/bdev/bdev.c @@ -406,10 +406,6 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, } TRACE("Detected \"%s\" storage driver", new->type); - if (bdevtype && !strcmp(orig->type, "btrfs") && - !strcmp(new->type, "btrfs")) - snap = 1; - if (new->ops->clone_paths(orig, new, oldname, cname, oldpath, lxcpath, snap, newsize, c0->lxc_conf) < 0) { ERROR("Failed getting pathnames for clone of \"%s\"", src); @@ -431,6 +427,36 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, if (snap) return new; + /* https://github.com/lxc/lxc/issues/131 + * Use btrfs snapshot feature instead of rsync to restore if both orig + * and new are btrfs. + */ + if (bdevtype && strcmp(orig->type, "btrfs") == 0 && + strcmp(new->type, "btrfs") == 0 && + btrfs_same_fs(orig->dest, new->dest) == 0) { + struct rsync_data_char arg; + + if (btrfs_destroy(new) < 0) { + ERROR("Failed to destroy \"%s\" btrfs subvolume", new->dest); + goto err; + } + + arg.src = orig->dest; + arg.dest = new->dest; + if (am_unpriv()) + ret = userns_exec_1(c0->lxc_conf, btrfs_snapshot_wrapper, + &arg, "btrfs_snapshot_wrapper"); + else + ret = btrfs_snapshot(orig->dest, new->dest); + if (ret < 0) { + SYSERROR("Failed to create btrfs snapshot \"%s\" of \"%s\"", + new->dest, orig->dest); + goto err; + } + bdev_put(orig); + return new; + } + pid = fork(); if (pid < 0) { SYSERROR("fork");