@@ -40,13 +40,19 @@ def parse_args():
4040    parser  =  argparse .ArgumentParser ()
4141    parser .add_argument (
4242        '--usage' ,
43+         '-u' ,
4344        action = "store_true" ,
4445        help = "Print device blockgroup usage" ,
4546    )
4647    parser .add_argument (
4748        'mountpoint' ,
4849        help = "Btrfs filesystem mountpoint" ,
4950    )
51+     parser .add_argument (
52+         'device' ,
53+         nargs = '*' ,
54+         help = "Only use specific devices (default include all)" ,
55+     )
5056    return  parser .parse_args ()
5157
5258
@@ -60,9 +66,17 @@ def safe_get_block_group(t):
6066
6167def  report_usage (args ):
6268    with  btrfs .FileSystem (args .mountpoint ) as  fs :
69+         fs_chunks  =  list (fs .chunks ())
70+ 
6371        devices  =  fs .devices ()
6472        devids  =  [d .devid  for  d  in  devices ]
65-         fs_chunks  =  list (fs .chunks ())
73+         if  args .device :
74+             dev_infos  =  [fs .dev_info (id ) for  id  in  devids ]
75+             selected_devids  =  []
76+             for  dev  in  dev_infos :
77+                 if  any (d  in  (dev .path , dev .devid ) for  d  in  args .device ):
78+                     selected_devids .append (dev .devid )
79+             devids  =  selected_devids 
6680
6781        print (args .mountpoint , '\t ' , fs .usage ().virtual_used_str , '\t ' , len (fs_chunks ), 'fs chunks' )
6882        for  devid  in  devids :
@@ -103,9 +117,9 @@ def report_usage(args):
103117                    stats  =  chunk_stats [data_flag ]
104118
105119                    print ('\t ' , data_flag )
106-                     print ('\t '  *  2 , 'Blockgroups at least partially on disk :' , stats ['count'  ] )
107-                     print ('\t '  *  2 , 'Data-device dependance :' , pretty_size ( stats ['size_used'  ]) )
108-                     print ('\t '  *  2 , 'Approx. blockgroup percentage packed :' )
120+                     print ('\t '  *  2 , 'Data-device dependence :' , pretty_size ( stats ['size_used'  ]) )
121+                     print ('\t '  *  2 , 'Blockgroups :' , stats ['count'  ] )
122+                     print ('\t '  *  2 , 'Blockgroup packing :' )
109123
110124                    grouped_stats  =  {}
111125                    for  percent  in  stats ['percent_used' ]:
@@ -115,13 +129,9 @@ def report_usage(args):
115129                        else :
116130                            grouped_stats [group ] =  1 
117131
118-                     min_count  =  min (count  for  _group , count  in  grouped_stats .items ())
119132                    max_count  =  max (count  for  _group , count  in  grouped_stats .items ())
120133                    for  group , count  in  sorted (grouped_stats .items ()):
121-                         try :
122-                             scaled_count  =  int (60  *  (count  -  min_count ) /  (max_count  -  min_count ))
123-                         except  ZeroDivisionError :
124-                             scaled_count  =  1 
134+                         scaled_count  =  int (60  *  count  /  max_count ) if  max_count  >  60  else  count 
125135                        print (
126136                            '\t '  *  2 ,
127137                            f'  { str (group ).rjust (3 )}  ,
0 commit comments