mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-08 22:49:34 +00:00
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>
This commit is contained in:
parent
07ce7005fc
commit
4d13434539
@ -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>.
|
||||
+
|
||||
|
@ -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);
|
||||
|
||||
|
77
qgroup.c
77
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");
|
||||
}
|
||||
|
1
qgroup.h
1
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,
|
||||
|
Loading…
Reference in New Issue
Block a user