mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-24 20:52:16 +00:00
Pass through all options with -Bbest.
Remove the union in bdev_specs and store all options if -Bbest is passed. Fixes issue #31. Signed-off-by: Sidnei da Silva <sidnei.da.silva@canonical.com> Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
parent
3ffe454baf
commit
72e99249b0
@ -707,10 +707,10 @@ static int zfs_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
int ret;
|
||||
pid_t pid;
|
||||
|
||||
if (!specs || !specs->u.zfs.zfsroot)
|
||||
if (!specs || !specs->zfs.zfsroot)
|
||||
zfsroot = default_zfs_root();
|
||||
else
|
||||
zfsroot = specs->u.zfs.zfsroot;
|
||||
zfsroot = specs->zfs.zfsroot;
|
||||
|
||||
if (!(bdev->dest = strdup(dest))) {
|
||||
ERROR("No mount target specified or out of memory");
|
||||
@ -873,7 +873,7 @@ static int lvm_is_thin_pool(const char *path)
|
||||
static int do_lvm_create(const char *path, unsigned long size, const char *thinpool)
|
||||
{
|
||||
int ret, pid, len;
|
||||
char sz[24], *pathdup, *vg, *lv, *tp;
|
||||
char sz[24], *pathdup, *vg, *lv, *tp = NULL;
|
||||
|
||||
if ((pid = fork()) < 0) {
|
||||
SYSERROR("failed fork");
|
||||
@ -901,33 +901,37 @@ static int do_lvm_create(const char *path, unsigned long size, const char *thinp
|
||||
lv++;
|
||||
|
||||
vg = strrchr(pathdup, '/');
|
||||
if (!vg)
|
||||
if (!vg) {
|
||||
free(pathdup);
|
||||
exit(1);
|
||||
}
|
||||
vg++;
|
||||
|
||||
if (thinpool) {
|
||||
len = strlen(pathdup) + strlen(thinpool) + 2;
|
||||
tp = alloca(len);
|
||||
|
||||
INFO("checking for thin pool at path: %s", tp);
|
||||
ret = snprintf(tp, len, "%s/%s", pathdup, thinpool);
|
||||
if (ret < 0 || ret >= len)
|
||||
return -1;
|
||||
if (ret < 0 || ret >= len) {
|
||||
free(pathdup);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
ret = lvm_is_thin_pool(tp);
|
||||
INFO("got %d for thin pool at path: %s", ret, tp);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret < 0) {
|
||||
free(pathdup);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
thinpool = NULL;
|
||||
tp = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (!thinpool) {
|
||||
if (!tp) {
|
||||
execlp("lvcreate", "lvcreate", "-L", sz, vg, "-n", lv, (char *)NULL);
|
||||
} else {
|
||||
execlp("lvcreate", "lvcreate", "--thinpool", thinpool, "-V", sz, vg, "-n", lv, (char *)NULL);
|
||||
execlp("lvcreate", "lvcreate", "--thinpool", tp, "-V", sz, vg, "-n", lv, (char *)NULL);
|
||||
}
|
||||
|
||||
free(pathdup);
|
||||
@ -1097,17 +1101,18 @@ static int lvm_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
if (!specs)
|
||||
return -1;
|
||||
|
||||
vg = specs->u.lvm.vg;
|
||||
vg = specs->lvm.vg;
|
||||
if (!vg)
|
||||
vg = default_lvm_vg();
|
||||
|
||||
thinpool = specs->u.lvm.thinpool;
|
||||
thinpool = specs->lvm.thinpool;
|
||||
if (!thinpool)
|
||||
thinpool = default_lvm_thin_pool();
|
||||
|
||||
/* /dev/$vg/$lv */
|
||||
if (specs->u.lvm.lv)
|
||||
lv = specs->u.lvm.lv;
|
||||
if (specs->lvm.lv)
|
||||
lv = specs->lvm.lv;
|
||||
|
||||
len = strlen(vg) + strlen(lv) + 7;
|
||||
bdev->src = malloc(len);
|
||||
if (!bdev->src)
|
||||
@ -1117,8 +1122,8 @@ static int lvm_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
if (ret < 0 || ret >= len)
|
||||
return -1;
|
||||
|
||||
// lvm.fssize is in bytes.
|
||||
sz = specs->u.lvm.fssize;
|
||||
// fssize is in bytes.
|
||||
sz = specs->fssize;
|
||||
if (!sz)
|
||||
sz = DEFAULT_FS_SIZE;
|
||||
|
||||
@ -1127,7 +1132,7 @@ static int lvm_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
return -1;
|
||||
}
|
||||
|
||||
fstype = specs->u.lvm.fstype;
|
||||
fstype = specs->fstype;
|
||||
if (!fstype)
|
||||
fstype = DEFAULT_FSTYPE;
|
||||
if (do_mkfs(bdev->src, fstype) < 0) {
|
||||
@ -1721,11 +1726,11 @@ static int loop_create(struct bdev *bdev, const char *dest, const char *n,
|
||||
if (ret < 0 || ret >= len + 5)
|
||||
return -1;
|
||||
|
||||
sz = specs->u.loop.fssize;
|
||||
sz = specs->fssize;
|
||||
if (!sz)
|
||||
sz = DEFAULT_FS_SIZE;
|
||||
|
||||
fstype = specs->u.loop.fstype;
|
||||
fstype = specs->fstype;
|
||||
if (!fstype)
|
||||
fstype = DEFAULT_FSTYPE;
|
||||
|
||||
|
@ -37,22 +37,16 @@ struct bdev;
|
||||
* specifications for how to create a new backing store
|
||||
*/
|
||||
struct bdev_specs {
|
||||
union {
|
||||
struct {
|
||||
char *zfsroot;
|
||||
} zfs;
|
||||
struct {
|
||||
char *vg;
|
||||
char *lv;
|
||||
char *fstype;
|
||||
unsigned long fssize; // fs size in bytes
|
||||
char *thinpool; // lvm thin pool to use, if any
|
||||
} lvm;
|
||||
struct {
|
||||
char *fstype;
|
||||
unsigned long fssize; // fs size in bytes
|
||||
} loop;
|
||||
} u;
|
||||
char *fstype;
|
||||
unsigned long fssize; // fs size in bytes
|
||||
struct {
|
||||
char *zfsroot;
|
||||
} zfs;
|
||||
struct {
|
||||
char *vg;
|
||||
char *lv;
|
||||
char *thinpool; // lvm thin pool to use, if any
|
||||
} lvm;
|
||||
};
|
||||
|
||||
struct bdev_ops {
|
||||
|
@ -147,23 +147,25 @@ Options :\n\
|
||||
|
||||
bool validate_bdev_args(struct lxc_arguments *a)
|
||||
{
|
||||
if (a->fstype || a->fssize) {
|
||||
if (strcmp(a->bdevtype, "lvm") != 0 &&
|
||||
strcmp(a->bdevtype, "loop") != 0) {
|
||||
fprintf(stderr, "filesystem type and size are only valid with block devices\n");
|
||||
return false;
|
||||
if (strcmp(a->bdevtype, "best") != 0) {
|
||||
if (a->fstype || a->fssize) {
|
||||
if (strcmp(a->bdevtype, "lvm") != 0 &&
|
||||
strcmp(a->bdevtype, "loop") != 0) {
|
||||
fprintf(stderr, "filesystem type and size are only valid with block devices\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (strcmp(a->bdevtype, "lvm") != 0) {
|
||||
if (a->lvname || a->vgname || a->thinpool) {
|
||||
fprintf(stderr, "--lvname, --vgname and --thinpool are only valid with -B lvm\n");
|
||||
return false;
|
||||
if (strcmp(a->bdevtype, "lvm") != 0) {
|
||||
if (a->lvname || a->vgname || a->thinpool) {
|
||||
fprintf(stderr, "--lvname, --vgname and --thinpool are only valid with -B lvm\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (strcmp(a->bdevtype, "zfs") != 0) {
|
||||
if (a->zfsroot) {
|
||||
fprintf(stderr, "zfsroot is only valid with -B zfs\n");
|
||||
return false;
|
||||
if (strcmp(a->bdevtype, "zfs") != 0) {
|
||||
if (a->zfsroot) {
|
||||
fprintf(stderr, "zfsroot is only valid with -B zfs\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@ -217,26 +219,24 @@ int main(int argc, char *argv[])
|
||||
else
|
||||
c->load_config(c, LXC_DEFAULT_CONFIG);
|
||||
|
||||
if (strcmp(my_args.bdevtype, "zfs") == 0) {
|
||||
if (my_args.fstype)
|
||||
spec.fstype = my_args.fstype;
|
||||
if (my_args.fssize)
|
||||
spec.fssize = my_args.fssize;
|
||||
|
||||
if (strcmp(my_args.bdevtype, "zfs") == 0 || strcmp(my_args.bdevtype, "best") == 0) {
|
||||
if (my_args.zfsroot)
|
||||
spec.u.zfs.zfsroot = my_args.zfsroot;
|
||||
} else if (strcmp(my_args.bdevtype, "lvm") == 0) {
|
||||
spec.zfs.zfsroot = my_args.zfsroot;
|
||||
}
|
||||
if (strcmp(my_args.bdevtype, "lvm") == 0 || strcmp(my_args.bdevtype, "best") == 0) {
|
||||
if (my_args.lvname)
|
||||
spec.u.lvm.lv = my_args.lvname;
|
||||
spec.lvm.lv = my_args.lvname;
|
||||
if (my_args.vgname)
|
||||
spec.u.lvm.vg = my_args.vgname;
|
||||
spec.lvm.vg = my_args.vgname;
|
||||
if (my_args.thinpool)
|
||||
spec.u.lvm.thinpool = my_args.thinpool;
|
||||
if (my_args.fstype)
|
||||
spec.u.lvm.fstype = my_args.fstype;
|
||||
if (my_args.fssize)
|
||||
spec.u.lvm.fssize = my_args.fssize;
|
||||
} else if (strcmp(my_args.bdevtype, "loop") == 0) {
|
||||
if (my_args.fstype)
|
||||
spec.u.loop.fstype = my_args.fstype;
|
||||
if (my_args.fssize)
|
||||
spec.u.loop.fssize = my_args.fssize;
|
||||
} else if (my_args.dir) {
|
||||
spec.lvm.thinpool = my_args.thinpool;
|
||||
}
|
||||
if (my_args.dir) {
|
||||
ERROR("--dir is not yet supported");
|
||||
exit(1);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user