aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fb.com>2018-10-12 15:32:33 -0400
committerDavid Sterba <dsterba@suse.com>2018-10-19 06:20:03 -0400
commitad22cf6ea47fa20fbe11ac324a0a15c0a9a4a2a9 (patch)
tree20bda2ef98b59c3dfde217784dea4caccbe9573b
parent21a94f7acf0f748599ea552af5d9ee7d7e41c72f (diff)
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: stable@vger.kernel.org # 4.4+ Signed-off-by: Josef Bacik <jbacik@fb.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/free-space-cache.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index 67441219d6c9..7f90c2bf9d5f 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -1772,6 +1772,13 @@ static int search_bitmap(struct btrfs_free_space_ctl *ctl,
1772 return -1; 1772 return -1;
1773} 1773}
1774 1774
1775static 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
1775/* Cache the size of the max extent in bytes */ 1782/* Cache the size of the max extent in bytes */
1776static struct btrfs_free_space * 1783static struct btrfs_free_space *
1777find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes, 1784find_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,
1793 for (node = &entry->offset_index; node; node = rb_next(node)) { 1800 for (node = &entry->offset_index; node; node = rb_next(node)) {
1794 entry = rb_entry(node, struct btrfs_free_space, offset_index); 1801 entry = rb_entry(node, struct btrfs_free_space, offset_index);
1795 if (entry->bytes < *bytes) { 1802 if (entry->bytes < *bytes) {
1796 if (entry->bytes > *max_extent_size) 1803 *max_extent_size = max(get_max_extent_size(entry),
1797 *max_extent_size = entry->bytes; 1804 *max_extent_size);
1798 continue; 1805 continue;
1799 } 1806 }
1800 1807
@@ -1812,8 +1819,8 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
1812 } 1819 }
1813 1820
1814 if (entry->bytes < *bytes + align_off) { 1821 if (entry->bytes < *bytes + align_off) {
1815 if (entry->bytes > *max_extent_size) 1822 *max_extent_size = max(get_max_extent_size(entry),
1816 *max_extent_size = entry->bytes; 1823 *max_extent_size);
1817 continue; 1824 continue;
1818 } 1825 }
1819 1826
@@ -1825,8 +1832,10 @@ find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes,
1825 *offset = tmp; 1832 *offset = tmp;
1826 *bytes = size; 1833 *bytes = size;
1827 return entry; 1834 return entry;
1828 } else if (size > *max_extent_size) { 1835 } else {
1829 *max_extent_size = size; 1836 *max_extent_size =
1837 max(get_max_extent_size(entry),
1838 *max_extent_size);
1830 } 1839 }
1831 continue; 1840 continue;
1832 } 1841 }
@@ -2685,8 +2694,8 @@ static u64 btrfs_alloc_from_bitmap(struct btrfs_block_group_cache *block_group,
2685 2694
2686 err = search_bitmap(ctl, entry, &search_start, &search_bytes, true); 2695 err = search_bitmap(ctl, entry, &search_start, &search_bytes, true);
2687 if (err) { 2696 if (err) {
2688 if (search_bytes > *max_extent_size) 2697 *max_extent_size = max(get_max_extent_size(entry),
2689 *max_extent_size = search_bytes; 2698 *max_extent_size);
2690 return 0; 2699 return 0;
2691 } 2700 }
2692 2701
@@ -2723,8 +2732,9 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group_cache *block_group,
2723 2732
2724 entry = rb_entry(node, struct btrfs_free_space, offset_index); 2733 entry = rb_entry(node, struct btrfs_free_space, offset_index);
2725 while (1) { 2734 while (1) {
2726 if (entry->bytes < bytes && entry->bytes > *max_extent_size) 2735 if (entry->bytes < bytes)
2727 *max_extent_size = entry->bytes; 2736 *max_extent_size = max(get_max_extent_size(entry),
2737 *max_extent_size);
2728 2738
2729 if (entry->bytes < bytes || 2739 if (entry->bytes < bytes ||
2730 (!entry->bitmap && entry->offset < min_start)) { 2740 (!entry->bitmap && entry->offset < min_start)) {