aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYan Zheng <zheng.yan@oracle.com>2008-12-19 10:59:04 -0500
committerChris Mason <chris.mason@oracle.com>2008-12-19 10:59:04 -0500
commit1f80e4db0fcb3bdc2be51389baf558a9519682f0 (patch)
tree3a47b6fda78aab8a1a4e9e7f021bb9126a298496
parent34bf63c4ddddd92bfba3387d134c37bf4426b2ce (diff)
Btrfs: set EXTENT_BOUNDARY bit before marking extent delalloc.
There is a race in relocate_inode_pages, it happens when find_delalloc_range finds the delalloc extent before the boundary bit is set. Thank you, Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
-rw-r--r--fs/btrfs/extent-tree.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 274bb91efa22..fe0e59ab33cc 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3994,10 +3994,10 @@ again:
3994 } 3994 }
3995 set_page_extent_mapped(page); 3995 set_page_extent_mapped(page);
3996 3996
3997 btrfs_set_extent_delalloc(inode, page_start, page_end);
3998 if (i == first_index) 3997 if (i == first_index)
3999 set_extent_bits(io_tree, page_start, page_end, 3998 set_extent_bits(io_tree, page_start, page_end,
4000 EXTENT_BOUNDARY, GFP_NOFS); 3999 EXTENT_BOUNDARY, GFP_NOFS);
4000 btrfs_set_extent_delalloc(inode, page_start, page_end);
4001 4001
4002 set_page_dirty(page); 4002 set_page_dirty(page);
4003 total_dirty++; 4003 total_dirty++;
@@ -4405,7 +4405,7 @@ static int noinline get_new_locations(struct inode *reloc_inode,
4405 path->slots[0]++; 4405 path->slots[0]++;
4406 } 4406 }
4407 4407
4408 WARN_ON(cur_pos + offset > last_byte); 4408 BUG_ON(cur_pos + offset > last_byte);
4409 if (cur_pos + offset < last_byte) { 4409 if (cur_pos + offset < last_byte) {
4410 ret = -ENOENT; 4410 ret = -ENOENT;
4411 goto out; 4411 goto out;
@@ -5712,7 +5712,6 @@ next:
5712 if (pass == 0) { 5712 if (pass == 0) {
5713 btrfs_wait_ordered_range(reloc_inode, 0, (u64)-1); 5713 btrfs_wait_ordered_range(reloc_inode, 0, (u64)-1);
5714 invalidate_mapping_pages(reloc_inode->i_mapping, 0, -1); 5714 invalidate_mapping_pages(reloc_inode->i_mapping, 0, -1);
5715 WARN_ON(reloc_inode->i_mapping->nrpages);
5716 } 5715 }
5717 5716
5718 if (total_found > 0) { 5717 if (total_found > 0) {