They don't work right now, so until we fix that, don't allow it.

Signed-off-by: Serge Hallyn <[email protected]>
---
 src/lxc/bdev.c         | 26 ++++++++++++++++++++++++++
 src/lxc/bdev.h         |  2 ++
 src/lxc/lxccontainer.c |  6 ++++++
 3 files changed, 34 insertions(+)

diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
index 9f24994..2d5bfea 100644
--- a/src/lxc/bdev.c
+++ b/src/lxc/bdev.c
@@ -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
  */
diff --git a/src/lxc/bdev.h b/src/lxc/bdev.h
index 651f7f3..d97b9df 100644
--- a/src/lxc/bdev.h
+++ b/src/lxc/bdev.h
@@ -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
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 814aeb1..553f026 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -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;
 
-- 
2.1.0.rc1

_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to