btrfs-progs: Use common function to parse unit arguments
v2 cover btrfs-progs: Use common function to parse unit arguments
We are using separate code for parse unit mode in current code, better to use common function.
This patchset introduce common function to parse arguments for setting
unit: get_unit_mode_from_arg()
and common help message for unit argument, to make every tool in btrfs having same interface for setting unit.
The merit are:
1: Unify current each tool's arguments for unit
2: Make tools in future easy to implement such argument 3: Changes(enhancement) in common function have effect on all
relative tools
Changelog v1->v2:
Keep short options for 'fi df' command, to keeps option compatibility with the standalone 'df' commmand, suggested-by:
David Sterba <[email protected]>
Zhao Lei (4):
btrfs-progs: Introduce get_unit_mode_from_arg for common use
btrfs-progs: Use common unit parser for btrfs filesystem command
btrfs-progs: Use common unit parser for btrfs device command
btrfs-progs: Use common unit parser for btrfs qgroup command
cmds-device.c | 74 ++++----------------------------- cmds-fi-usage.c | 79 ++++------------------------------- cmds-filesystem.c | 121 ++++++------------------------------------------------ cmds-qgroup.c | 47 ++------------------- utils.c | 102 +++++++++++++++++++++++++++++++++++++++++++++ utils.h | 24 +++++++++++ 6 files changed, 156 insertions(+), 291 deletions(-)
Signature · 1 line
1.8.5.1
PATCH v2 1/4 btrfs-progs: Introduce get_unit_mode_from_arg for common use
We are using separate code for parse unit mode in current code, better to use common function.
This patch introduce common function for to arguments for setting unit, and a common help message, to make every tool in btrfs having same unit argument.
The merit are:
1: Unify current each tool's arguments for unit
2: Make tools in future easy to implement such argument 3: Changes(enhancement) in common function have effect on all
relative tools
Changelog v1->v2:
Keep short options for 'fi df' command, to keeps option compatibility with the standalone 'df' commmand, suggested-by:
David Sterba <[email protected]>
--- utils.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 24 +++++++++++++++ 2 files changed, 126 insertions(+)
utils.c +102 -0
@@ -2950,3 +2950,105 @@ int arg_copy_path(char *dest, const char *src, int destlen)return 0 ; } + +unsigned int get_unit_mode_from_arg (int *argc,char *argv[],int df_mode) +{ +unsigned int unit_mode =UNITS_DEFAULT ; +int arg_i; +int arg_end; + +for (arg_i =0 ; arg_i < *argc; arg_i++) { +if (!strcmp (argv[arg_i],"--raw" )) { + unit_mode =UNITS_RAW ; + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"--human-readable" )) { + unit_mode =UNITS_HUMAN_BINARY ; + argv[arg_i] =NULL ; +continue ; + } + +if (!strcmp (argv[arg_i],"--iec" )) { +units_set_mode (&unit_mode,UNITS_BINARY ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"--si" )) { +units_set_mode (&unit_mode,UNITS_DECIMAL ); + argv[arg_i] =NULL ; +continue ; + } + +if (!strcmp (argv[arg_i],"--kbytes" )) { +units_set_base (&unit_mode,UNITS_KBYTES ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"--mbytes" )) { +units_set_base (&unit_mode,UNITS_MBYTES ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"--gbytes" )) { +units_set_base (&unit_mode,UNITS_GBYTES ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"--tbytes" )) { +units_set_base (&unit_mode,UNITS_TBYTES ); + argv[arg_i] =NULL ; +continue ; + } + +if (!df_mode) +continue ; + +if (!strcmp (argv[arg_i],"-b" )) { + unit_mode =UNITS_RAW ; + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"-h" )) { + unit_mode =UNITS_HUMAN_BINARY ; + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"-H" )) { + unit_mode =UNITS_HUMAN_DECIMAL ; + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"-k" )) { +units_set_base (&unit_mode,UNITS_KBYTES ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"-m" )) { +units_set_base (&unit_mode,UNITS_MBYTES ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"-g" )) { +units_set_base (&unit_mode,UNITS_GBYTES ); + argv[arg_i] =NULL ; +continue ; + } +if (!strcmp (argv[arg_i],"-t" )) { +units_set_base (&unit_mode,UNITS_TBYTES ); + argv[arg_i] =NULL ; +continue ; + } + } + +for (arg_i =0 , arg_end =0 ; arg_i < *argc; arg_i++) { +if (!argv[arg_i]) +continue ; + argv[arg_end] = argv[arg_i]; + arg_end++; + } + + *argc = arg_end; + +return unit_mode; +}
utils.h +24 -0
@@ -245,4 +245,28 @@ int btrfs_check_nodesize(u32 nodesize, u32 sectorsize);const char *get_argv0_buf (void ); +#define HELPINFO_OUTPUT_UNIT \ + "--raw raw numbers in bytes", \ + "--human-readable human friendly numbers, base 1024 (default)", \ + "--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" + +#define HELPINFO_OUTPUT_UNIT_DF \ + "-b|--raw raw numbers in bytes", \ + "-h|--human-readable", \ + " 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" + +unsigned int get_unit_mode_from_arg (int *argc,char *argv[],int df_mode); +#endif
Signature · 1 line
1.8.5.1
PATCH v2 2/4 btrfs-progs: Use common unit parser for btrfs filesystem command
In reply to Zhao LeiMove to use get_unit_mode_from_arg() for cmds-filesystem.c, to make "btrfs filesystem df/show/usage"'s unit argument same.
Also have cleanup effect: 19 insertions(+), 181 deletions(-)
--- cmds-fi-usage.c | 79 ++++------------------------------- cmds-filesystem.c | 121 ++++++------------------------------------------------ 2 files changed, 19 insertions(+), 181 deletions(-)
cmds-fi-usage.c +7 -72
@@ -859,88 +859,23 @@ out:const char *const cmd_filesystem_usage_usage[] = {"btrfs filesystem usage [options] <path> [<path>..]" ,"Show detailed information about internal filesystem usage ." , -"-b|--raw raw numbers in bytes" , -"-h|--human-readable" , -" 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" , -"-T show data in tabular format" , +HELPINFO_OUTPUT_UNIT ,NULL };int cmd_filesystem_usage (int argc,char **argv) { -unsigned unit_mode =UNITS_DEFAULT ; +unsigned unit_mode;int ret =0 ; -int i, more_than_one =0 ; -int tabular =0 ; +int i, more_than_one =0 ; +int tabular =0 ; - optind =1 ; -while (1 ) { -int c; -static const struct option long_options[] = { - {"raw" , no_argument,NULL ,'b' }, - {"kbytes" , no_argument,NULL ,'k' }, - {"mbytes" , no_argument,NULL ,'m' }, - {"gbytes" , no_argument,NULL ,'g' }, - {"tbytes" , no_argument,NULL ,'t' }, - {"si" , no_argument,NULL ,GETOPT_VAL_SI }, - {"iec" , no_argument,NULL ,GETOPT_VAL_IEC }, - {"human-readable" , no_argument,NULL , -GETOPT_VAL_HUMAN_READABLE }, - {NULL ,0 ,NULL ,0 } - }; - - c =getopt_long (argc, argv,"bhHkmgtT" , long_options,NULL ); - -if (c <0 ) -break ; -switch (c) { -case 'b' : - unit_mode =UNITS_RAW ; -break ; -case 'k' : -units_set_base (&unit_mode,UNITS_KBYTES ); -break ; -case 'm' : -units_set_base (&unit_mode,UNITS_MBYTES ); -break ; -case 'g' : -units_set_base (&unit_mode,UNITS_GBYTES ); -break ; -case 't' : -units_set_base (&unit_mode,UNITS_TBYTES ); -break ; -case GETOPT_VAL_HUMAN_READABLE : -case 'h' : - unit_mode =UNITS_HUMAN_BINARY ; -break ; -case 'H' : - unit_mode =UNITS_HUMAN_DECIMAL ; -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 'T' : - tabular =1 ; -break ; -default : -usage (cmd_filesystem_usage_usage); - } - } + unit_mode =get_unit_mode_from_arg (&argc, argv,0 ); -if (check_argc_min (argc - optind,1 )) +if (check_argc_min (argc,2 ) || argv[1 ][0 ] =='-' )usage (cmd_filesystem_usage_usage); -for (i = optind; i < argc; i++) { +for (i =1 ; i < argc; i++) {int fd;DIR *dirstream =NULL ;struct chunk_info *chunkinfo =NULL ;
cmds-filesystem.c +12 -109
162 lines not on this page · raw message
Signature · 1 line
1.8.5.1
Re: [PATCH v2 2/4] btrfs-progs: Use common unit parser for btrfs filesystem command
Quoted 5 lines · Zhao Lei
cmds-fi-usage.c +0
-1@@ -859,88 +859,23 @@ out:const char *const cmd_filesystem_usage_usage[] = {"btrfs filesystem usage [options] <path> [<path>..]" ,"Show detailed information about internal filesystem usage ." , -"-b|--raw raw numbers in bytes" ,
cmds-fi-usage.c out: · line 872
Quoted 10 lines
cmds-fi-usage.c +0
-10-"-h|--human-readable" , -" 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" , - "-T show data in tabular format",
You're removing too much, -T must stay. Due to that, the whole getopt loop must stay as well. Please update this patch, the rest from the series is applied.
Quoted 1 line
(quoted diff) +1
-0+ HELPINFO_OUTPUT_UNIT,
PATCH v2 3/4 btrfs-progs: Use common unit parser for btrfs device command
In reply to Zhao LeiMove to use get_unit_mode_from_arg() for cmds-device.c, to make "btrfs device usage"'s unit argument same with other tools.
--- cmds-device.c | 74 ++++++----------------------------------------------------- 1 file changed, 7 insertions(+), 67 deletions(-)
cmds-device.c +7 -67
@@ -474,16 +474,7 @@ out:const char *const cmd_device_usage_usage[] = {"btrfs device usage [options] <path> [<path>..]" ,"Show detailed information about internal allocations in devices." , -"-b|--raw raw numbers in bytes" , -"-h|--human-readable" , -" 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" , +HELPINFO_OUTPUT_UNIT ,NULL };
@@ -518,69 +509,18 @@ out:int cmd_device_usage (int argc,char **argv) { -unsigned unit_mode =UNITS_DEFAULT ; +unsigned unit_mode;int ret =0 ; -int i, more_than_one =0 ; +int i, more_than_one =0 ; - optind =1 ; -while (1 ) { -int c; -static const struct option long_options[] = { - {"raw" , no_argument,NULL ,'b' }, - {"kbytes" , no_argument,NULL ,'k' }, - {"mbytes" , no_argument,NULL ,'m' }, - {"gbytes" , no_argument,NULL ,'g' }, - {"tbytes" , no_argument,NULL ,'t' }, - {"si" , no_argument,NULL ,GETOPT_VAL_SI }, - {"iec" , no_argument,NULL ,GETOPT_VAL_IEC }, - {"human-readable" , no_argument,NULL , -GETOPT_VAL_HUMAN_READABLE }, - {NULL ,0 ,NULL ,0 } - }; - - c =getopt_long (argc, argv,"bhHkmgt" , long_options,NULL ); -if (c <0 ) -break ; -switch (c) { -case 'b' : - unit_mode =UNITS_RAW ; -break ; -case 'k' : -units_set_base (&unit_mode,UNITS_KBYTES ); -break ; -case 'm' : -units_set_base (&unit_mode,UNITS_MBYTES ); -break ; -case 'g' : -units_set_base (&unit_mode,UNITS_GBYTES ); -break ; -case 't' : -units_set_base (&unit_mode,UNITS_TBYTES ); -break ; -case GETOPT_VAL_HUMAN_READABLE : -case 'h' : - unit_mode =UNITS_HUMAN_BINARY ; -break ; -case 'H' : - unit_mode =UNITS_HUMAN_DECIMAL ; -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 ; -default : -usage (cmd_device_usage_usage); - } - } + unit_mode =get_unit_mode_from_arg (&argc, argv,0 ); -if (check_argc_min (argc - optind,1 )) +if (check_argc_min (argc,2 ) || argv[1 ][0 ] =='-' )usage (cmd_device_usage_usage); -for (i = optind; i < argc ; i++) { +for (i =1 ; i < argc; i++) {int fd; -DIR *dirstream =NULL ; +DIR *dirstream =NULL ;if (more_than_one)printf ("\n" );
Signature · 1 line
1.8.5.1
PATCH v2 4/4 btrfs-progs: Use common unit parser for btrfs qgroup command
In reply to Zhao LeiMove to use get_unit_mode_from_arg() for btrfs qgroup command, to make "btrfs qgroup show"'s unit argument same with other tools.
--- cmds-qgroup.c | 47 ++++------------------------------------------- 1 file changed, 4 insertions(+), 43 deletions(-)
cmds-qgroup.c +4 -43
@@ -275,15 +275,7 @@ static const char * const cmd_qgroup_show_usage[] = {" (including ancestral qgroups)" ,"-f list all qgroups which impact the given path" ," (excluding ancestral qgroups)" , -"--raw raw numbers in bytes" , -"--human-readable" , -" human firendly numbers in given base, 1024 by default" , -"--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" , +HELPINFO_OUTPUT_UNIT ,"--sort=qgroupid,rfer,excl,max_rfer,max_excl" ," list qgroups sorted by specified items" , " you can use '+' or '-' in front of each item.",
@@ -300,27 +292,20 @@ static int cmd_qgroup_show(int argc, char **argv)DIR *dirstream =NULL ;u64 qgroupid;int filter_flag =0 ; -unsigned unit_mode =UNITS_DEFAULT ; +unsigned unit_mode;struct btrfs_qgroup_comparer_set *comparer_set;struct btrfs_qgroup_filter_set *filter_set; filter_set =btrfs_qgroup_alloc_filter_set (); comparer_set =btrfs_qgroup_alloc_comparer_set (); + unit_mode =get_unit_mode_from_arg (&argc, argv,0 ); + optind =1 ;while (1 ) {int c;static const struct option long_options[] = { {"sort" , required_argument,NULL ,'S' }, - {"raw" , no_argument,NULL ,GETOPT_VAL_RAW }, - {"kbytes" , no_argument,NULL ,GETOPT_VAL_KBYTES }, - {"mbytes" , no_argument,NULL ,GETOPT_VAL_MBYTES }, - {"gbytes" , no_argument,NULL ,GETOPT_VAL_GBYTES }, - {"tbytes" , no_argument,NULL ,GETOPT_VAL_TBYTES }, - {"si" , no_argument,NULL ,GETOPT_VAL_SI }, - {"iec" , no_argument,NULL ,GETOPT_VAL_IEC }, - {"human-readable" , no_argument,NULL , -GETOPT_VAL_HUMAN_READABLE }, {NULL ,0 ,NULL ,0 } };
@@ -356,30 +341,6 @@ static int cmd_qgroup_show(int argc, char **argv)if (ret)usage (cmd_qgroup_show_usage);break ; -case GETOPT_VAL_RAW : - unit_mode =UNITS_RAW ; -break ; -case GETOPT_VAL_KBYTES : -units_set_base (&unit_mode,UNITS_KBYTES ); -break ; -case GETOPT_VAL_MBYTES : -units_set_base (&unit_mode,UNITS_MBYTES ); -break ; -case GETOPT_VAL_GBYTES : -units_set_base (&unit_mode,UNITS_GBYTES ); -break ; -case GETOPT_VAL_TBYTES : -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 GETOPT_VAL_HUMAN_READABLE : - unit_mode =UNITS_HUMAN_BINARY ; -break ;default :usage (cmd_qgroup_show_usage); }
Signature · 1 line
1.8.5.1
Quoted 5 lines · Zhao Lei
Zhao Lei (4):
btrfs-progs: Introduceget_unit_mode_from_argfor common use
btrfs-progs: Use common unit parser for btrfs filesystem command
btrfs-progs: Use common unit parser for btrfs device command
btrfs-progs: Use common unit parser for btrfs qgroup command
Patches 1, 3 and 4 are applied, 2 needs an update. Thanks.