* [PATCH v3] btrfs-progs: make btrfs qgroups show human readable sizes
@ 2015-01-19 7:18 Fan Chengniang
2015-01-19 7:31 ` Wang Shilong
0 siblings, 1 reply; 3+ messages in thread
From: Fan Chengniang @ 2015-01-19 7:18 UTC (permalink / raw)
To: linux-btrfs; +Cc: Fan Chengniang
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(-)
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
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v3] btrfs-progs: make btrfs qgroups show human readable sizes
2015-01-19 7:18 [PATCH v3] btrfs-progs: make btrfs qgroups show human readable sizes Fan Chengniang
@ 2015-01-19 7:31 ` Wang Shilong
2015-01-19 7:53 ` Fan Chengniang/樊成酿
0 siblings, 1 reply; 3+ messages in thread
From: Wang Shilong @ 2015-01-19 7:31 UTC (permalink / raw)
To: Fan Chengniang; +Cc: linux-btrfs
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v3] btrfs-progs: make btrfs qgroups show human readable sizes
2015-01-19 7:31 ` Wang Shilong
@ 2015-01-19 7:53 ` Fan Chengniang/樊成酿
0 siblings, 0 replies; 3+ messages in thread
From: Fan Chengniang/樊成酿 @ 2015-01-19 7:53 UTC (permalink / raw)
To: Wang Shilong; +Cc: linux-btrfs
在 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
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-01-19 7:54 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-19 7:18 [PATCH v3] btrfs-progs: make btrfs qgroups show human readable sizes Fan Chengniang
2015-01-19 7:31 ` Wang Shilong
2015-01-19 7:53 ` Fan Chengniang/樊成酿
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).