Message ID | 1421651898-792-1-git-send-email-fancn.fnst@cn.fujitsu.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
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.fnst@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 majordomo@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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
? 2015?01?19? 15:31, Wang Shilong ??: > 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.fnst@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. > I will test and repair it.thanx >> - 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 majordomo@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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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,
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.fnst@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 - make columns which show sizes align to right. Others aligned to left. Documentation/btrfs-qgroup.txt | 14 ++++++++ cmds-qgroup.c | 56 ++++++++++++++++++++++++------ qgroup.c | 77 ++++++++++++++++++++++++++++-------------- qgroup.h | 1 + 4 files changed, 113 insertions(+), 35 deletions(-)