@@ -40,13 +40,19 @@ def parse_args():
40
40
parser = argparse .ArgumentParser ()
41
41
parser .add_argument (
42
42
'--usage' ,
43
+ '-u' ,
43
44
action = "store_true" ,
44
45
help = "Print device blockgroup usage" ,
45
46
)
46
47
parser .add_argument (
47
48
'mountpoint' ,
48
49
help = "Btrfs filesystem mountpoint" ,
49
50
)
51
+ parser .add_argument (
52
+ 'device' ,
53
+ nargs = '*' ,
54
+ help = "Only use specific devices (default include all)" ,
55
+ )
50
56
return parser .parse_args ()
51
57
52
58
@@ -60,9 +66,17 @@ def safe_get_block_group(t):
60
66
61
67
def report_usage (args ):
62
68
with btrfs .FileSystem (args .mountpoint ) as fs :
69
+ fs_chunks = list (fs .chunks ())
70
+
63
71
devices = fs .devices ()
64
72
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
66
80
67
81
print (args .mountpoint , '\t ' , fs .usage ().virtual_used_str , '\t ' , len (fs_chunks ), 'fs chunks' )
68
82
for devid in devids :
@@ -103,9 +117,9 @@ def report_usage(args):
103
117
stats = chunk_stats [data_flag ]
104
118
105
119
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 :' )
109
123
110
124
grouped_stats = {}
111
125
for percent in stats ['percent_used' ]:
@@ -115,13 +129,9 @@ def report_usage(args):
115
129
else :
116
130
grouped_stats [group ] = 1
117
131
118
- min_count = min (count for _group , count in grouped_stats .items ())
119
132
max_count = max (count for _group , count in grouped_stats .items ())
120
133
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
125
135
print (
126
136
'\t ' * 2 ,
127
137
f' { str (group ).rjust (3 )} % packed' ,
0 commit comments