diff mbox

btrfs-progs: make btrfs qgroups show human readable sizes

Message ID 1420786025-7361-1-git-send-email-fancn.fnst@cn.fujitsu.com (mailing list archive)
State Superseded
Headers show

Commit Message

Fan Chengniang Jan. 9, 2015, 6:47 a.m. UTC
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.fnst@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(-)

Comments

Christian Robottom Reis Jan. 9, 2015, 1:48 p.m. UTC | #1
On Fri, Jan 09, 2015 at 02:47:05PM +0800, Fan Chengniang wrote:
> make btrfs qgroups show human readable sizes, using -h option, example:

Oh! This is really nice. I wonder, would there be a sane way to show the
actual path the qgroup is associated with as well?
--
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
David Sterba Jan. 9, 2015, 5:58 p.m. UTC | #2
On Fri, Jan 09, 2015 at 11:48:53AM -0200, Christian Robottom Reis wrote:
> On Fri, Jan 09, 2015 at 02:47:05PM +0800, Fan Chengniang wrote:
> > make btrfs qgroups show human readable sizes, using -h option, example:
> 
> Oh! This is really nice. I wonder, would there be a sane way to show the
> actual path the qgroup is associated with as well?

Yes, it's basically what 'btrfs inspect subvolid-resolve 1234 /path'
does. This obviously works only for the 0-level qgroups.
--
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
David Sterba Jan. 9, 2015, 6:03 p.m. UTC | #3
On Fri, Jan 09, 2015 at 02:47:05PM +0800, Fan Chengniang wrote:
> make btrfs qgroups show human readable sizes, using -h option, example:

Thanks.  Please add all the long options from the 'fi df' subcommands as
well. As the subcommand is not entierly space & size oriented, I'd like
to keep the single letter options unallocated for now.

> @@ -80,53 +81,62 @@ static struct {
>  	char *name;
>  	char *column_name;
>  	int need_print;
> +	int human_readable;

Would be better to make it more generic and store the format type
directly, then use it ...

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

... here instead of the switch, something like

	pretty_size_mode(number, btrfs_qgroup_columns[column].format);
--
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
Fan Chengniang Jan. 12, 2015, 3 a.m. UTC | #4
? 2015?01?10? 02:03, David Sterba ??:
> On Fri, Jan 09, 2015 at 02:47:05PM +0800, Fan Chengniang wrote:
>> make btrfs qgroups show human readable sizes, using -h option, example:
> Thanks.  Please add all the long options from the 'fi df' subcommands as
> well. As the subcommand is not entierly space & size oriented, I'd like
> to keep the single letter options unallocated for now.
>
I will use --human to subsititute -h option. Should I add other long 
options like --kbytes --mbytes --gbytes --tbytes --si --iec?
>> @@ -80,53 +81,62 @@ static struct {
>>   	char *name;
>>   	char *column_name;
>>   	int need_print;
>> +	int human_readable;
> Would be better to make it more generic and store the format type
> directly, then use it ...
I will merge need_print and human_readable into one variable.
>> @@ -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);
> ... here instead of the switch, something like
>
> 	pretty_size_mode(number, btrfs_qgroup_columns[column].format);
I wiil try to remove switch.
--
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
diff mbox

Patch

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,