btrfs-progs: make btrfs qgroups show human readable sizes
authorFan Chengniang <fancn.fnst@cn.fujitsu.com>
Mon, 19 Jan 2015 07:18:18 +0000 (15:18 +0800)
committerDavid Sterba <dsterba@suse.cz>
Wed, 21 Jan 2015 17:13:18 +0000 (18:13 +0100)
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>
Signed-off-by: David Sterba <dsterba@suse.cz>
Documentation/btrfs-qgroup.txt
cmds-qgroup.c
qgroup.c
qgroup.h

index 7e370bd..8d15cee 100644 (file)
@@ -89,6 +89,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>.
 +
index dfb38f7..26c8791 100644 (file)
@@ -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
 };
 
@@ -233,6 +240,7 @@ static int cmd_qgroup_show(int argc, char **argv)
        DIR *dirstream = NULL;
        u64 qgroupid;
        int filter_flag = 0;
+       unsigned unit_mode = UNITS_DEFAULT;
 
        struct btrfs_qgroup_comparer_set *comparer_set;
        struct btrfs_qgroup_filter_set *filter_set;
@@ -242,12 +250,20 @@ static int cmd_qgroup_show(int argc, char **argv)
        optind = 1;
        while (1) {
                int c;
+               int option_index = 0;
                static const 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}
                };
                c = getopt_long(argc, argv, "pcreFf",
-                               long_options, NULL);
+                               long_options, &option_index);
 
                if (c < 0)
                        break;
@@ -280,10 +296,30 @@ static int cmd_qgroup_show(int argc, char **argv)
                        if (ret)
                                usage(cmd_qgroup_show_usage);
                        break;
+               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;
                default:
                        usage(cmd_qgroup_show_usage);
                }
        }
+       btrfs_qgroup_setup_units(unit_mode);
+
        if (check_argc_exact(argc - optind, 1))
                usage(cmd_qgroup_show_usage);
 
index 1a4866c..bfc11d2 100644 (file)
--- 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_units(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");
 }
index d9758fa..6e65ef7 100644 (file)
--- 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_units(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,