btrfs: only clear EXTENT_LOCK bit in extent_invalidatepage
extent_invalidatepage() will try to clear all possible bits since it's calling clear_extent_bit() with delete == 1. This is currently fine, since for btree io tree, it only utilizes EXTENT_LOCK bit. But this could be a problem for later subpage support, which will utilize extra io tree bit to represent additional info. This patch will just convert that clear_extent_bit() to unlock_extent_cached(). For current code since only EXTENT_LOCKED bit is utilized, this doesn't change the behavior, but provides a much cleaner basis for incoming subpage support. Reviewed-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
8e1dc982ed
commit
829ddec922
@ -4431,14 +4431,22 @@ int extent_invalidatepage(struct extent_io_tree *tree,
|
||||
u64 end = start + PAGE_SIZE - 1;
|
||||
size_t blocksize = page->mapping->host->i_sb->s_blocksize;
|
||||
|
||||
/* This function is only called for the btree inode */
|
||||
ASSERT(tree->owner == IO_TREE_BTREE_INODE_IO);
|
||||
|
||||
start += ALIGN(offset, blocksize);
|
||||
if (start > end)
|
||||
return 0;
|
||||
|
||||
lock_extent_bits(tree, start, end, &cached_state);
|
||||
wait_on_page_writeback(page);
|
||||
clear_extent_bit(tree, start, end, EXTENT_LOCKED | EXTENT_DELALLOC |
|
||||
EXTENT_DO_ACCOUNTING, 1, 1, &cached_state);
|
||||
|
||||
/*
|
||||
* Currently for btree io tree, only EXTENT_LOCKED is utilized,
|
||||
* so here we only need to unlock the extent range to free any
|
||||
* existing extent state.
|
||||
*/
|
||||
unlock_extent_cached(tree, start, end, &cached_state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user