[lxc-devel] [PATCH -stable] Do not allow snapshots of LVM backed containers
Serge Hallyn
serge.hallyn at ubuntu.com
Fri Aug 8 18:31:45 UTC 2014
They don't work right now, so until we fix that, don't allow it.
(This patch is for stable-1.0)
Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
src/lxc/bdev.c | 22 ++++++++++++++++++++++
src/lxc/bdev.h | 2 ++
src/lxc/lxccontainer.c | 6 ++++++
3 files changed, 30 insertions(+)
diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
index 8d907af..5e45fa9 100644
--- a/src/lxc/bdev.c
+++ b/src/lxc/bdev.c
@@ -520,6 +520,7 @@ static const struct bdev_ops dir_ops = {
.destroy = &dir_destroy,
.create = &dir_create,
.can_snapshot = false,
+ .can_backup = true,
};
@@ -784,6 +785,7 @@ static const struct bdev_ops zfs_ops = {
.destroy = &zfs_destroy,
.create = &zfs_create,
.can_snapshot = true,
+ .can_backup = true,
};
//
@@ -1179,6 +1181,7 @@ static const struct bdev_ops lvm_ops = {
.destroy = &lvm_destroy,
.create = &lvm_create,
.can_snapshot = true,
+ .can_backup = false,
};
/*
@@ -1858,6 +1861,7 @@ static const struct bdev_ops btrfs_ops = {
.destroy = &btrfs_destroy,
.create = &btrfs_create,
.can_snapshot = true,
+ .can_backup = true,
};
//
@@ -2129,6 +2133,7 @@ static const struct bdev_ops loop_ops = {
.destroy = &loop_destroy,
.create = &loop_create,
.can_snapshot = false,
+ .can_backup = true,
};
//
@@ -2426,6 +2431,7 @@ static const struct bdev_ops overlayfs_ops = {
.destroy = &overlayfs_destroy,
.create = &overlayfs_create,
.can_snapshot = true,
+ .can_backup = true,
};
//
@@ -2703,6 +2709,7 @@ static const struct bdev_ops aufs_ops = {
.destroy = &aufs_destroy,
.create = &aufs_create,
.can_snapshot = true,
+ .can_backup = true,
};
@@ -2769,6 +2776,9 @@ struct bdev *bdev_init(const char *src, const char *dst, const char *mntopts)
struct bdev *bdev;
const struct bdev_type *q;
+ if (!src)
+ return NULL;
+
q = bdev_query(src);
if (!q)
return NULL;
@@ -2855,6 +2865,18 @@ bool bdev_is_dir(const char *path)
return ret;
}
+bool bdev_can_backup(struct lxc_conf *conf)
+{
+ struct bdev *bdev = bdev_init(conf->rootfs.path, 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
*/
diff --git a/src/lxc/bdev.h b/src/lxc/bdev.h
index 3dcb961..0907fb7 100644
--- a/src/lxc/bdev.h
+++ b/src/lxc/bdev.h
@@ -48,6 +48,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;
};
/*
@@ -71,6 +72,7 @@ struct bdev {
char *overlay_getlower(char *p);
bool bdev_is_dir(const char *path);
+bool bdev_can_backup(struct lxc_conf *conf);
/*
* Instantiate a bdev object. The src is used to determine which blockdev
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 5166614..22373bf 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -2865,6 +2865,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;
+ }
+
// /var/lib/lxc -> /var/lib/lxcsnaps \0
ret = snprintf(snappath, MAXPATHLEN, "%ssnaps/%s", c->config_path, c->name);
if (ret < 0 || ret >= MAXPATHLEN)
--
2.1.0.rc1
More information about the lxc-devel
mailing list