X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=cmds-qgroup.c;h=93206900693de5a43472f6c6c6ff6f63b6d3230c;hb=3d29a0e5d1c862bf2206b809feab8b07839c2094;hp=14418d455c3c6866b15e37ee4f6de94fd381702e;hpb=9fa1f12caa414c9d396f2ceb54762d3d3a93fc75;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/cmds-qgroup.c b/cmds-qgroup.c index 14418d4..9320690 100644 --- a/cmds-qgroup.c +++ b/cmds-qgroup.c @@ -20,12 +20,15 @@ #include #include +#include + #include "ctree.h" #include "ioctl.h" #include "commands.h" #include "qgroup.h" #include "utils.h" +#include "help.h" static const char * const qgroup_cmd_group_usage[] = { "btrfs qgroup [options] ", @@ -95,7 +98,7 @@ static int _cmd_qgroup_assign(int assign, int argc, char **argv, ret = ioctl(fd, BTRFS_IOC_QGROUP_ASSIGN, &args); if (ret < 0) { - error("unable to assign quota group: %s", strerror(errno)); + error("unable to assign quota group: %m"); close_file_or_dir(fd, dirstream); return 1; } @@ -116,8 +119,7 @@ static int _cmd_qgroup_assign(int assign, int argc, char **argv, memset(&qargs, 0, sizeof(qargs)); ret = ioctl(fd, BTRFS_IOC_QUOTA_RESCAN, &qargs); if (ret < 0) - error("quota rescan failed: %s", - strerror(errno)); + error("quota rescan failed: %m"); } else { warning("quotas may be inconsistent, rescan needed"); } @@ -130,7 +132,6 @@ static int _cmd_qgroup_create(int create, int argc, char **argv) { int ret = 0; int fd; - int e; char *path; struct btrfs_ioctl_qgroup_create_args args; DIR *dirstream = NULL; @@ -148,11 +149,10 @@ static int _cmd_qgroup_create(int create, int argc, char **argv) return 1; ret = ioctl(fd, BTRFS_IOC_QGROUP_CREATE, &args); - e = errno; close_file_or_dir(fd, dirstream); if (ret < 0) { - error("unable to %s quota group: %s", - create ? "create":"destroy", strerror(e)); + error("unable to %s quota group: %m", + create ? "create":"destroy"); return 1; } return 0; @@ -272,8 +272,7 @@ static int cmd_qgroup_destroy(int argc, char **argv) } static const char * const cmd_qgroup_show_usage[] = { - "btrfs qgroup show -pcreFf " - "[--sort=qgroupid,rfer,excl,max_rfer,max_excl] ", + "btrfs qgroup show [options] ", "Show subvolume quota groups.", "-p print parent qgroup id", "-c print child qgroup id", @@ -288,6 +287,7 @@ static const char * const cmd_qgroup_show_usage[] = { " list qgroups sorted by specified items", " you can use '+' or '-' in front of each item.", " (+:ascending, -:descending, ascending default)", + "--sync force sync of the filesystem before getting info", NULL }; @@ -296,11 +296,12 @@ static int cmd_qgroup_show(int argc, char **argv) char *path; int ret = 0; int fd; - int e; DIR *dirstream = NULL; u64 qgroupid; int filter_flag = 0; unsigned unit_mode; + int sync = 0; + enum btrfs_util_error err; struct btrfs_qgroup_comparer_set *comparer_set; struct btrfs_qgroup_filter_set *filter_set; @@ -309,11 +310,15 @@ static int cmd_qgroup_show(int argc, char **argv) unit_mode = get_unit_mode_from_arg(&argc, argv, 0); - optind = 1; while (1) { int c; + enum { + GETOPT_VAL_SORT = 256, + GETOPT_VAL_SYNC + }; static const struct option long_options[] = { - {"sort", required_argument, NULL, 'S'}, + {"sort", required_argument, NULL, GETOPT_VAL_SORT}, + {"sync", no_argument, NULL, GETOPT_VAL_SYNC}, { NULL, 0, NULL, 0 } }; @@ -343,12 +348,15 @@ static int cmd_qgroup_show(int argc, char **argv) case 'f': filter_flag |= 0x2; break; - case 'S': + case GETOPT_VAL_SORT: ret = btrfs_qgroup_parse_sort_string(optarg, &comparer_set); if (ret) usage(cmd_qgroup_show_usage); break; + case GETOPT_VAL_SYNC: + sync = 1; + break; default: usage(cmd_qgroup_show_usage); } @@ -361,13 +369,26 @@ static int cmd_qgroup_show(int argc, char **argv) path = argv[optind]; fd = btrfs_open_dir(path, &dirstream, 1); if (fd < 0) { - btrfs_qgroup_free_filter_set(filter_set); - btrfs_qgroup_free_comparer_set(comparer_set); + free(filter_set); + free(comparer_set); return 1; } + if (sync) { + err = btrfs_util_sync_fd(fd); + if (err) + warning("sync ioctl failed on '%s': %s", path, + strerror(errno)); + } + if (filter_flag) { - qgroupid = btrfs_get_path_rootid(fd); + ret = lookup_path_rootid(fd, &qgroupid); + if (ret < 0) { + error("cannot resolve rootid for %s: %s", + path, strerror(-ret)); + close_file_or_dir(fd, dirstream); + goto out; + } if (filter_flag & 0x1) btrfs_qgroup_setup_filter(&filter_set, BTRFS_QGROUP_FILTER_ALL_PARENT, @@ -378,11 +399,11 @@ static int cmd_qgroup_show(int argc, char **argv) qgroupid); } ret = btrfs_show_qgroups(fd, filter_set, comparer_set); - e = errno; close_file_or_dir(fd, dirstream); - if (ret < 0) - error("can't list qgroups: %s", strerror(e)); + free(filter_set); + free(comparer_set); +out: return !!ret; } @@ -400,15 +421,14 @@ static int cmd_qgroup_limit(int argc, char **argv) { int ret = 0; int fd; - int e; char *path = NULL; struct btrfs_ioctl_qgroup_limit_args args; unsigned long long size; int compressed = 0; int exclusive = 0; DIR *dirstream = NULL; + enum btrfs_util_error err; - optind = 1; while (1) { int c = getopt(argc, argv, "ce"); if (c < 0) @@ -448,13 +468,9 @@ static int cmd_qgroup_limit(int argc, char **argv) if (argc - optind == 2) { args.qgroupid = 0; path = argv[optind + 1]; - ret = test_issubvolume(path); - if (ret < 0) { - error("cannot access '%s': %s", path, strerror(-ret)); - return 1; - } - if (!ret) { - error("'%s' is not a subvolume", path); + err = btrfs_util_is_subvolume(path); + if (err) { + error_btrfs_util(err); return 1; } /* @@ -472,10 +488,9 @@ static int cmd_qgroup_limit(int argc, char **argv) return 1; ret = ioctl(fd, BTRFS_IOC_QGROUP_LIMIT, &args); - e = errno; close_file_or_dir(fd, dirstream); if (ret < 0) { - error("unable to limit requested quota group: %s", strerror(e)); + error("unable to limit requested quota group: %m"); return 1; } return 0;