Skip to content

Commit ad22cf6

Browse files
Josef Bacikkdave
authored andcommitted
btrfs: set max_extent_size properly
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]>
1 parent 21a94f7 commit ad22cf6

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
}
@@ -2685,8 +2694,8 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group,
26852694

26862695
err = search_bitmap(ctl, entry, &search_start, &search_bytes, true);
26872696
if (err) {
2688-
if (search_bytes > *max_extent_size)
2689-
*max_extent_size = search_bytes;
2697+
*max_extent_size = max(get_max_extent_size(entry),
2698+
*max_extent_size);
26902699
return 0;
26912700
}
26922701

@@ -2723,8 +2732,9 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group,
27232732

27242733
entry = rb_entry(node, struct btrfs_free_space, offset_index);
27252734
while (1) {
2726-
if (entry->bytes < bytes && entry->bytes > *max_extent_size)
2727-
*max_extent_size = entry->bytes;
2735+
if (entry->bytes < bytes)
2736+
*max_extent_size = max(get_max_extent_size(entry),
2737+
*max_extent_size);
27282738

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

0 commit comments

Comments
 (0)