Skip to content

Commit 65d41e9

Browse files
Josef Bacikgregkh
authored andcommitted
btrfs: set max_extent_size properly
commit ad22cf6 upstream. We can't use entry->bytes if our entry is a bitmap entry, we need to use entry->max_extent_size in that case. Fix up all the logic to make this consistent. CC: [email protected] # 4.4+ Signed-off-by: Josef Bacik <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 947a9b0 commit 65d41e9

File tree

1 file changed

+20
-10
lines changed

1 file changed

+20
-10
lines changed

fs/btrfs/free-space-cache.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1795,6 +1795,13 @@ static int search_bitmap(struct btrfs_free_space_ctl *ctl,
17951795
return -1;
17961796
}
17971797

1798+
static inline u64 get_max_extent_size(struct btrfs_free_space *entry)
1799+
{
1800+
if (entry->bitmap)
1801+
return entry->max_extent_size;
1802+
return entry->bytes;
1803+
}
1804+
17981805
/* Cache the size of the max extent in bytes */
17991806
static struct btrfs_free_space *
18001807
find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
@@ -1816,8 +1823,8 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
18161823
for (node = &entry->offset_index; node; node = rb_next(node)) {
18171824
entry = rb_entry(node, struct btrfs_free_space, offset_index);
18181825
if (entry->bytes < *bytes) {
1819-
if (entry->bytes > *max_extent_size)
1820-
*max_extent_size = entry->bytes;
1826+
*max_extent_size = max(get_max_extent_size(entry),
1827+
*max_extent_size);
18211828
continue;
18221829
}
18231830

@@ -1835,8 +1842,8 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
18351842
}
18361843

18371844
if (entry->bytes < *bytes + align_off) {
1838-
if (entry->bytes > *max_extent_size)
1839-
*max_extent_size = entry->bytes;
1845+
*max_extent_size = max(get_max_extent_size(entry),
1846+
*max_extent_size);
18401847
continue;
18411848
}
18421849

@@ -1848,8 +1855,10 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
18481855
*offset = tmp;
18491856
*bytes = size;
18501857
return entry;
1851-
} else if (size > *max_extent_size) {
1852-
*max_extent_size = size;
1858+
} else {
1859+
*max_extent_size =
1860+
max(get_max_extent_size(entry),
1861+
*max_extent_size);
18531862
}
18541863
continue;
18551864
}
@@ -2709,8 +2718,8 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group,
27092718

27102719
err = search_bitmap(ctl, entry, &search_start, &search_bytes, true);
27112720
if (err) {
2712-
if (search_bytes > *max_extent_size)
2713-
*max_extent_size = search_bytes;
2721+
*max_extent_size = max(get_max_extent_size(entry),
2722+
*max_extent_size);
27142723
return 0;
27152724
}
27162725

@@ -2747,8 +2756,9 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group,
27472756

27482757
entry = rb_entry(node, struct btrfs_free_space, offset_index);
27492758
while (1) {
2750-
if (entry->bytes < bytes && entry->bytes > *max_extent_size)
2751-
*max_extent_size = entry->bytes;
2759+
if (entry->bytes < bytes)
2760+
*max_extent_size = max(get_max_extent_size(entry),
2761+
*max_extent_size);
27522762

27532763
if (entry->bytes < bytes ||
27542764
(!entry->bitmap && entry->offset < min_start)) {

0 commit comments

Comments
 (0)