[PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

Subsystems: documentation, the rest

STALE4292d

10 messages, 6 authors, 2015-01-15 · open the first message on its own page

[PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: Fan Chengniang <hidden>
Date: 2015-01-13 05:55:09

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

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: David Sterba <hidden>
Date: 2015-01-14 15:46:35

On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
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
The values should be also aligned to the right.

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: Roman Mamedov <hidden>
Date: 2015-01-14 18:20:32

On Wed, 14 Jan 2015 16:46:33 +0100
David Sterba [off-list ref] wrote:
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
FWIW both of the GNU coreutils "df" and "ls" use the "-h, --human-readable"
combination of options. Also the human-readable sizes are not the default format with those.
Why not follow the rule of the least surprise and just adopt the same behavior?

-- 
With respect,
Roman

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: Qu Wenruo <hidden>
Date: 2015-01-15 01:01:40

-------- Original Message --------
Subject: Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes
From: David Sterba <redacted>
To: Fan Chengniang <redacted>
Date: 2015年01月14日 23:46
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type
It's completely OK to make the option shorter and make it consistent with other parts,
(BTW, fi df uses -h, no long option, why not keey consistent with it?)
but IMHO, isn't the bash-completion script a better solution for all the btrfs subcommands and options length?

Complicated commands like git have a quite good bash-completion script, and with it
option length is never a problem (except some case in git config, where some options can't be completed).

Thanks,
Qu
and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
quoted
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
The values should be also aligned to the right.
--
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

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: Fan Chengniang/樊成酿 <hidden>
Date: 2015-01-15 01:17:56

在 2015年01月14日 23:46, David Sterba 写道:
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
I have sent a mail for your advise of adding options. In that mail, I asked whether I should use --human-readable and add --kbytes --mbytes ...
But you have not reply to me.
So, your advise is add --kbytes --mbytes ... and make human-readable default behaviour?
quoted
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
The values should be also aligned to the right.
It is aligned to left before my patch. I just keep it.

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: David Sterba <hidden>
Date: 2015-01-15 12:02:05

On Wed, Jan 14, 2015 at 11:20:29PM +0500, Roman Mamedov wrote:
On Wed, 14 Jan 2015 16:46:33 +0100
David Sterba [off-list ref] wrote:
quoted
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
FWIW both of the GNU coreutils "df" and "ls" use the "-h, --human-readable"
combination of options. Also the human-readable sizes are not the default format with those.
Why not follow the rule of the least surprise and just adopt the same behavior?
I was not aware of the existing long option, makes sense to add them as
an alias of -h/-H.

I'm not sure what to do about the default output. 'ls' prints raw bytes,
'df' prints a raw number that's in Kilobytes, without a suffix. To
follow principle of least surprise in the context of btrfs-progs is to
print the human readable by default, like 'fi df/show' has been doing.

My rationale behind the default is to give a quick overview to user, I
type 'df -h' all the time and haven't used a plain 'df' since long. The
ability to quickly recognize and comprehend numbers goes down after 5-6
digits, while the numbers + largest suffix are within that limit.

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: David Sterba <hidden>
Date: 2015-01-15 12:05:48

On Thu, Jan 15, 2015 at 09:01:37AM +0800, Qu Wenruo wrote:
quoted
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type
It's completely OK to make the option shorter and make it consistent 
with other parts,
(BTW, fi df uses -h, no long option, why not keey consistent with it?)
I'm for adding the --human-readable variants where applicable.
but IMHO, isn't the bash-completion script a better solution for all the 
btrfs subcommands and options length?

Complicated commands like git have a quite good bash-completion script, 
and with it
option length is never a problem (except some case in git config, where 
some options can't be completed).
A shell completion would be great of course, it's in the project ideas.
There's a starting point http://www.spinics.net/lists/linux-btrfs/msg15899.html .

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: David Sterba <hidden>
Date: 2015-01-15 12:30:05

On Thu, Jan 15, 2015 at 09:17:01AM +0800, Fan Chengniang/樊成酿 wrote:
在 2015年01月14日 23:46, David Sterba 写道:
quoted
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
I have sent a mail for your advise of adding options. In that mail, I 
asked whether I should use --human-readable and add --kbytes --mbytes ...
But you have not reply to me.
So you've sent a v2 where we can see if our ideas match or not and
continue from there. Timely replies are not always feasible, I get a lot
of mails. Patch iterations are normal, nothing new here.
So, your advise is add --kbytes --mbytes ... and make human-readable 
default behaviour?
quoted
quoted
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
The values should be also aligned to the right.
It is aligned to left before my patch. I just keep it.
Ok, take it as a hint for another patch.

Re: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: 樊成酿 <hidden>
Date: 2015-01-15 13:56:06

在 2015年01月15日 20:30, David Sterba 写道:
On Thu, Jan 15, 2015 at 09:17:01AM +0800, Fan Chengniang/樊成酿 wrote:
quoted
在 2015年01月14日 23:46, David Sterba 写道:
quoted
On Tue, Jan 13, 2015 at 01:53:39PM +0800, Fan Chengniang wrote:
quoted
make btrfs qgroups show human readable sizes
using --human-readable option, example:
That's too long to type and the idea was to add all the long options
that force the specific unit base, ie. --kbytes/--mbytes/..., --raw,
--si and --iec. We can possibly make the human readable the default
because that's what I'd expect to see to have a quick overview and can
use the other options otherwise.

The geopt parser accepts short options if they're unique, so --kb or
even --k works as a very convenient shorcut for frequent commandline
use.
I have sent a mail for your advise of adding options. In that mail, I
asked whether I should use --human-readable and add --kbytes --mbytes ...
But you have not reply to me.
So you've sent a v2 where we can see if our ideas match or not and
continue from there. Timely replies are not always feasible, I get a lot
of mails. Patch iterations are normal, nothing new here.
Sorry to you because of my words. I didn't consider you have a lot of mails. I will take your advice and improve my patch.
This is my personal mail address.
quoted
So, your advise is add --kbytes --mbytes ... and make human-readable
default behaviour?
quoted
quoted
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
The values should be also aligned to the right.
It is aligned to left before my patch. I just keep it.
Ok, take it as a hint for another patch.
I have combined them to one patch. Maybe I should seperate them.
--
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

btrfs command completion Was: [PATCH v2 RESEND] btrfs-progs: make btrfs qgroups show human readable sizes

From: Duncan <hidden>
Date: 2015-01-15 20:41:48

David Sterba posted on Thu, 15 Jan 2015 13:05:46 +0100 as excerpted:
A shell completion would be great of course, it's in the project ideas.
There's a starting point
http://www.spinics.net/lists/linux-btrfs/msg15899.html .
FWIW, in case anyone is interested...

What I did here is a bit different; shell completion would be better, but 
while I know bash, I don't know bash/shell completion so I couldn't write 
that without learning it.

What I did is a btrfs wrapper script (which I simply called 'b', a 
previously here-unused single letter command) that based on the first 
parameter or two and the number of parameters, decides if what's there 
matches a valid btrfs subcommand and whether it looks complete or not, 
and if it's valid but incomplete, echoes the appropriate btrfs <sub> help 
command and prompts for more input.

So just 'b' gives me:

------------------------------------------------------------
b: btrfs helper (common commands only)
------------------------------------------------------------
btrfs cmd (Just Enter for help):
b(alance) c(heck) d(ev) f(ilesystem) i(nspect) p(roperty)
qg(roup) qu(ota) rec(eive) rep(lace) resc(ue) rest(ore)
sc(rub) se(nd) su(bvolume) v(ersion):

There it waits for further input.

If I then add an 'f', or if I had typed 'b f' (or 'b fi' or
'b filesystem', the script checks status of btrfs <cmd> --help to see if 
it's valid or not), I get this:

f
------------------------------------------------------------
btrfs filesystem action (Just Enter for help):
de(frag) df l(abel) r(esize) sh(ow) sy(nc) u(sage):

Further input.

If I then add 'df' (or if I had typed 'b fi df'), I get:

df
------------------------------------------------------------
usage: btrfs filesystem df [options] <path>

    Show space usage information for a mount point

    -b|--raw           raw numbers in bytes
    -h                 human friendly numbers, base 1024 (default)
    -H                 human friendly numbers, base 1000
    --iec              use 1024 as a base (KiB, MiB, GiB, TiB)
    --si               use 1000 as a base (kB, MB, GB, TB)
    -k|--kbytes        show sizes in KiB, or kB with --si
    -m|--mbytes        show sizes in MiB, or MB with --si
    -g|--gbytes        show sizes in GiB, or GB with --si
    -t|--tbytes        show sizes in TiB, or TB with --si

------------------------------------------------------------
btrfs filesystem df usage is printed above.
Please enter additional parameters here:

Further input.

At this point it doesn't check further input, instead simply echoing back 
what will be the final command and prompting whether to run it or not.  
If I simply type '/'...

/
------------------------------------------------------------
btrfs filesystem df /
Final check: OK to run above command (y/N)?


Note the default to N...

If at that point I simply enter (or if I hit anything else besides y/Y), 
of course it doesn't run the command, it simply exits.  However, the 
built command was printed above, making it simple enough to select/paste 
(assuming gpm or a terminal window in X, thus mouse selection).

If I hit 'y', it executes the command.

Meanwhile, if there's more than two parameters and the first two 
validate, the script assumes the user knows what they are doing and 
simply executes it as-is.

b fi df /
------------------------------------------------------------
b: btrfs helper (common commands only)
------------------------------------------------------------
Data, RAID1: total=3.00GiB, used=1.74GiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=768.00MiB, used=299.89MiB
GlobalReserve, single: total=48.00MiB, used=0.00B

b fi df invalid
------------------------------------------------------------
b: btrfs helper (common commands only)
------------------------------------------------------------
ERROR: can't access 'invalid'

b fxxx df /

This one's interesting.  The script checks the status of
btrfs fxxx --help and determines that btrfs doesn't consider the fxxx 
valid, so it simply prints the full btrfs --help output, running it thru 
$PAGER (if unset, less if it's executable, else no pager) due to length.


Anyone interested in a script such as this?  Absent a bash completion 
script, I found it /tremendously/ helpful with btrfs command basics, and 
because it prompts with the final command before execution, it helps in 
learning the commands as well.  I still use it for commands I don't use 
frequently enough to have memorized.  While it's a bit of a hack, thus my 
not posting it previously, if anyone else would find such a script 
useful, I could post it.

I don't have hosting for it but I suppose it could go on the wiki if 
enough other folks find it useful.  It's 125 lines including comments ATM.

-- 
Duncan - List replies preferred.   No HTML msgs.
"Every nonfree program has a lord, a master --
and if you use the program, he is your master."  Richard Stallman
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help