linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes
@ 2015-01-13  5:53 Fan Chengniang
  2015-01-14 15:46 ` David Sterba
  0 siblings, 1 reply; 10+ messages in thread
From: Fan Chengniang @ 2015-01-13  5:53 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Fan Chengniang

make btrfs qgroups show human readable sizes
using --human-readable 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>
---
v2:
- change -h option to --human-readable
- merge need_print and human_readable into format
- add print_group_size function

 Documentation/btrfs-qgroup.txt |  2 ++
 cmds-qgroup.c                  | 10 +++++-
 qgroup.c                       | 69 ++++++++++++++++++++++++++++--------------
 qgroup.h                       |  1 +
 4 files changed, 58 insertions(+), 24 deletions(-)

diff --git a/Documentation/btrfs-qgroup.txt b/Documentation/btrfs-qgroup.txt
index 3e13373..d8ed028 100644
--- a/Documentation/btrfs-qgroup.txt
+++ b/Documentation/btrfs-qgroup.txt
@@ -73,6 +73,8 @@ 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)
+--human-readable::::
+print sizes in human readable format (e.g., 1KiB 234MiB 2GiB).
 --sort=[\+/-]<attr>[,[+/-]<attr>]...::::
 list qgroups in order of <attr>.
 +
diff --git a/cmds-qgroup.c b/cmds-qgroup.c
index 957fbc9..ba6f19b 100644
--- a/cmds-qgroup.c
+++ b/cmds-qgroup.c
@@ -216,6 +216,8 @@ static const char * const cmd_qgroup_show_usage[] = {
 	"(include ancestral qgroups)",
 	"-f		list all qgroups which impact the given path"
 	"(exclude ancestral qgroups)",
+	"--human-readable",
+	"		print sizes in human readable format (e.g., 1KiB 234MiB 2GiB)",
 	"--sort=qgroupid,rfer,excl,max_rfer,max_excl",
 	"		list qgroups in order of qgroupid,"
 	"rfer,max_rfer or max_excl",
@@ -234,6 +236,7 @@ static int cmd_qgroup_show(int argc, char **argv)
 	int c;
 	u64 qgroupid;
 	int filter_flag = 0;
+	int option_index = 0;
 
 	struct btrfs_qgroup_comparer_set *comparer_set;
 	struct btrfs_qgroup_filter_set *filter_set;
@@ -241,16 +244,21 @@ static int cmd_qgroup_show(int argc, char **argv)
 	comparer_set = btrfs_qgroup_alloc_comparer_set();
 	struct option long_options[] = {
 		{"sort", 1, NULL, 'S'},
+		{"human-readable", 0, NULL, 0},
 		{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)
+				btrfs_qgroup_setup_human_readable();
+			break;
 		case 'p':
 			btrfs_qgroup_setup_print_column(
 				BTRFS_QGROUP_PARENT);
diff --git a/qgroup.c b/qgroup.c
index 1a4866c..ce87fe4 100644
--- a/qgroup.c
+++ b/qgroup.c
@@ -20,10 +20,14 @@
 #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)
 
+#define BTRFS_QGROUP_FORMAT_PRINT 1
+#define BTRFS_QGROUP_FORMAT_HUMAN (1U << 1)
+
 struct qgroup_lookup {
 	struct rb_root root;
 };
@@ -79,54 +83,54 @@ struct btrfs_qgroup_list {
 static struct {
 	char *name;
 	char *column_name;
-	int need_print;
+	unsigned int format;
 	int max_len;
 } btrfs_qgroup_columns[] = {
 	{
 		.name		= "qgroupid",
 		.column_name	= "Qgroupid",
-		.need_print	= 1,
+		.format		= BTRFS_QGROUP_FORMAT_PRINT,
 		.max_len	= 8,
 	},
 	{
 		.name		= "rfer",
 		.column_name	= "Rfer",
-		.need_print	= 1,
-		.max_len	= 4,
+		.format		= BTRFS_QGROUP_FORMAT_PRINT,
+		.max_len	= 12,
 	},
 	{
 		.name		= "excl",
 		.column_name	= "Excl",
-		.need_print	= 1,
-		.max_len	= 4,
+		.format		= BTRFS_QGROUP_FORMAT_PRINT,
+		.max_len	= 12,
 	},
 	{	.name		= "max_rfer",
 		.column_name	= "Max_rfer",
-		.need_print	= 0,
-		.max_len	= 8,
+		.format		= 0,
+		.max_len	= 12,
 	},
 	{
 		.name		= "max_excl",
 		.column_name	= "Max_excl",
-		.need_print	= 0,
-		.max_len	= 8,
+		.format		= 0,
+		.max_len	= 12,
 	},
 	{
 		.name		= "parent",
 		.column_name	= "Parent",
-		.need_print	= 0,
+		.format		= 0,
 		.max_len	= 7,
 	},
 	{
 		.name		= "child",
 		.column_name	= "Child",
-		.need_print	= 0,
+		.format		= 0,
 		.max_len	= 5,
 	},
 	{
 		.name		= NULL,
 		.column_name	= NULL,
-		.need_print	= 0,
+		.format		= 0,
 	},
 };
 
@@ -140,11 +144,19 @@ void btrfs_qgroup_setup_print_column(enum btrfs_qgroup_column_enum column)
 	BUG_ON(column < 0 || column > BTRFS_QGROUP_ALL);
 
 	if (column < BTRFS_QGROUP_ALL) {
-		btrfs_qgroup_columns[column].need_print = 1;
+		btrfs_qgroup_columns[column].format |= BTRFS_QGROUP_FORMAT_PRINT;
 		return;
 	}
 	for (i = 0; i < BTRFS_QGROUP_ALL; i++)
-		btrfs_qgroup_columns[i].need_print = 1;
+		btrfs_qgroup_columns[i].format |= BTRFS_QGROUP_FORMAT_PRINT;
+}
+
+void btrfs_qgroup_setup_human_readable(void)
+{
+	btrfs_qgroup_columns[BTRFS_QGROUP_RFER].format |= BTRFS_QGROUP_FORMAT_HUMAN;
+	btrfs_qgroup_columns[BTRFS_QGROUP_EXCL].format |= BTRFS_QGROUP_FORMAT_HUMAN;
+	btrfs_qgroup_columns[BTRFS_QGROUP_MAX_RFER].format |= BTRFS_QGROUP_FORMAT_HUMAN;
+	btrfs_qgroup_columns[BTRFS_QGROUP_MAX_EXCL].format |= BTRFS_QGROUP_FORMAT_HUMAN;
 }
 
 static int print_parent_column(struct btrfs_qgroup *qgroup)
@@ -189,6 +201,17 @@ static void print_qgroup_column_add_blank(enum btrfs_qgroup_column_enum column,
 		printf(" ");
 }
 
+static int print_qgroup_size(u64 size, unsigned int format)
+{
+	int len;
+	if (format & BTRFS_QGROUP_FORMAT_HUMAN)
+		len = printf("%s", pretty_size(size));
+	else
+		len = printf("%llu", size);
+
+	return len;
+}
+
 static void print_qgroup_column(struct btrfs_qgroup *qgroup,
 				enum btrfs_qgroup_column_enum column)
 {
@@ -203,11 +226,11 @@ 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);
+		len = print_qgroup_size(qgroup->rfer, btrfs_qgroup_columns[column].format);
 		print_qgroup_column_add_blank(BTRFS_QGROUP_RFER, len);
 		break;
 	case BTRFS_QGROUP_EXCL:
-		len = printf("%llu", qgroup->excl);
+		len = print_qgroup_size(qgroup->excl, btrfs_qgroup_columns[column].format);
 		print_qgroup_column_add_blank(BTRFS_QGROUP_EXCL, len);
 		break;
 	case BTRFS_QGROUP_PARENT:
@@ -215,11 +238,11 @@ 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);
+		len = print_qgroup_size(qgroup->max_rfer, btrfs_qgroup_columns[column].format);
 		print_qgroup_column_add_blank(BTRFS_QGROUP_MAX_RFER, len);
 		break;
 	case BTRFS_QGROUP_MAX_EXCL:
-		len = printf("%llu", qgroup->max_excl);
+		len = print_qgroup_size(qgroup->max_excl, btrfs_qgroup_columns[column].format);
 		print_qgroup_column_add_blank(BTRFS_QGROUP_MAX_EXCL, len);
 		break;
 	case BTRFS_QGROUP_CHILD:
@@ -236,7 +259,7 @@ static void print_single_qgroup_table(struct btrfs_qgroup *qgroup)
 	int i;
 
 	for (i = 0; i < BTRFS_QGROUP_ALL; i++) {
-		if (!btrfs_qgroup_columns[i].need_print)
+		if (!(btrfs_qgroup_columns[i].format & BTRFS_QGROUP_FORMAT_PRINT))
 			continue;
 		print_qgroup_column(qgroup, i);
 
@@ -252,7 +275,7 @@ static void print_table_head()
 	int len;
 
 	for (i = 0; i < BTRFS_QGROUP_ALL; i++) {
-		if (!btrfs_qgroup_columns[i].need_print)
+		if (!(btrfs_qgroup_columns[i].format & BTRFS_QGROUP_FORMAT_PRINT))
 			continue;
 		printf("%s", btrfs_qgroup_columns[i].name);
 		len = btrfs_qgroup_columns[i].max_len -
@@ -263,7 +286,7 @@ static void print_table_head()
 	}
 	printf("\n");
 	for (i = 0; i < BTRFS_QGROUP_ALL; i++) {
-		if (!btrfs_qgroup_columns[i].need_print)
+		if (!(btrfs_qgroup_columns[i].format & BTRFS_QGROUP_FORMAT_PRINT))
 			continue;
 
 		len = strlen(btrfs_qgroup_columns[i].name);
@@ -957,7 +980,7 @@ static void update_columns_max_len(struct btrfs_qgroup *bq)
 	int i;
 
 	for (i = 0; i < BTRFS_QGROUP_ALL; i++) {
-		if (!btrfs_qgroup_columns[i].need_print)
+		if (!(btrfs_qgroup_columns[i].format & BTRFS_QGROUP_FORMAT_PRINT))
 			continue;
 		__update_columns_max_len(bq, i);
 	}
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,
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2015-01-15 20:41 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-13  5:53 [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes Fan Chengniang
2015-01-14 15:46 ` David Sterba
2015-01-14 18:20   ` Roman Mamedov
2015-01-15 12:02     ` David Sterba
2015-01-15  1:01   ` Qu Wenruo
2015-01-15 12:05     ` David Sterba
2015-01-15 20:41       ` btrfs command completion Was: " Duncan
2015-01-15  1:17   ` Fan Chengniang/樊成酿
2015-01-15 12:30     ` David Sterba
2015-01-15 13:50       ` 樊成酿

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).