mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-02 21:04:08 +00:00
copy_storage: try to use snapshot for btrfs
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
parent
c7ec3de825
commit
15a90a10d9
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user