mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
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>
This commit is contained in:
parent
34bf63c4dd
commit
1f80e4db0f
1 changed files with 2 additions and 3 deletions
|
@ -3994,10 +3994,10 @@ static int noinline relocate_inode_pages(struct inode *inode, u64 start,
|
|||
}
|
||||
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 @@ int btrfs_relocate_block_group(struct btrfs_root *root, u64 group_start)
|
|||
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) {
|
||||
|
|
Loading…
Reference in a new issue