All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Fan Chengniang/樊成酿" <fancn.fnst@cn.fujitsu.com>
To: Wang Shilong <wangshilong1991@gmail.com>
Cc: <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH v3] btrfs-progs: make btrfs qgroups show human readable sizes
Date: Mon, 19 Jan 2015 15:53:36 +0800	[thread overview]
Message-ID: <54BCB800.7050906@cn.fujitsu.com> (raw)
In-Reply-To: <98D897F2-93B8-493B-9281-13A3DC407C5A@gmail.com>


在 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
>


      reply	other threads:[~2015-01-19  7:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=54BCB800.7050906@cn.fujitsu.com \
    --to=fancn.fnst@cn.fujitsu.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=wangshilong1991@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.