From: Serge Hallyn Date: Fri, 8 Aug 2014 15:00:18 +0000 (+0000) Subject: Do not allow snapshots of LVM backed containers X-Git-Tag: lxc-1.1.0.alpha2~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cdd01be26ea320a8b5be313a864cb553df90c33e;p=thirdparty%2Flxc.git 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: Serge Hallyn Acked-by: Stéphane Graber --- diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c index 9f2499469..2d5bfea28 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 651f7f316..d97b9df42 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 814aeb1f7..553f026d6 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;