@@ -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 , 'Total 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 )} % packed' ,
0 commit comments