btrfs-progs: make btrfs qgroups show human readable sizes

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>
master
Fan Chengniang 2015-01-19 15:18:18 +08:00 committed by David Sterba
parent 07ce7005fc
commit 4d13434539
4 changed files with 113 additions and 35 deletions

View 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>.
+

View 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);

View File

@ -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");
}

View File

@ -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,