Commit f0a71c4a by Christian Brauner

Merge pull request #937 from hallyn/2016-04-02/bdev

2016 04 02/bdev
parents 55c91e83 984bd620
......@@ -201,7 +201,7 @@ static const struct bdev_type bdevs[] = {
static const size_t numbdevs = sizeof(bdevs) / sizeof(struct bdev_type);
/* helpers */
static const struct bdev_type *bdev_query(const char *src);
static const struct bdev_type *bdev_query(struct lxc_conf *conf, const char *src);
static struct bdev *bdev_get(const char *type);
static struct bdev *do_bdev_create(const char *dest, const char *type,
const char *cname, struct bdev_specs *specs);
......@@ -542,7 +542,7 @@ struct bdev *bdev_init(struct lxc_conf *conf, const char *src, const char *dst,
if (!src)
return NULL;
q = bdev_query(src);
q = bdev_query(conf, src);
if (!q)
return NULL;
......@@ -794,7 +794,7 @@ bool rootfs_is_blockdev(struct lxc_conf *conf)
ret = stat(conf->rootfs.path, &st);
if (ret == 0 && S_ISBLK(st.st_mode))
return true;
q = bdev_query(conf->rootfs.path);
q = bdev_query(conf, conf->rootfs.path);
if (!q)
return false;
if (strcmp(q->name, "lvm") == 0 ||
......@@ -841,9 +841,26 @@ static struct bdev *bdev_get(const char *type)
return bdev;
}
static const struct bdev_type *bdev_query(const char *src)
static const struct bdev_type *get_bdev_by_name(const char *name)
{
int i;
for (i = 0; i < numbdevs; i++) {
if (strcmp(bdevs[i].name, name) == 0)
return &bdevs[i];
}
ERROR("Backing store %s unknown but not caught earlier\n", name);
return NULL;
}
static const struct bdev_type *bdev_query(struct lxc_conf *conf, const char *src)
{
int i;
if (conf->rootfs.bdev)
return get_bdev_by_name(conf->rootfs.bdev);
for (i = 0; i < numbdevs; i++) {
int r;
r = bdevs[i].ops->detect(src);
......@@ -954,3 +971,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;
}
......@@ -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
......@@ -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);
......
......@@ -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;
};
/*
......
......@@ -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)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment