Re: [PATCH] btrfs-progs: Format change for btrfs fi df

2016-01-04 Thread Qu Wenruo

Hi David,

Would you please consider merge this patch?

As current output is already quite confusing for a lot of users who are 
not familiar with btrfs.


Thanks,
Qu

Qu Wenruo wrote on 2015/12/14 13:19 +0800:

The GlobalReserve space in 'btrfs fi df' is always confusing for a lot
of users.
As it is not a special chunk type like DATA or METADATA, it's in fact a
sub-type of METADATA.

So change the output to skip GlobalReserve by default, and adding its
total to metadata used.
And add a new option '-r|--reserve' to show the GlobalReserve, but skip
the profile of GlobalReserve.

Signed-off-by: Qu Wenruo 
---
  Documentation/btrfs-filesystem.asciidoc |  8 ++
  cmds-filesystem.c   | 51 ++---
  2 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/Documentation/btrfs-filesystem.asciidoc 
b/Documentation/btrfs-filesystem.asciidoc
index 31cd51b..510c23f 100644
--- a/Documentation/btrfs-filesystem.asciidoc
+++ b/Documentation/btrfs-filesystem.asciidoc
@@ -22,6 +22,14 @@ Show space usage information for a mount point.
  +
  `Options`
  +
+-r|--reserve
+also show Global Reserve space info.
++
+Global Reserve space is reserved space from metadata. It's reserved for Btrfs
+metadata COW.
++
+It will be counted as 'used' space in metadata space info.
++
  -b|--raw
  raw numbers in bytes, without the 'B' suffix
  -h|--human-readable
diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index 25317fa..26e62e0 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -123,6 +123,8 @@ static const char * const filesystem_cmd_group_usage[] = {
  static const char * const cmd_filesystem_df_usage[] = {
"btrfs filesystem df [options] ",
"Show space usage information for a mount point",
+   "",
+   "-r|--reserve   show global reserve space info"
HELPINFO_UNITS_SHORT_LONG,
NULL
  };
@@ -175,12 +177,32 @@ static int get_df(int fd, struct btrfs_ioctl_space_args 
**sargs_ret)
return 0;
  }

