Fix Btrfs unallocated space accounting (#14824)
Ivan Shapovalov committed
Mar 30, 2023 at 16:17 UTC
0ac8f7c4f0278cdeac5172ee715d0c590a947f3a
1 file changed
+5
-23
collectors/proc.plugin/sys_fs_btrfs.c
+5
-23
@@ -10,9 +10,7 @@ typedef struct btrfs_disk {
10
int exists;
11
12
char *size_filename;
13
- char *hw_sector_size_filename;
13
unsigned long long size;
15
- unsigned long long hw_sector_size;
14
15
struct btrfs_disk *next;
16
} BTRFS_DISK;
@@ -85,7 +83,6 @@ static BTRFS_NODE *nodes = NULL;
83
static inline void btrfs_free_disk(BTRFS_DISK *d) {
84
freez(d->name);
85
freez(d->size_filename);
88
- freez(d->hw_sector_size_filename);
86
freez(d);
87
}
88
@@ -175,19 +172,6 @@ static inline int find_btrfs_disks(BTRFS_NODE *node, const char *path) {
172
snprintfz(filename, FILENAME_MAX, "%s/%s/size", path, de->d_name);
173
d->size_filename = strdupz(filename);
174
178
- // for bcache
179
- snprintfz(filename, FILENAME_MAX, "%s/%s/bcache/../queue/hw_sector_size", path, de->d_name);
180
- struct stat sb;
181
- if(stat(filename, &sb) == -1) {
182
- // for disks
183
- snprintfz(filename, FILENAME_MAX, "%s/%s/queue/hw_sector_size", path, de->d_name);
184
- if(stat(filename, &sb) == -1)
185
- // for partitions
186
- snprintfz(filename, FILENAME_MAX, "%s/%s/../queue/hw_sector_size", path, de->d_name);
187
- }
188
-
189
- d->hw_sector_size_filename = strdupz(filename);
190
-
175
// link it
176
d->next = node->disks;
177
node->disks = d;
@@ -205,13 +189,11 @@ static inline int find_btrfs_disks(BTRFS_NODE *node, const char *path) {
189
continue;
190
}
191
208
- if(read_single_number_file(d->hw_sector_size_filename, &d->hw_sector_size) != 0) {
209
- collector_error("BTRFS: failed to read '%s'", d->hw_sector_size_filename);
210
- d->exists = 0;
211
- continue;
212
- }
213
-
214
- node->all_disks_total += d->size * d->hw_sector_size;
192
+ // /sys/block/<name>/size is in fixed-size sectors of 512 bytes
193
+ // https://github.com/torvalds/linux/blob/v6.2/block/genhd.c#L946-L950
194
+ // https://github.com/torvalds/linux/blob/v6.2/include/linux/types.h#L120-L121
195
+ // (also see #3481, #3483)
196
+ node->all_disks_total += d->size * 512;
197
}
198
closedir(dir);
199