From: Christian Brauner Date: Sun, 16 Jul 2017 15:57:06 +0000 (+0200) Subject: btrfs: enable unprivileged snapshots X-Git-Tag: lxc-2.1.0~32^2~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35d7de5a39d6a1caed6e638988e420a7cbc66eea;p=thirdparty%2Flxc.git btrfs: enable unprivileged snapshots Signed-off-by: Christian Brauner --- diff --git a/src/lxc/bdev/bdev.c b/src/lxc/bdev/bdev.c index 8f1d0145c..e1c78141c 100644 --- a/src/lxc/bdev/bdev.c +++ b/src/lxc/bdev/bdev.c @@ -432,17 +432,28 @@ struct bdev *bdev_copy(struct lxc_container *c0, const char *cname, 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("Error destroying %s subvolume", new->dest); goto err; } + if (mkdir_p(new->dest, 0755) < 0) { ERROR("Error creating %s directory", new->dest); goto err; } - if (btrfs_snapshot(orig->dest, new->dest) < 0) { - ERROR("Error restoring %s to %s", orig->dest, - new->dest); + + 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);