-static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode)
+static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode,
+int show_reserve)
  {
u64 i;
+   u64 global_reserve = 0;
struct btrfs_ioctl_space_info *sp = sargs->spaces;

+   /* First iterate to get global reserve space size */
for (i = 0; i < sargs->total_spaces; i++, sp++) {
+   if (sp->flags & BTRFS_SPACE_INFO_GLOBAL_RSV)
+   global_reserve = sp->total_bytes;
+   }
+
+   for (i = 0, sp = sargs->spaces; i < sargs->total_spaces; i++, sp++) {
+   if (sp->flags & BTRFS_SPACE_INFO_GLOBAL_RSV) {
+   if (!show_reserve)
+   continue;
+   printf(" \\- %s: reserved=%s, used=%s\n",
+   btrfs_group_type_str(sp->flags),
+   pretty_size_mode(sp->total_bytes, unit_mode),
+   pretty_size_mode(sp->used_bytes, unit_mode));
+   continue;
+   }
+
+   if (sp->flags & BTRFS_BLOCK_GROUP_METADATA)
+   sp->used_bytes += global_reserve;
printf("%s, %s: total=%s, used=%s\n",
btrfs_group_type_str(sp->flags),
btrfs_group_profile_str(sp->flags),
@@ -196,14 +218,35 @@ static int cmd_filesystem_df(int argc, char **argv)
int fd;
char *path;
DIR *dirstream = NULL;
+   int show_reserve = 0;
unsigned unit_mode;

unit_mode = get_unit_mode_from_arg(, argv, 1);

-   if (argc != 2 || argv[1][0] == '-')
+   while (1) {
+   int c;
+   static const struct option long_options[] = {
+   { "reserve", no_argument, NULL, 'r'},
+   { NULL, 0, NULL, 0}
+   };
+
+   c = getopt_long(argc, argv, "r", long_options, NULL);
+   if (c < 0)
+   break;
+   switch (c) {
+   case 'r':
+   show_reserve = 1;
+   break;
+   default:
+   usage(cmd_filesystem_df_usage);
+   }
+   }
+
+   argc = argc - optind;
+   if (check_argc_exact(argc, 1))
usage(cmd_filesystem_df_usage);

-   path = argv[1];
+   path = argv[optind];

fd = btrfs_open_dir(path, , 1);
if (fd < 0)
@@ -212,7 +255,7 @@ static int cmd_filesystem_df(int argc, char **argv)
ret = get_df(fd, );

if (ret == 0) {
-   print_df(sargs, unit_mode);
+   print_df(sargs, unit_mode, show_reserve);
free(sargs);
} else {
fprintf(stderr, "ERROR: get_df failed %s\n", strerror(-ret));




--
To unsubscribe from this list: send the line 

[PATCH] btrfs-progs: Format change for btrfs fi df

2015-12-13 Thread Qu Wenruo
The GlobalReserve space in 'btrfs fi df' is always confusing for a lot
of users.
As it is not a special chunk type like DATA or METADATA, it's in fact a
sub-type of METADATA.

So change the output to skip GlobalReserve by default, and adding its
total to metadata used.
And add a new option '-r|--reserve' to show the GlobalReserve, but skip
the profile of GlobalReserve.

Signed-off-by: Qu Wenruo 
---
 Documentation/btrfs-filesystem.asciidoc |  8 ++
 cmds-filesystem.c   | 51 ++---
 2 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/Documentation/btrfs-filesystem.asciidoc 
b/Documentation/btrfs-filesystem.asciidoc
index 31cd51b..510c23f 100644
--- a/Documentation/btrfs-filesystem.asciidoc
+++ b/Documentation/btrfs-filesystem.asciidoc
@@ -22,6 +22,14 @@ Show space usage information for a mount point.
 +
 `Options`
 +
+-r|--reserve
+also show Global Reserve space info.
++
+Global Reserve space is reserved space from metadata. It's reserved for Btrfs
+metadata COW.
++
+It will be counted as 'used' space in metadata space info.
++
 -b|--raw
 raw numbers in bytes, without the 'B' suffix
 -h|--human-readable
diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index 25317fa..26e62e0 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -123,6 +123,8 @@ static const char * const filesystem_cmd_group_usage[] = {
 static const char * const cmd_filesystem_df_usage[] = {
"btrfs filesystem df [options] ",
"Show space usage information for a mount point",
+   "",
+   "-r|--reserve   show global reserve space info"
HELPINFO_UNITS_SHORT_LONG,
NULL
 };
@@ -175,12 +177,32 @@ static int get_df(int fd, struct btrfs_ioctl_space_args 
**sargs_ret)
return 0;
 }
 
-static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode)
+static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode,
+int show_reserve)
 {
u64 i;
+   u64 global_reserve = 0;
struct btrfs_ioctl_space_info *sp = sargs->spaces;
 
+   /* First iterate to get global reserve space size */
for (i = 0; i < sargs->total_spaces; i++, sp++) {
+   if (sp->flags & BTRFS_SPACE_INFO_GLOBAL_RSV)
+   global_reserve = sp->total_bytes;
+   }
+
+   for (i = 0, sp = sargs->spaces; i < sargs->total_spaces; i++, sp++) {
+   if (sp->flags & BTRFS_SPACE_INFO_GLOBAL_RSV) {
+   if (!show_reserve)
+   continue;
+   printf(" \\- %s: reserved=%s, used=%s\n",
+   btrfs_group_type_str(sp->flags),
+   pretty_size_mode(sp->total_bytes, unit_mode),
+   pretty_size_mode(sp->used_bytes, unit_mode));
+   continue;
+   }
+
+   if (sp->flags & BTRFS_BLOCK_GROUP_METADATA)
+   sp->used_bytes += global_reserve;
printf("%s, %s: total=%s, used=%s\n",
btrfs_group_type_str(sp->flags),
btrfs_group_profile_str(sp->flags),
@@ -196,14 +218,35 @@ static int cmd_filesystem_df(int argc, char **argv)
int fd;
char *path;
DIR *dirstream = NULL;
+   int show_reserve = 0;
unsigned unit_mode;
 
unit_mode = get_unit_mode_from_arg(, argv, 1);
 
-   if (argc != 2 || argv[1][0] == '-')
+   while (1) {
+   int c;
+   static const struct option long_options[] = {
+   { "reserve", no_argument, NULL, 'r'},
+   { NULL, 0, NULL, 0}
+   };
+
+   c = getopt_long(argc, argv, "r", long_options, NULL);
+   if (c < 0)
+   break;
+   switch (c) {
+   case 'r':
+   show_reserve = 1;
+   break;
+   default:
+   usage(cmd_filesystem_df_usage);
+   }
+   }
+
+   argc = argc - optind;
+   if (check_argc_exact(argc, 1))
usage(cmd_filesystem_df_usage);
 
-   path = argv[1];
+   path = argv[optind];
 
fd = btrfs_open_dir(path, , 1);
if (fd < 0)
@@ -212,7 +255,7 @@ static int cmd_filesystem_df(int argc, char **argv)
ret = get_df(fd, );
 
if (ret == 0) {
-   print_df(sargs, unit_mode);
+   print_df(sargs, unit_mode, show_reserve);
free(sargs);
} else {
fprintf(stderr, "ERROR: get_df failed %s\n", strerror(-ret));
-- 
2.6.3



--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html