diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-12-18 16:25:45 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:03:58 -0400 |
commit | 190662b2128dd648749e197f5563e9f6bbb5e05c (patch) | |
tree | dba934f3932650ad4f975073d1871c7424ef18d2 /fs/btrfs/extent_map.c | |
parent | 4aec2b52327b3a3a20faa3f1af3102c0d97c7c92 (diff) |
Btrfs: Fix delayed allocation to avoid missing delalloc extents
find_lock_delalloc_range could exit out too early
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent_map.c')
-rw-r--r-- | fs/btrfs/extent_map.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 0d1e59a86e49..a0dff34dd437 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c | |||
@@ -1070,6 +1070,7 @@ u64 find_lock_delalloc_range(struct extent_map_tree *tree, | |||
1070 | search_again: | 1070 | search_again: |
1071 | node = tree_search(&tree->state, cur_start); | 1071 | node = tree_search(&tree->state, cur_start); |
1072 | if (!node || IS_ERR(node)) { | 1072 | if (!node || IS_ERR(node)) { |
1073 | *end = (u64)-1; | ||
1073 | goto out; | 1074 | goto out; |
1074 | } | 1075 | } |
1075 | 1076 | ||
@@ -1079,6 +1080,8 @@ search_again: | |||
1079 | goto out; | 1080 | goto out; |
1080 | } | 1081 | } |
1081 | if (!(state->state & EXTENT_DELALLOC)) { | 1082 | if (!(state->state & EXTENT_DELALLOC)) { |
1083 | if (!found) | ||
1084 | *end = state->end; | ||
1082 | goto out; | 1085 | goto out; |
1083 | } | 1086 | } |
1084 | if (!found) { | 1087 | if (!found) { |
@@ -1841,8 +1844,10 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, | |||
1841 | nr_delalloc = find_lock_delalloc_range(tree, &delalloc_start, | 1844 | nr_delalloc = find_lock_delalloc_range(tree, &delalloc_start, |
1842 | &delalloc_end, | 1845 | &delalloc_end, |
1843 | 128 * 1024 * 1024); | 1846 | 128 * 1024 * 1024); |
1844 | if (nr_delalloc <= 0) | 1847 | if (nr_delalloc == 0) { |
1845 | break; | 1848 | delalloc_start = delalloc_end + 1; |
1849 | continue; | ||
1850 | } | ||
1846 | tree->ops->fill_delalloc(inode, delalloc_start, | 1851 | tree->ops->fill_delalloc(inode, delalloc_start, |
1847 | delalloc_end); | 1852 | delalloc_end); |
1848 | clear_extent_bit(tree, delalloc_start, | 1853 | clear_extent_bit(tree, delalloc_start, |