]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
rbd: rework rbd storage driver
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 24 Jul 2017 22:13:57 +0000 (00:13 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 31 Jul 2017 21:34:17 +0000 (23:34 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/bdev/lxcrbd.c

index 3cd951cd0bfd462202741f0bead2ba5674539bbb..7af4aaa2453ebae174146647475006a534cef120 100644 (file)
 
 lxc_log_define(lxcrbd, lxc);
 
+struct rbd_args {
+       const char *osd_pool_name;
+       const char *rbd_name;
+       const char *size;
+};
+
+int rbd_create_wrapper(void *data)
+{
+       struct rbd_args *args = data;
+
+       execlp("rbd", "rbd", "create", "--pool", args->osd_pool_name,
+              args->rbd_name, "--size", args->size, (char *)NULL);
+
+       return -1;
+}
+
+int rbd_map_wrapper(void *data)
+{
+       struct rbd_args *args = data;
+
+       execlp("rbd", "rbd", "map", "--pool", args->osd_pool_name,
+              args->rbd_name, (char *)NULL);
+
+       return -1;
+}
+
+int rbd_unmap_wrapper(void *data)
+{
+       struct rbd_args *args = data;
+
+       execlp("rbd", "rbd", "unmap", args->rbd_name, (char *)NULL);
+
+       return -1;
+}
+
+int rbd_delete_wrapper(void *data)
+{
+       struct rbd_args *args = data;
+
+       execlp("rbd", "rbd", "rm", args->rbd_name, (char *)NULL);
+
+       return -1;
+}
+
 int rbd_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
                   const char *cname, const char *oldpath, const char *lxcpath,
                   int snap, uint64_t newsize, struct lxc_conf *conf)
@@ -47,13 +91,14 @@ int rbd_clonepaths(struct bdev *orig, struct bdev *new, const char *oldname,
 int rbd_create(struct bdev *bdev, const char *dest, const char *n,
               struct bdev_specs *specs)
 {
-       const char *rbdpool, *rbdname = n, *fstype;
+       const char *rbdpool, *fstype;
        uint64_t size;
        int ret, len;
        char sz[24];
-       pid_t pid;
        const char *cmd_args[2];
        char cmd_output[MAXPATHLEN];
+       const char *rbdname = n;
+       struct rbd_args args = {0};
 
        if (!specs)
                return -1;
@@ -68,12 +113,16 @@ int rbd_create(struct bdev *bdev, const char *dest, const char *n,
        /* source device /dev/rbd/lxc/ctn */
        len = strlen(rbdpool) + strlen(rbdname) + 4 + 11;
        bdev->src = malloc(len);
-       if (!bdev->src)
+       if (!bdev->src) {
+               ERROR("Failed to allocate memory");
                return -1;
+       }
 
        ret = snprintf(bdev->src, len, "rbd:/dev/rbd/%s/%s", rbdpool, rbdname);
-       if (ret < 0 || ret >= len)
+       if (ret < 0 || ret >= len) {
+               ERROR("Failed to create string");
                return -1;
+       }
 
        /* fssize is in bytes */
        size = specs->fssize;
@@ -82,78 +131,92 @@ int rbd_create(struct bdev *bdev, const char *dest, const char *n,
 
        /* in megabytes for rbd tool */
        ret = snprintf(sz, 24, "%" PRIu64, size / 1024 / 1024);
-       if (ret < 0 || ret >= 24)
-               exit(1);
-
-       if ((pid = fork()) < 0)
+       if (ret < 0 || ret >= 24) {
+               ERROR("Failed to create string");
                return -1;
-       if (!pid) {
-               execlp("rbd", "rbd", "create", "--pool", rbdpool, rbdname,
-                      "--size", sz, (char *)NULL);
-               exit(1);
        }
-       if (wait_for_pid(pid) < 0)
-               return -1;
 
-       if ((pid = fork()) < 0)
+       args.osd_pool_name = rbdpool;
+       args.rbd_name = rbdname;
+       args.size = sz;
+       ret = run_command(cmd_output, sizeof(cmd_output), rbd_create_wrapper,
+                         (void *)&args);
+       if (ret < 0) {
+               ERROR("Failed to create rbd storage volume \"%s\": %s", rbdname,
+                     cmd_output);
                return -1;
-       if (!pid) {
-               execlp("rbd", "rbd", "map", "--pool", rbdpool, rbdname,
-                      (char *)NULL);
-               exit(1);
        }
-       if (wait_for_pid(pid) < 0)
+
+       ret = run_command(cmd_output, sizeof(cmd_output), rbd_map_wrapper,
+                         (void *)&args);
+       if (ret < 0) {
+               ERROR("Failed to map rbd storage volume \"%s\": %s", rbdname,
+                     cmd_output);
                return -1;
+       }
 
        fstype = specs->fstype;
        if (!fstype)
                fstype = DEFAULT_FSTYPE;
 
        cmd_args[0] = fstype;
-       cmd_args[1] = bdev->src + 4;
+       cmd_args[1] = lxc_storage_get_path(bdev->src, bdev->type);
        ret = run_command(cmd_output, sizeof(cmd_output), do_mkfs_exec_wrapper,
                          (void *)cmd_args);
-       if (ret < 0)
+       if (ret < 0) {
+               ERROR("Failed to map rbd storage volume \"%s\": %s", rbdname,
+                     cmd_output);
                return -1;
+       }
 
-       if (!(bdev->dest = strdup(dest)))
+       bdev->dest = strdup(dest);
+       if (!bdev->dest) {
+               ERROR("Failed to duplicate string \"%s\"", dest);
                return -1;
+       }
 
-       if (mkdir_p(bdev->dest, 0755) < 0 && errno != EEXIST) {
-               ERROR("Error creating %s", bdev->dest);
+       ret = mkdir_p(bdev->dest, 0755);
+       if (ret < 0 && errno != EEXIST) {
+               ERROR("Failed to create directory \"%s\"", bdev->dest);
                return -1;
        }
 
+       TRACE("Created rbd storage volume \"%s\"", bdev->dest);
        return 0;
 }
 
 int rbd_destroy(struct bdev *orig)
 {
+       int ret;
        char *src;
-       pid_t pid;
        char *rbdfullname;
+       char cmd_output[MAXPATHLEN];
+       struct rbd_args args = {0};
 
        src = lxc_storage_get_path(orig->src, orig->type);
        if (file_exists(src)) {
-               if ((pid = fork()) < 0)
+               args.rbd_name = src;
+               ret = run_command(cmd_output, sizeof(cmd_output),
+                                 rbd_unmap_wrapper, (void *)&args);
+               if (ret < 0) {
+                       ERROR("Failed to map rbd storage volume \"%s\": %s",
+                             src, cmd_output);
                        return -1;
-               if (!pid) {
-                       execlp("rbd", "rbd", "unmap", src, (char *)NULL);
-                       exit(1);
                }
-               if (wait_for_pid(pid) < 0)
-                       return -1;
        }
 
-       if ((pid = fork()) < 0)
+       rbdfullname = alloca(strlen(src) - 8);
+       strcpy(rbdfullname, &src[9]);
+       args.rbd_name = rbdfullname;
+       ret = run_command(cmd_output, sizeof(cmd_output),
+                       rbd_delete_wrapper, (void *)&args);
+       if (ret < 0) {
+               ERROR("Failed to delete rbd storage volume \"%s\": %s",
+                     rbdfullname, cmd_output);
                return -1;
-       if (!pid) {
-               rbdfullname = alloca(strlen(src) - 8);
-               strcpy(rbdfullname, &src[9]);
-               execlp("rbd", "rbd", "rm", rbdfullname, (char *)NULL);
-               exit(1);
        }
-       return wait_for_pid(pid);
+
+       return 0;
 }
 
 int rbd_detect(const char *path)
@@ -170,6 +233,7 @@ int rbd_detect(const char *path)
 int rbd_mount(struct bdev *bdev)
 {
        char *src;
+
        if (strcmp(bdev->type, "rbd"))
                return -22;
 
@@ -185,7 +249,7 @@ int rbd_mount(struct bdev *bdev)
                return -1;
        }
 
-       return mount_unknown_fs(bdev->src, bdev->dest, bdev->mntopts);
+       return mount_unknown_fs(src, bdev->dest, bdev->mntopts);
 }
 
 int rbd_umount(struct bdev *bdev)