]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
bdev: support -B best and -B lvm,dir
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 15 Aug 2013 17:55:50 +0000 (12:55 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Thu, 15 Aug 2013 20:35:47 +0000 (15:35 -0500)
-B dev will check whether btrfs, zfs, or lvm can be used,
in that order, and fall back to dir.

-B lvm,btrfs will try lvm first, then btrfs, then fail.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/lxc/bdev.c
src/lxc/lxccontainer.c

index 07a794b3ed7d48600601276c82c717352c2a5567..d6f117631f6a276067823501b0266aa3b29d372e 100644 (file)
@@ -1977,6 +1977,22 @@ struct bdev *bdev_copy(const char *src, const char *oldname, const char *cname,
        exit(0);
 }
 
+static struct bdev * do_bdev_create(const char *dest, const char *type,
+                       const char *cname, struct bdev_specs *specs)
+{
+       struct bdev *bdev = bdev_get(type);
+       if (!bdev) {
+               return NULL;
+       }
+
+       if (bdev->ops->create(bdev, dest, cname, specs) < 0) {
+                bdev_put(bdev);
+                return NULL;
+       }
+
+       return bdev;
+}
+
 /*
  * bdev_create:
  * Create a backing store for a container.
@@ -1992,22 +2008,34 @@ struct bdev *bdev_create(const char *dest, const char *type,
                        const char *cname, struct bdev_specs *specs)
 {
        struct bdev *bdev;
+       char *best_options[] = {"btrfs", "zfs", "lvm", "dir", NULL};
 
        if (!type)
-               type = "dir";
-
-       bdev = bdev_get(type);
-       if (!bdev) {
-               ERROR("Unknown fs type: %s\n", type);
-               return NULL;
+               return do_bdev_create(dest, "dir", cname, specs);
+
+       if (strcmp(type, "best") == 0) {
+               int i;
+               // try for the best backing store type, according to our
+               // opinionated preferences
+               for (i=0; best_options[i]; i++) {
+                       if ((bdev = do_bdev_create(dest, best_options[i], cname, specs)))
+                               return bdev;
+               }
+               return NULL;  // 'dir' should never fail, so this shouldn't happen
        }
 
-       if (bdev->ops->create(bdev, dest, cname, specs) < 0) {
-                bdev_put(bdev);
-                return NULL;
+       // -B lvm,dir
+       if (index(type, ',') != NULL) {
+               char *dup = alloca(strlen(type)+1), *saveptr, *token;
+               strcpy(dup, type);
+               for (token = strtok_r(dup, ",", &saveptr); token;
+                               token = strtok_r(NULL, ",", &saveptr)) {
+                       if ((bdev = do_bdev_create(dest, token, cname, specs)))
+                               return bdev;
+               }
        }
 
-       return bdev;
+       return do_bdev_create(dest, type, cname, specs);
 }
 
 char *overlayfs_getlower(char *p)
index 1c77b632f02a1ce3dd085fc6885e8d52443076d8..02e37660ce796b00eb7327318d69489007f5c843 100644 (file)
@@ -679,8 +679,11 @@ static struct bdev *do_bdev_create(struct lxc_container *c, const char *type,
                return NULL;
 
        bdev = bdev_create(dest, type, c->name, specs);
-       if (!bdev)
+       if (!bdev) {
+               ERROR("Failed to create backing store type %s\n", type);
                return NULL;
+       }
+
        lxcapi_set_config_item(c, "lxc.rootfs", bdev->src);
        return bdev;
 }