Btrfs: set EXTENT_BOUNDARY bit before marking extent delalloc.
authorYan Zheng <zheng.yan@oracle.com>
Fri, 19 Dec 2008 15:59:04 +0000 (10:59 -0500)
committerChris Mason <chris.mason@oracle.com>
Fri, 19 Dec 2008 15:59:04 +0000 (10:59 -0500)
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>
fs/btrfs/extent-tree.c

index 274bb91..fe0e59a 100644 (file)
@@ -3994,10 +3994,10 @@ again:
                }
                set_page_extent_mapped(page);
 
-               btrfs_set_extent_delalloc(inode, page_start, page_end);
                if (i == first_index)
                        set_extent_bits(io_tree, page_start, page_end,
                                        EXTENT_BOUNDARY, GFP_NOFS);
+               btrfs_set_extent_delalloc(inode, page_start, page_end);
 
                set_page_dirty(page);
                total_dirty++;
@@ -4405,7 +4405,7 @@ static int noinline get_new_locations(struct inode *reloc_inode,
                path->slots[0]++;
        }
 
-       WARN_ON(cur_pos + offset > last_byte);
+       BUG_ON(cur_pos + offset > last_byte);
        if (cur_pos + offset < last_byte) {
                ret = -ENOENT;
                goto out;
@@ -5712,7 +5712,6 @@ next:
        if (pass == 0) {
                btrfs_wait_ordered_range(reloc_inode, 0, (u64)-1);
                invalidate_mapping_pages(reloc_inode->i_mapping, 0, -1);
-               WARN_ON(reloc_inode->i_mapping->nrpages);
        }
 
        if (total_found > 0) {