From: Christian Brauner Date: Mon, 24 Jul 2017 22:13:57 +0000 (+0200) Subject: rbd: rework rbd storage driver X-Git-Tag: lxc-2.1.0~32^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b0e906f168d9dd978059bcb06e1c6074279dac1;p=thirdparty%2Flxc.git rbd: rework rbd storage driver Signed-off-by: Christian Brauner --- diff --git a/src/lxc/bdev/lxcrbd.c b/src/lxc/bdev/lxcrbd.c index 3cd951cd0..7af4aaa24 100644 --- a/src/lxc/bdev/lxcrbd.c +++ b/src/lxc/bdev/lxcrbd.c @@ -36,6 +36,50 @@ 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)