]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Do not allow snapshots of LVM backed containers
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Fri, 8 Aug 2014 18:31:45 +0000 (18:31 +0000)
committerStéphane Graber <stgraber@ubuntu.com>
Fri, 8 Aug 2014 18:35:31 +0000 (14:35 -0400)
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@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/bdev.c
src/lxc/bdev.h
src/lxc/lxccontainer.c

index 8d907af80c1660230b86a320a2282e115c79f4e6..5e45fa9a97f01a7d234c3903e0982f02086ec094 100644 (file)
@@ -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
  */
index 3dcb96174feb82db0fc397a1b355d05df32b8fa1..0907fb79cacef0a286387f00bd44c4fedb1dcd5a 100644 (file)
@@ -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
index 51666141c40e7ac8a2bd8d14fe032c9d8dd03b26..22373bf0d86bf3e3efaab120ac0f596241adbc6f 100644 (file)
@@ -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)