Btrfs: Don't allow releasepage to succeed if EXTENT_ORDERED is set

Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
Chris Mason 2008-07-18 11:56:15 -04:00
parent 3edf7d33f4
commit 211f90e68b
2 changed files with 11 additions and 6 deletions

View file

@ -2542,7 +2542,8 @@ int try_release_extent_state(struct extent_map_tree *map,
u64 end = start + PAGE_CACHE_SIZE - 1; u64 end = start + PAGE_CACHE_SIZE - 1;
int ret = 1; int ret = 1;
if (test_range_bit(tree, start, end, EXTENT_IOBITS, 0)) if (test_range_bit(tree, start, end,
EXTENT_IOBITS | EXTENT_ORDERED, 0))
ret = 0; ret = 0;
else { else {
if ((mask & GFP_NOFS) == GFP_NOFS) if ((mask & GFP_NOFS) == GFP_NOFS)

View file

@ -477,10 +477,8 @@ printk("queueing worker to fixup page %lu %Lu\n", inode->i_ino, page_offset(page
return -EAGAIN; return -EAGAIN;
} }
int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
struct extent_state *state, int uptodate)
{ {
struct inode *inode = page->mapping->host;
struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_root *root = BTRFS_I(inode)->root;
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
struct btrfs_ordered_extent *ordered_extent; struct btrfs_ordered_extent *ordered_extent;
@ -550,6 +548,12 @@ int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
return 0; return 0;
} }
int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
struct extent_state *state, int uptodate)
{
return btrfs_finish_ordered_io(page->mapping->host, start, end);
}
int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end) int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
{ {
int ret = 0; int ret = 0;
@ -2663,8 +2667,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset)
clear_extent_bit(tree, page_start, page_end, clear_extent_bit(tree, page_start, page_end,
EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DIRTY | EXTENT_DELALLOC |
EXTENT_LOCKED, 1, 0, GFP_NOFS); EXTENT_LOCKED, 1, 0, GFP_NOFS);
btrfs_writepage_end_io_hook(page, page_start, btrfs_finish_ordered_io(page->mapping->host,
page_end, NULL, 1); page_start, page_end);
btrfs_put_ordered_extent(ordered); btrfs_put_ordered_extent(ordered);
lock_extent(tree, page_start, page_end, GFP_NOFS); lock_extent(tree, page_start, page_end, GFP_NOFS);
} }