From 15a90a10d90b7722db66b7622b47344e1ccad97d Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Mon, 11 Jan 2016 13:07:05 -0800 Subject: [PATCH] copy_storage: try to use snapshot for btrfs Signed-off-by: Serge Hallyn --- src/lxc/lxccontainer.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 802a93012..490a59ddd 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -41,6 +41,7 @@ #include "attach.h" #include "bdev/bdev.h" #include "bdev/lxcoverlay.h" +#include "bdev/lxcbtrfs.h" #include "cgroup.h" #include "conf.h" #include "config.h" @@ -2817,12 +2818,33 @@ static bool add_rdepends(struct lxc_container *c, struct lxc_container *c0) return bret; } +/* + * If the fs natively supports snapshot clones with no penalty, + * then default to those even if not requested. + * Currently we only do this for btrfs. + */ +bool should_default_to_snapshot(struct lxc_container *c0, + struct lxc_container *c1) +{ + size_t l0 = strlen(c0->config_path) + strlen(c0->name) + 2; + size_t l1 = strlen(c1->config_path) + strlen(c1->name) + 2; + char *p0 = alloca(l0 + 1); + char *p1 = alloca(l1 + 1); + + snprintf(p0, l0, "%s/%s", c0->config_path, c0->name); + snprintf(p1, l1, "%s/%s", c1->config_path, c1->name); + return btrfs_same_fs(p0, p1) == 0; +} + static int copy_storage(struct lxc_container *c0, struct lxc_container *c, const char *newtype, int flags, const char *bdevdata, uint64_t newsize) { struct bdev *bdev; int need_rdep; + if (should_default_to_snapshot(c0, c)) + flags |= LXC_CLONE_SNAPSHOT; + bdev = bdev_copy(c0, c->name, c->config_path, newtype, flags, bdevdata, newsize, &need_rdep); if (!bdev) { -- 2.47.2