Skip to content

Commit 4a351e7

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 e982bec commit 4a351e7

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
@@ -1772,6 +1772,13 @@ static int search_bitmap(struct btrfs_free_space_ctl *ctl,
17721772
return -1;
17731773
}
17741774

1775+
static inline u64 get_max_extent_size(struct btrfs_free_space *entry)
1776+
{
1777+
if (entry->bitmap)
1778+
return entry->max_extent_size;
1779+
return entry->bytes;
1780+
}
1781+
17751782
/* Cache the size of the max extent in bytes */
17761783
static struct btrfs_free_space *
17771784
find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
@@ -1793,8 +1800,8 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
17931800
for (node = &entry->offset_index; node; node = rb_next(node)) {
17941801
entry = rb_entry(node, struct btrfs_free_space, offset_index);
17951802
if (entry->bytes < *bytes) {
1796-
if (entry->bytes > *max_extent_size)
1797-
*max_extent_size = entry->bytes;
1803+
*max_extent_size = max(get_max_extent_size(entry),
1804+
*max_extent_size);
17981805
continue;
17991806
}
18001807

@@ -1812,8 +1819,8 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
18121819
}
18131820

18141821
if (entry->bytes < *bytes + align_off) {
1815-
if (entry->bytes > *max_extent_size)
1816-
*max_extent_size = entry->bytes;
1822+
*max_extent_size = max(get_max_extent_size(entry),
1823+
*max_extent_size);
18171824
continue;
18181825
}
18191826

@@ -1825,8 +1832,10 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
18251832
*offset = tmp;
18261833
*bytes = size;
18271834
return entry;
1828-
} else if (size > *max_extent_size) {
1829-
*max_extent_size = size;
1835+
} else {
1836+
*max_extent_size =
1837+
max(get_max_extent_size(entry),
1838+
*max_extent_size);
18301839
}
18311840
continue;
18321841
}
@@ -2686,8 +2695,8 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group,
26862695

26872696
err = search_bitmap(ctl, entry, &search_start, &search_bytes, true);
26882697
if (err) {
2689-
if (search_bytes > *max_extent_size)
2690-
*max_extent_size = search_bytes;
2698+
*max_extent_size = max(get_max_extent_size(entry),
2699+
*max_extent_size);
26912700
return 0;
26922701
}
26932702

@@ -2724,8 +2733,9 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group,
27242733

27252734
entry = rb_entry(node, struct btrfs_free_space, offset_index);
27262735
while (1) {
2727-
if (entry->bytes < bytes && entry->bytes > *max_extent_size)
2728-
*max_extent_size = entry->bytes;
2736+
if (entry->bytes < bytes)
2737+
*max_extent_size = max(get_max_extent_size(entry),
2738+
*max_extent_size);
27292739

27302740
if (entry->bytes < bytes ||
27312741
(!entry->bitmap && entry->offset < min_start)) {

0 commit comments

Comments
 (0)