diff options
author | Josef Bacik <jbacik@fb.com> | 2018-10-12 15:32:33 -0400 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2018-10-19 06:20:03 -0400 |
commit | ad22cf6ea47fa20fbe11ac324a0a15c0a9a4a2a9 (patch) | |
tree | 20bda2ef98b59c3dfde217784dea4caccbe9573b | |
parent | 21a94f7acf0f748599ea552af5d9ee7d7e41c72f (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.c | 30 |
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 | ||
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 | |||
1775 | /* Cache the size of the max extent in bytes */ | 1782 | /* Cache the size of the max extent in bytes */ |
1776 | static struct btrfs_free_space * | 1783 | static struct btrfs_free_space * |
1777 | find_free_space(struct btrfs_free_space_ctl *ctl, u64 *offset, u64 *bytes, | 1784 | 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, | |||
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)) { |