diff options
author | Yan Zheng <zheng.yan@oracle.com> | 2008-12-19 10:59:04 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-12-19 10:59:04 -0500 |
commit | 1f80e4db0fcb3bdc2be51389baf558a9519682f0 (patch) | |
tree | 3a47b6fda78aab8a1a4e9e7f021bb9126a298496 | |
parent | 34bf63c4ddddd92bfba3387d134c37bf4426b2ce (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.c | 5 |
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) { |