Browse Source

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>
Yan Zheng 16 years ago
parent
commit
1f80e4db0f
1 changed files with 2 additions and 3 deletions
  1. 2 3
      fs/btrfs/extent-tree.c

+ 2 - 3
fs/btrfs/extent-tree.c

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