diff --git a/src/lxc/bdev/bdev.c b/src/lxc/bdev/bdev.c index 090b68579..7514aaef2 100644 --- a/src/lxc/bdev/bdev.c +++ b/src/lxc/bdev/bdev.c @@ -954,3 +954,18 @@ static bool unpriv_snap_allowed(struct bdev *b, const char *t, bool snap, return true; return false; } + +bool is_valid_bdev_type(const char *type) +{ + if (strcmp(type, "dir") == 0 || + strcmp(type, "btrfs") == 0 || + strcmp(type, "aufs") == 0 || + strcmp(type, "loop") == 0 || + strcmp(type, "lvm") == 0 || + strcmp(type, "nbd") == 0 || + strcmp(type, "ovl") == 0 || + strcmp(type, "rbd") == 0 || + strcmp(type, "zfs") == 0) + return true; + return false; +} diff --git a/src/lxc/bdev/bdev.h b/src/lxc/bdev/bdev.h index 91b9c8de0..3f21e8404 100644 --- a/src/lxc/bdev/bdev.h +++ b/src/lxc/bdev/bdev.h @@ -146,4 +146,6 @@ bool rootfs_is_blockdev(struct lxc_conf *conf); bool attach_block_device(struct lxc_conf *conf); void detach_block_device(struct lxc_conf *conf); +bool is_valid_bdev_type(const char *type); + #endif // __LXC_BDEV_H diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 2f8338dad..98cd38402 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -4142,6 +4142,7 @@ void lxc_conf_free(struct lxc_conf *conf) free(conf->console.log_path); free(conf->console.path); free(conf->rootfs.mount); + free(conf->rootfs.bdev); free(conf->rootfs.options); free(conf->rootfs.path); free(conf->logfile); diff --git a/src/lxc/conf.h b/src/lxc/conf.h index d3cd0b327..50516fdde 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -220,11 +220,13 @@ struct lxc_console { * @path : the rootfs source (directory or device) * @mount : where it is mounted * @options : mount options + * @bev : optional backing store type */ struct lxc_rootfs { char *path; char *mount; char *options; + char *bdev; }; /* diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 6fcfb1296..15f2e7bec 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -42,6 +42,7 @@ #include "parse.h" #include "config.h" #include "confile.h" +#include "bdev/bdev.h" #include "utils.h" #include "log.h" #include "conf.h" @@ -72,6 +73,7 @@ static int config_fstab(const char *, const char *, struct lxc_conf *); static int config_rootfs(const char *, const char *, struct lxc_conf *); static int config_rootfs_mount(const char *, const char *, struct lxc_conf *); static int config_rootfs_options(const char *, const char *, struct lxc_conf *); +static int config_rootfs_bdev(const char *, const char *, struct lxc_conf *); static int config_pivotdir(const char *, const char *, struct lxc_conf *); static int config_utsname(const char *, const char *, struct lxc_conf *); static int config_hook(const char *, const char *, struct lxc_conf *lxc_conf); @@ -130,6 +132,7 @@ static struct lxc_config_t config[] = { { "lxc.mount", config_fstab }, { "lxc.rootfs.mount", config_rootfs_mount }, { "lxc.rootfs.options", config_rootfs_options }, + { "lxc.rootfs.bdev", config_rootfs_bdev }, { "lxc.rootfs", config_rootfs }, { "lxc.pivotdir", config_pivotdir }, { "lxc.utsname", config_utsname }, @@ -1853,6 +1856,17 @@ static int config_rootfs_options(const char *key, const char *value, return config_string_item(&lxc_conf->rootfs.options, value); } +static int config_rootfs_bdev(const char *key, const char *value, + struct lxc_conf *lxc_conf) +{ + if (!is_valid_bdev_type(value)) { + ERROR("Bad bdev type for %s: %s", key, value); + return -1; + } + + return config_string_item(&lxc_conf->rootfs.bdev, value); +} + static int config_pivotdir(const char *key, const char *value, struct lxc_conf *lxc_conf) {