make btrfs qgroups show human readable sizes, using -h option, example:

qgroupid rfer         excl         max_rfer     max_excl     parent  child
-------- ----         ----         --------     --------     ------  -----
0/5      299.58MiB    299.58MiB    400.00MiB    0.00B        1/1     ---
0/265    299.58MiB    16.00KiB     0.00B        320.00MiB    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>
---
 Documentation/btrfs-qgroup.txt |  2 ++
 cmds-qgroup.c                  |  6 +++++-
 qgroup.c                       | 46 ++++++++++++++++++++++++++++++++++--------
 qgroup.h                       |  1 +
 4 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/Documentation/btrfs-qgroup.txt b/Documentation/btrfs-qgroup.txt
index 3e13373..6a3d649 100644
--- a/Documentation/btrfs-qgroup.txt
+++ b/Documentation/btrfs-qgroup.txt
@@ -69,6 +69,8 @@ print child qgroup id.
 print max referenced size of qgroup.
 -e::::
 print max exclusive size of qgroup.
+-h::::
+print sizes in human readable format (e.g., 1KiB 234MiB 2GiB).
 -F::::
 list all qgroups which impact the given path(include ancestral qgroups)
 -f::::
diff --git a/cmds-qgroup.c b/cmds-qgroup.c
index 957fbc9..c2bd0a3 100644
--- a/cmds-qgroup.c
+++ b/cmds-qgroup.c
@@ -212,6 +212,7 @@ static const char * const cmd_qgroup_show_usage[] = {
        "-c             print child qgroup id",
        "-r             print max referenced size of qgroup",
        "-e             print max exclusive size of qgroup",
+       "-h             print sizes in human readable format (e.g., 1KiB 234MiB 
2GiB)",
        "-F             list all qgroups which impact the given path"
        "(include ancestral qgroups)",
        "-f             list all qgroups which impact the given path"
@@ -246,7 +247,7 @@ static int cmd_qgroup_show(int argc, char **argv)
 
        optind = 1;
        while (1) {
-               c = getopt_long(argc, argv, "pcreFf",
+               c = getopt_long(argc, argv, "pcrehFf",
                                long_options, NULL);
                if (c < 0)
                        break;
@@ -267,6 +268,9 @@ static int cmd_qgroup_show(int argc, char **argv)
                        btrfs_qgroup_setup_print_column(
                                BTRFS_QGROUP_MAX_EXCL);
                        break;
+               case 'h':
+                       btrfs_qgroup_setup_human_readable();
+                       break;
                case 'F':
                        filter_flag |= 0x1;
                        break;
diff --git a/qgroup.c b/qgroup.c
index 1a4866c..5cb239e 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;
+       int human_readable;
        int max_len;
 } btrfs_qgroup_columns[] = {
        {
                .name           = "qgroupid",
                .column_name    = "Qgroupid",
                .need_print     = 1,
+               .human_readable = 0,
                .max_len        = 8,
        },
        {
                .name           = "rfer",
                .column_name    = "Rfer",
                .need_print     = 1,
-               .max_len        = 4,
+               .human_readable = 0,
+               .max_len        = 12,
        },
        {
                .name           = "excl",
                .column_name    = "Excl",
                .need_print     = 1,
-               .max_len        = 4,
+               .human_readable = 0,
+               .max_len        = 12,
        },
        {       .name           = "max_rfer",
                .column_name    = "Max_rfer",
                .need_print     = 0,
-               .max_len        = 8,
+               .human_readable = 0,
+               .max_len        = 12,
        },
        {
                .name           = "max_excl",
                .column_name    = "Max_excl",
                .need_print     = 0,
-               .max_len        = 8,
+               .human_readable = 0,
+               .max_len        = 12,
        },
        {
                .name           = "parent",
                .column_name    = "Parent",
                .need_print     = 0,
+               .human_readable = 0,
                .max_len        = 7,
        },
        {
                .name           = "child",
                .column_name    = "Child",
                .need_print     = 0,
+               .human_readable = 0,
                .max_len        = 5,
        },
        {
                .name           = NULL,
                .column_name    = NULL,
                .need_print     = 0,
+               .human_readable = 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(void)
+{
+       btrfs_qgroup_columns[BTRFS_QGROUP_RFER].human_readable = 1;
+       btrfs_qgroup_columns[BTRFS_QGROUP_EXCL].human_readable = 1;
+       btrfs_qgroup_columns[BTRFS_QGROUP_MAX_RFER].human_readable = 1;
+       btrfs_qgroup_columns[BTRFS_QGROUP_MAX_EXCL].human_readable = 1;
+}
+
 static int print_parent_column(struct btrfs_qgroup *qgroup)
 {
        struct btrfs_qgroup_list *list = NULL;
@@ -203,11 +221,17 @@ 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);
+               if (btrfs_qgroup_columns[column].human_readable)
+                       len = printf("%s", pretty_size(qgroup->rfer));
+               else
+                       len = printf("%llu", qgroup->rfer);
                print_qgroup_column_add_blank(BTRFS_QGROUP_RFER, len);
                break;
        case BTRFS_QGROUP_EXCL:
-               len = printf("%llu", qgroup->excl);
+               if (btrfs_qgroup_columns[column].human_readable)
+                       len = printf("%s", pretty_size(qgroup->excl));
+               else
+                       len = printf("%llu", qgroup->excl);
                print_qgroup_column_add_blank(BTRFS_QGROUP_EXCL, len);
                break;
        case BTRFS_QGROUP_PARENT:
@@ -215,11 +239,17 @@ static void print_qgroup_column(struct btrfs_qgroup 
*qgroup,
                print_qgroup_column_add_blank(BTRFS_QGROUP_PARENT, len);
                break;
        case BTRFS_QGROUP_MAX_RFER:
-               len = printf("%llu", qgroup->max_rfer);
+               if (btrfs_qgroup_columns[column].human_readable)
+                       len = printf("%s", pretty_size(qgroup->max_rfer));
+               else
+                       len = printf("%llu", qgroup->max_rfer);
                print_qgroup_column_add_blank(BTRFS_QGROUP_MAX_RFER, len);
                break;
        case BTRFS_QGROUP_MAX_EXCL:
-               len = printf("%llu", qgroup->max_excl);
+               if (btrfs_qgroup_columns[column].human_readable)
+                       len = printf("%s", pretty_size(qgroup->max_excl));
+               else
+                       len = printf("%llu", qgroup->max_excl);
                print_qgroup_column_add_blank(BTRFS_QGROUP_MAX_EXCL, len);
                break;
        case BTRFS_QGROUP_CHILD:
diff --git a/qgroup.h b/qgroup.h
index 653cf1c..cc8ae29 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(void);
 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

Reply via email to