From: Omar Sandoval <osan...@fb.com> These become trivial calls to the libbtrfsutil helpers, and we can get rid of the qgroup inherit code in progs.
Signed-off-by: Omar Sandoval <osan...@fb.com> --- cmds-subvolume.c | 225 ++++++++++++++----------------------------------------- qgroup.c | 64 ---------------- qgroup.h | 2 - 3 files changed, 58 insertions(+), 233 deletions(-) diff --git a/cmds-subvolume.c b/cmds-subvolume.c index 42cc30ce..ea436ba0 100644 --- a/cmds-subvolume.c +++ b/cmds-subvolume.c @@ -103,6 +103,35 @@ static int wait_for_subvolume_cleaning(int fd, int count, u64 *ids, return 0; } +static int qgroup_inherit_add_group(struct btrfs_util_qgroup_inherit **inherit, + const char *arg) +{ + enum btrfs_util_error err; + u64 qgroupid; + + if (!*inherit) { + err = btrfs_util_create_qgroup_inherit(0, inherit); + if (err) { + error_btrfs_util(err); + return -1; + } + } + + qgroupid = parse_qgroupid(optarg); + if (qgroupid == 0) { + error("invalid qgroup specification, qgroupid must not be 0"); + return -1; + } + + err = btrfs_util_qgroup_inherit_add_group(inherit, qgroupid); + if (err) { + error_btrfs_util(err); + return -1; + } + + return 0; +} + static const char * const subvolume_cmd_group_usage[] = { "btrfs subvolume <command> <args>", NULL @@ -121,15 +150,9 @@ static const char * const cmd_subvol_create_usage[] = { static int cmd_subvol_create(int argc, char **argv) { - int retval, res, len; - int fddst = -1; - char *dupname = NULL; - char *dupdir = NULL; - char *newname; - char *dstdir; - char *dst; - struct btrfs_qgroup_inherit *inherit = NULL; - DIR *dirstream = NULL; + struct btrfs_util_qgroup_inherit *inherit = NULL; + enum btrfs_util_error err; + int retval = 1; while (1) { int c = getopt(argc, argv, "i:"); @@ -138,11 +161,8 @@ static int cmd_subvol_create(int argc, char **argv) switch (c) { case 'i': - res = qgroup_inherit_add_group(&inherit, optarg); - if (res) { - retval = res; + if (qgroup_inherit_add_group(&inherit, optarg) == -1) goto out; - } break; default: usage(cmd_subvol_create_usage); @@ -152,70 +172,18 @@ static int cmd_subvol_create(int argc, char **argv) if (check_argc_exact(argc - optind, 1)) usage(cmd_subvol_create_usage); - dst = argv[optind]; - - retval = 1; /* failure */ - res = test_isdir(dst); - if (res < 0 && res != -ENOENT) { - error("cannot access %s: %s", dst, strerror(-res)); - goto out; - } - if (res >= 0) { - error("target path already exists: %s", dst); - goto out; - } - - dupname = strdup(dst); - newname = basename(dupname); - dupdir = strdup(dst); - dstdir = dirname(dupdir); - - if (!test_issubvolname(newname)) { - error("invalid subvolume name: %s", newname); - goto out; - } - - len = strlen(newname); - if (len == 0 || len >= BTRFS_VOL_NAME_MAX) { - error("subvolume name too long: %s", newname); - goto out; - } - - fddst = btrfs_open_dir(dstdir, &dirstream, 1); - if (fddst < 0) - goto out; - - printf("Create subvolume '%s/%s'\n", dstdir, newname); - if (inherit) { - struct btrfs_ioctl_vol_args_v2 args; - - memset(&args, 0, sizeof(args)); - strncpy_null(args.name, newname); - args.flags |= BTRFS_SUBVOL_QGROUP_INHERIT; - args.size = qgroup_inherit_size(inherit); - args.qgroup_inherit = inherit; - - res = ioctl(fddst, BTRFS_IOC_SUBVOL_CREATE_V2, &args); - } else { - struct btrfs_ioctl_vol_args args; - - memset(&args, 0, sizeof(args)); - strncpy_null(args.name, newname); - - res = ioctl(fddst, BTRFS_IOC_SUBVOL_CREATE, &args); - } + printf("Create subvolume '%s'\n", argv[optind]); - if (res < 0) { - error("cannot create subvolume: %m"); + err = btrfs_util_create_subvolume(argv[optind], 0, NULL, inherit); + if (err) { + error_btrfs_util(err); goto out; } - retval = 0; /* success */ + retval = 0; out: - close_file_or_dir(fddst, dirstream); - free(inherit); - free(dupname); - free(dupdir); + if (inherit) + btrfs_util_destroy_qgroup_inherit(inherit); return retval; } @@ -650,19 +618,11 @@ static const char * const cmd_subvol_snapshot_usage[] = { static int cmd_subvol_snapshot(int argc, char **argv) { - char *subvol, *dst; - int res, retval; - int fd = -1, fddst = -1; - int len, readonly = 0; - char *dupname = NULL; - char *dupdir = NULL; - char *newname; - char *dstdir; - struct btrfs_ioctl_vol_args_v2 args; - struct btrfs_qgroup_inherit *inherit = NULL; - DIR *dirstream1 = NULL, *dirstream2 = NULL; + struct btrfs_util_qgroup_inherit *inherit = NULL; + enum btrfs_util_error err; + int flags = 0; + int retval = 1; - memset(&args, 0, sizeof(args)); while (1) { int c = getopt(argc, argv, "i:r"); if (c < 0) @@ -670,14 +630,11 @@ static int cmd_subvol_snapshot(int argc, char **argv) switch (c) { case 'i': - res = qgroup_inherit_add_group(&inherit, optarg); - if (res) { - retval = res; + if (qgroup_inherit_add_group(&inherit, optarg) == -1) goto out; - } break; case 'r': - readonly = 1; + flags |= BTRFS_UTIL_CREATE_SNAPSHOT_READ_ONLY; break; default: usage(cmd_subvol_snapshot_usage); @@ -687,92 +644,26 @@ static int cmd_subvol_snapshot(int argc, char **argv) if (check_argc_exact(argc - optind, 2)) usage(cmd_subvol_snapshot_usage); - subvol = argv[optind]; - dst = argv[optind + 1]; - - retval = 1; /* failure */ - res = test_issubvolume(subvol); - if (res < 0) { - error("cannot access subvolume %s: %s", subvol, strerror(-res)); - goto out; - } - if (!res) { - error("not a subvolume: %s", subvol); - goto out; - } - - res = test_isdir(dst); - if (res < 0 && res != -ENOENT) { - error("cannot access %s: %s", dst, strerror(-res)); - goto out; - } - if (res == 0) { - error("'%s' exists and it is not a directory", dst); - goto out; - } - - if (res > 0) { - dupname = strdup(subvol); - newname = basename(dupname); - dstdir = dst; + if (flags & BTRFS_UTIL_CREATE_SNAPSHOT_READ_ONLY) { + printf("Create a readonly snapshot of '%s' in '%s'\n", + argv[optind], argv[optind + 1]); } else { - dupname = strdup(dst); - newname = basename(dupname); - dupdir = strdup(dst); - dstdir = dirname(dupdir); + printf("Create a snapshot of '%s' in '%s'\n", argv[optind], + argv[optind + 1]); } - if (!test_issubvolname(newname)) { - error("invalid snapshot name '%s'", newname); - goto out; - } - - len = strlen(newname); - if (len == 0 || len >= BTRFS_VOL_NAME_MAX) { - error("snapshot name too long '%s'", newname); - goto out; - } - - fddst = btrfs_open_dir(dstdir, &dirstream1, 1); - if (fddst < 0) - goto out; - - fd = btrfs_open_dir(subvol, &dirstream2, 1); - if (fd < 0) - goto out; - - if (readonly) { - args.flags |= BTRFS_SUBVOL_RDONLY; - printf("Create a readonly snapshot of '%s' in '%s/%s'\n", - subvol, dstdir, newname); - } else { - printf("Create a snapshot of '%s' in '%s/%s'\n", - subvol, dstdir, newname); - } - - args.fd = fd; - if (inherit) { - args.flags |= BTRFS_SUBVOL_QGROUP_INHERIT; - args.size = qgroup_inherit_size(inherit); - args.qgroup_inherit = inherit; - } - strncpy_null(args.name, newname); - - res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE_V2, &args); - - if (res < 0) { - error("cannot snapshot '%s': %m", subvol); + err = btrfs_util_create_snapshot(argv[optind], argv[optind + 1], flags, + NULL, inherit); + if (err) { + error_btrfs_util(err); goto out; } - retval = 0; /* success */ + retval = 0; out: - close_file_or_dir(fddst, dirstream1); - close_file_or_dir(fd, dirstream2); - free(inherit); - free(dupname); - free(dupdir); + if (inherit) + btrfs_util_destroy_qgroup_inherit(inherit); return retval; } diff --git a/qgroup.c b/qgroup.c index b107a683..69395939 100644 --- a/qgroup.c +++ b/qgroup.c @@ -1260,67 +1260,3 @@ out: free(opt_tmp); return ret; } - -int qgroup_inherit_size(struct btrfs_qgroup_inherit *p) -{ - return sizeof(*p) + sizeof(p->qgroups[0]) * - (p->num_qgroups + 2 * p->num_ref_copies + - 2 * p->num_excl_copies); -} - -static int -qgroup_inherit_realloc(struct btrfs_qgroup_inherit **inherit, int n, int pos) -{ - struct btrfs_qgroup_inherit *out; - int nitems = 0; - - if (*inherit) { - nitems = (*inherit)->num_qgroups + - (*inherit)->num_ref_copies + - (*inherit)->num_excl_copies; - } - - out = calloc(sizeof(*out) + sizeof(out->qgroups[0]) * (nitems + n), 1); - if (out == NULL) { - error("not enough memory"); - return -ENOMEM; - } - - if (*inherit) { - struct btrfs_qgroup_inherit *i = *inherit; - int s = sizeof(out->qgroups[0]); - - out->num_qgroups = i->num_qgroups; - out->num_ref_copies = i->num_ref_copies; - out->num_excl_copies = i->num_excl_copies; - memcpy(out->qgroups, i->qgroups, pos * s); - memcpy(out->qgroups + pos + n, i->qgroups + pos, - (nitems - pos) * s); - } - free(*inherit); - *inherit = out; - - return 0; -} - -int qgroup_inherit_add_group(struct btrfs_qgroup_inherit **inherit, char *arg) -{ - int ret; - u64 qgroupid = parse_qgroupid(arg); - int pos = 0; - - if (qgroupid == 0) { - error("invalid qgroup specification, qgroupid must not 0"); - return -EINVAL; - } - - if (*inherit) - pos = (*inherit)->num_qgroups; - ret = qgroup_inherit_realloc(inherit, 1, pos); - if (ret) - return ret; - - (*inherit)->qgroups[(*inherit)->num_qgroups++] = qgroupid; - - return 0; -} diff --git a/qgroup.h b/qgroup.h index bb6610d7..97c6cd9e 100644 --- a/qgroup.h +++ b/qgroup.h @@ -90,7 +90,5 @@ struct btrfs_qgroup_comparer_set *btrfs_qgroup_alloc_comparer_set(void); int btrfs_qgroup_setup_comparer(struct btrfs_qgroup_comparer_set **comp_set, enum btrfs_qgroup_comp_enum comparer, int is_descending); -int qgroup_inherit_size(struct btrfs_qgroup_inherit *p); -int qgroup_inherit_add_group(struct btrfs_qgroup_inherit **inherit, char *arg); #endif -- 2.16.1 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html