Commit cdd01be2 by Serge Hallyn Committed by Stéphane Graber

Do not allow snapshots of LVM backed containers

They don't work right now, so until we fix that, don't allow it. Signed-off-by: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com> Acked-by: 's avatarStéphane Graber <stgraber@ubuntu.com>
parent 68c36a30
......@@ -521,6 +521,7 @@ static const struct bdev_ops dir_ops = {
.destroy = &dir_destroy,
.create = &dir_create,
.can_snapshot = false,
.can_backup = true,
};
......@@ -785,6 +786,7 @@ static const struct bdev_ops zfs_ops = {
.destroy = &zfs_destroy,
.create = &zfs_create,
.can_snapshot = true,
.can_backup = true,
};
//
......@@ -1180,6 +1182,7 @@ static const struct bdev_ops lvm_ops = {
.destroy = &lvm_destroy,
.create = &lvm_create,
.can_snapshot = true,
.can_backup = false,
};
/*
......@@ -1859,6 +1862,7 @@ static const struct bdev_ops btrfs_ops = {
.destroy = &btrfs_destroy,
.create = &btrfs_create,
.can_snapshot = true,
.can_backup = true,
};
//
......@@ -2130,6 +2134,7 @@ static const struct bdev_ops loop_ops = {
.destroy = &loop_destroy,
.create = &loop_create,
.can_snapshot = false,
.can_backup = true,
};
//
......@@ -2427,6 +2432,7 @@ static const struct bdev_ops overlayfs_ops = {
.destroy = &overlayfs_destroy,
.create = &overlayfs_create,
.can_snapshot = true,
.can_backup = true,
};
//
......@@ -2704,6 +2710,7 @@ static const struct bdev_ops aufs_ops = {
.destroy = &aufs_destroy,
.create = &aufs_create,
.can_snapshot = true,
.can_backup = true,
};
//
......@@ -3013,6 +3020,7 @@ static const struct bdev_ops nbd_ops = {
.destroy = &nbd_destroy,
.create = &nbd_create,
.can_snapshot = true,
.can_backup = false,
};
static const struct bdev_type bdevs[] = {
......@@ -3079,6 +3087,12 @@ struct bdev *bdev_init(struct lxc_conf *conf, const char *src, const char *dst,
struct bdev *bdev;
const struct bdev_type *q;
if (!src)
src = conf->rootfs.path;
if (!src)
return NULL;
q = bdev_query(src);
if (!q)
return NULL;
......@@ -3167,6 +3181,18 @@ bool bdev_is_dir(struct lxc_conf *conf, const char *path)
return ret;
}
bool bdev_can_backup(struct lxc_conf *conf)
{
struct bdev *bdev = bdev_init(conf, NULL, NULL, NULL);
bool ret;
if (!bdev)
return false;
ret = bdev->ops->can_backup;
bdev_put(bdev);
return ret;
}
/*
* is an unprivileged user allowed to make this kind of snapshot
*/
......
......@@ -47,6 +47,7 @@ struct bdev_ops {
const char *cname, const char *oldpath, const char *lxcpath,
int snap, uint64_t newsize, struct lxc_conf *conf);
bool can_snapshot;
bool can_backup;
};
/*
......@@ -72,6 +73,7 @@ struct bdev {
char *overlay_getlower(char *p);
bool bdev_is_dir(struct lxc_conf *conf, const char *path);
bool bdev_can_backup(struct lxc_conf *conf);
/*
* Instantiate a bdev object. The src is used to determine which blockdev
......
......@@ -2987,6 +2987,12 @@ static int lxcapi_snapshot(struct lxc_container *c, const char *commentfile)
if (!c || !lxcapi_is_defined(c))
return -1;
if (!bdev_can_backup(c->lxc_conf)) {
ERROR("%s's backing store cannot be backed up.", c->name);
ERROR("Your container must use another backing store type.");
return -1;
}
if (!get_snappath_dir(c, snappath))
return -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment