Hello,
> > add --raw, --si, --iec, --kbytes, --mbytes, --gbytes, --tbytes options > make columns which show sizes align to right. Others aligned to left. > > example: > qgroupid rfer excl max_rfer max_excl parent child > -------- ---- ---- -------- -------- ------ ----- > 0/5 299.58MiB 299.58MiB 300.00MiB 300.00MiB 1/1 --- > 0/265 299.58MiB 16.00KiB 400.00MiB 0.00B 1/1 --- > 0/266 299.58MiB 16.00KiB 350.00MiB 0.00B --- --- > 1/1 599.16MiB 299.59MiB 800.00MiB 0.00B --- 0/5,0/265 > > Signed-off-by: Fan Chengniang <fancn.f...@cn.fujitsu.com> > --- > v2: > - change -h option to --human-readable > - merge need_print and human_readable into format > - add print_group_size function > v3: > - remove --human-readable option > - add --raw, --si, --iec, --kbytes, --mbytes, --gbytes, --tbytes options > - by default, sizes are shown in human readable format Oh, really... Have you run with this patch with xfstests? I am not sure whether some qgroup tests could pass this, if not you need keep default raw output, or please modify xfstests to make it pass. > - make columns which show sizes align to right. Othersligned to left. > > Documentation/btrfs-qgroup.txt | 14 ++++++++ > cmds-qgroup.c | 56 ++++++++++++++++++++++++------ > qgroup.c | 77 ++++++++++++++++++++++++++++-------------- > qgroup.h | 1 + > 4 files changed, 113 insertions(+), 35 deletions(-) > > diff --git a/Documentation/btrfs-qgroup.txt b/Documentation/btrfs-qgroup.txt > index 3e13373..89dbd6c 100644 > --- a/Documentation/btrfs-qgroup.txt > +++ b/Documentation/btrfs-qgroup.txt > @@ -73,6 +73,20 @@ print max exclusive size of qgroup. > list all qgroups which impact the given path(include ancestral qgroups) > -f:::: > list all qgroups which impact the given path(exclude ancestral qgroups) > +--raw:::: > +raw numbers in bytes, without the 'B' suffix. > +--iec:::: > +select the 1024 base for the following options, according to the IEC > standard. > +--si:::: > +select the 1000 base for the following options, according to the SI standard. > +--kbytes:::: > +show sizes in KiB, or kB with --si. > +--mbytes:::: > +show sizes in MiB, or MB with --si. > +--gbytes:::: > +show sizes in GiB, or GB with --si. > +--tbytes:::: > +show sizes in TiB, or TB with --si. > --sort=[\+/-]<attr>[,[+/-]<attr>]...:::: > list qgroups in order of <attr>. > + > diff --git a/cmds-qgroup.c b/cmds-qgroup.c > index 957fbc9..2474251 100644 > --- a/cmds-qgroup.c > +++ b/cmds-qgroup.c > @@ -208,19 +208,26 @@ static const char * const cmd_qgroup_show_usage[] = { > "btrfs qgroup show -pcreFf " > "[--sort=qgroupid,rfer,excl,max_rfer,max_excl] <path>", > "Show subvolume quota groups.", > - "-p print parent qgroup id", > - "-c print child qgroup id", > - "-r print max referenced size of qgroup", > - "-e print max exclusive size of qgroup", > - "-F list all qgroups which impact the given path" > + "-p print parent qgroup id", > + "-c print child qgroup id", > + "-r print max referenced size of qgroup", > + "-e print max exclusive size of qgroup", > + "-F list all qgroups which impact the given path" > "(include ancestral qgroups)", > - "-f list all qgroups which impact the given path" > + "-f list all qgroups which impact the given path" > "(exclude ancestral qgroups)", > + "--raw raw numbers in bytes", > + "--iec use 1024 as a base (KiB, MiB, GiB, TiB)", > + "--si use 1000 as a base (kB, MB, GB, TB)", > + "--kbytes show sizes in KiB, or kB with --si", > + "--mbytes show sizes in MiB, or MB with --si", > + "--gbytes show sizes in GiB, or GB with --si", > + "--tbytes show sizes in TiB, or TB with --si", > "--sort=qgroupid,rfer,excl,max_rfer,max_excl", > - " list qgroups in order of qgroupid," > + " list qgroups in order of qgroupid," > "rfer,max_rfer or max_excl", > - " you can use '+' or '-' in front of each item.", > - " (+:ascending, -:descending, ascending default)", > + " you can use '+' or '-' in front of each item.", > + " (+:ascending, -:descending, ascending default)", > NULL > }; > > @@ -234,6 +241,8 @@ static int cmd_qgroup_show(int argc, char **argv) > int c; > u64 qgroupid; > int filter_flag = 0; > + int option_index = 0; > + unsigned unit_mode = UNITS_DEFAULT; > > struct btrfs_qgroup_comparer_set *comparer_set; > struct btrfs_qgroup_filter_set *filter_set; > @@ -241,16 +250,41 @@ static int cmd_qgroup_show(int argc, char **argv) > comparer_set = btrfs_qgroup_alloc_comparer_set(); > struct option long_options[] = { > {"sort", 1, NULL, 'S'}, > + {"raw", no_argument, NULL, 0}, > + {"kbytes", no_argument, NULL, 0}, > + {"mbytes", no_argument, NULL, 0}, > + {"gbytes", no_argument, NULL, 0}, > + {"tbytes", no_argument, NULL, 0}, > + {"si", no_argument, NULL, GETOPT_VAL_SI}, > + {"iec", no_argument, NULL, GETOPT_VAL_IEC}, > {0, 0, 0, 0} > }; > > optind = 1; > while (1) { > c = getopt_long(argc, argv, "pcreFf", > - long_options, NULL); > + long_options, &option_index); > if (c < 0) > break; > switch (c) { > + case 0: > + if (option_index == 1) > + unit_mode = UNITS_RAW; > + else if (option_index == 2) > + units_set_base(&unit_mode, UNITS_KBYTES); > + else if (option_index == 3) > + units_set_base(&unit_mode, UNITS_MBYTES); > + else if (option_index == 4) > + units_set_base(&unit_mode, UNITS_GBYTES); > + else if (option_index == 5) > + units_set_base(&unit_mode, UNITS_TBYTES); > + break; > + case GETOPT_VAL_SI: > + units_set_mode(&unit_mode, UNITS_DECIMAL); > + break; > + case GETOPT_VAL_IEC: > + units_set_mode(&unit_mode, UNITS_BINARY); > + break; > case 'p': > btrfs_qgroup_setup_print_column( > BTRFS_QGROUP_PARENT); > @@ -283,6 +317,8 @@ static int cmd_qgroup_show(int argc, char **argv) > usage(cmd_qgroup_show_usage); > } > } > + btrfs_qgroup_setup_human_readable(unit_mode); > + > if (check_argc_exact(argc - optind, 1)) > usage(cmd_qgroup_show_usage); > > diff --git a/qgroup.c b/qgroup.c > index 1a4866c..8ec55df 100644 > --- a/qgroup.c > +++ b/qgroup.c > @@ -20,6 +20,7 @@ > #include <sys/ioctl.h> > #include "ctree.h" > #include "ioctl.h" > +#include "utils.h" > > #define BTRFS_QGROUP_NFILTERS_INCREASE (2 * BTRFS_QGROUP_FILTER_MAX) > #define BTRFS_QGROUP_NCOMPS_INCREASE (2 * BTRFS_QGROUP_COMP_MAX) > @@ -80,53 +81,62 @@ static struct { > char *name; > char *column_name; > int need_print; > + unsigned unit_mode; > int max_len; > } btrfs_qgroup_columns[] = { > { > .name = "qgroupid", > .column_name = "Qgroupid", > .need_print = 1, > + .unit_mode = 0, > .max_len = 8, > }, > { > .name = "rfer", > .column_name = "Rfer", > .need_print = 1, > - .max_len = 4, > + .unit_mode = UNITS_DEFAULT, > + .max_len = 12, > }, > { > .name = "excl", > .column_name = "Excl", > .need_print = 1, > - .max_len = 4, > + .unit_mode = UNITS_DEFAULT, > + .max_len = 12, > }, > { .name = "max_rfer", > .column_name = "Max_rfer", > .need_print = 0, > - .max_len = 8, > + .unit_mode = UNITS_DEFAULT, > + .max_len = 12, > }, > { > .name = "max_excl", > .column_name = "Max_excl", > .need_print = 0, > - .max_len = 8, > + .unit_mode = UNITS_DEFAULT, > + .max_len = 12, > }, > { > .name = "parent", > .column_name = "Parent", > .need_print = 0, > + .unit_mode = 0, > .max_len = 7, > }, > { > .name = "child", > .column_name = "Child", > .need_print = 0, > + .unit_mode = 0, > .max_len = 5, > }, > { > .name = NULL, > .column_name = NULL, > .need_print = 0, > + .unit_mode = 0, > }, > }; > > @@ -147,6 +157,14 @@ void btrfs_qgroup_setup_print_column(enum > btrfs_qgroup_column_enum column) > btrfs_qgroup_columns[i].need_print = 1; > } > > +void btrfs_qgroup_setup_human_readable(unsigned unit_mode) > +{ > + btrfs_qgroup_columns[BTRFS_QGROUP_RFER].unit_mode = unit_mode; > + btrfs_qgroup_columns[BTRFS_QGROUP_EXCL].unit_mode = unit_mode; > + btrfs_qgroup_columns[BTRFS_QGROUP_MAX_RFER].unit_mode = unit_mode; > + btrfs_qgroup_columns[BTRFS_QGROUP_MAX_EXCL].unit_mode = unit_mode; > +} > + > static int print_parent_column(struct btrfs_qgroup *qgroup) > { > struct btrfs_qgroup_list *list = NULL; > @@ -194,6 +212,8 @@ static void print_qgroup_column(struct btrfs_qgroup > *qgroup, > { > BUG_ON(column >= BTRFS_QGROUP_ALL || column < 0); > int len; > + int unit_mode = btrfs_qgroup_columns[column].unit_mode; > + int max_len = btrfs_qgroup_columns[column].max_len; > > switch (column) { > > @@ -203,24 +223,20 @@ static void print_qgroup_column(struct btrfs_qgroup > *qgroup, > print_qgroup_column_add_blank(BTRFS_QGROUP_QGROUPID, len); > break; > case BTRFS_QGROUP_RFER: > - len = printf("%llu", qgroup->rfer); > - print_qgroup_column_add_blank(BTRFS_QGROUP_RFER, len); > + len = printf("%*s", max_len, pretty_size_mode(qgroup->rfer, > unit_mode)); > break; > case BTRFS_QGROUP_EXCL: > - len = printf("%llu", qgroup->excl); > - print_qgroup_column_add_blank(BTRFS_QGROUP_EXCL, len); > + len = printf("%*s", max_len, pretty_size_mode(qgroup->excl, > unit_mode)); > break; > case BTRFS_QGROUP_PARENT: > len = print_parent_column(qgroup); > print_qgroup_column_add_blank(BTRFS_QGROUP_PARENT, len); > break; > case BTRFS_QGROUP_MAX_RFER: > - len = printf("%llu", qgroup->max_rfer); > - print_qgroup_column_add_blank(BTRFS_QGROUP_MAX_RFER, len); > + len = printf("%*s", max_len, pretty_size_mode(qgroup->max_rfer, > unit_mode)); > break; > case BTRFS_QGROUP_MAX_EXCL: > - len = printf("%llu", qgroup->max_excl); > - print_qgroup_column_add_blank(BTRFS_QGROUP_MAX_EXCL, len); > + len = printf("%*s", max_len, pretty_size_mode(qgroup->max_excl, > unit_mode)); > break; > case BTRFS_QGROUP_CHILD: > len = print_child_column(qgroup); > @@ -250,30 +266,41 @@ static void print_table_head() > { > int i; > int len; > + int max_len; > > for (i = 0; i < BTRFS_QGROUP_ALL; i++) { > + max_len = btrfs_qgroup_columns[i].max_len; > if (!btrfs_qgroup_columns[i].need_print) > continue; > - printf("%s", btrfs_qgroup_columns[i].name); > - len = btrfs_qgroup_columns[i].max_len - > - strlen(btrfs_qgroup_columns[i].name); > - while (len--) > - printf(" "); > + if ((i == BTRFS_QGROUP_QGROUPID) | (i == BTRFS_QGROUP_PARENT) | > + (i == BTRFS_QGROUP_CHILD)) > + printf("%-*s", max_len, btrfs_qgroup_columns[i].name); > + else > + printf("%*s", max_len, btrfs_qgroup_columns[i].name); > printf(" "); > } > printf("\n"); > for (i = 0; i < BTRFS_QGROUP_ALL; i++) { > + max_len = btrfs_qgroup_columns[i].max_len; > if (!btrfs_qgroup_columns[i].need_print) > continue; > - > - len = strlen(btrfs_qgroup_columns[i].name); > - while (len--) > - printf("-"); > - len = btrfs_qgroup_columns[i].max_len - > - strlen(btrfs_qgroup_columns[i].name); > + if ((i == BTRFS_QGROUP_QGROUPID) | (i == BTRFS_QGROUP_PARENT) | > + (i == BTRFS_QGROUP_CHILD)) { > + len = strlen(btrfs_qgroup_columns[i].name); > + while (len--) > + printf("-"); > + len = max_len - strlen(btrfs_qgroup_columns[i].name); > + while (len--) > + printf(" "); > + } else { > + len = max_len - strlen(btrfs_qgroup_columns[i].name); > + while (len--) > + printf(" "); > + len = strlen(btrfs_qgroup_columns[i].name); > + while (len--) > + printf("-"); > + } > printf(" "); > - while (len--) > - printf(" "); > } > printf("\n"); > } > diff --git a/qgroup.h b/qgroup.h > index 653cf1c..09070b6 100644 > --- a/qgroup.h > +++ b/qgroup.h > @@ -83,6 +83,7 @@ u64 btrfs_get_path_rootid(int fd); > int btrfs_show_qgroups(int fd, struct btrfs_qgroup_filter_set *, > struct btrfs_qgroup_comparer_set *); > void btrfs_qgroup_setup_print_column(enum btrfs_qgroup_column_enum column); > +void btrfs_qgroup_setup_human_readable(unsigned unit_mode); > struct btrfs_qgroup_filter_set *btrfs_qgroup_alloc_filter_set(void); > void btrfs_qgroup_free_filter_set(struct btrfs_qgroup_filter_set *filter_set); > int btrfs_qgroup_setup_filter(struct btrfs_qgroup_filter_set **filter_set, > -- > 1.9.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 Best Regards, Wang Shilong -- 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