diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-07-18 11:56:15 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:04:05 -0400 |
commit | 211f90e68b679d27fe23c5505f86d6ce62c98bae (patch) | |
tree | 18e3b7a86328ca0571c88eb029af5ba7570d82c7 /fs/btrfs | |
parent | 3edf7d33f4edb1e4a9bb0a4c0a84d95fb4d22a09 (diff) |
Btrfs: Don't allow releasepage to succeed if EXTENT_ORDERED is set
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/extent_io.c | 3 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 14 |
2 files changed, 11 insertions, 6 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index feff16cb9b40..3153b4fdd0b3 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2542,7 +2542,8 @@ int try_release_extent_state(struct extent_map_tree *map, | |||
2542 | u64 end = start + PAGE_CACHE_SIZE - 1; | 2542 | u64 end = start + PAGE_CACHE_SIZE - 1; |
2543 | int ret = 1; | 2543 | int ret = 1; |
2544 | 2544 | ||
2545 | if (test_range_bit(tree, start, end, EXTENT_IOBITS, 0)) | 2545 | if (test_range_bit(tree, start, end, |
2546 | EXTENT_IOBITS | EXTENT_ORDERED, 0)) | ||
2546 | ret = 0; | 2547 | ret = 0; |
2547 | else { | 2548 | else { |
2548 | if ((mask & GFP_NOFS) == GFP_NOFS) | 2549 | if ((mask & GFP_NOFS) == GFP_NOFS) |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 4d729d90d2b8..8803abc89bb8 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -477,10 +477,8 @@ printk("queueing worker to fixup page %lu %Lu\n", inode->i_ino, page_offset(page | |||
477 | return -EAGAIN; | 477 | return -EAGAIN; |
478 | } | 478 | } |
479 | 479 | ||
480 | int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 480 | static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) |
481 | struct extent_state *state, int uptodate) | ||
482 | { | 481 | { |
483 | struct inode *inode = page->mapping->host; | ||
484 | struct btrfs_root *root = BTRFS_I(inode)->root; | 482 | struct btrfs_root *root = BTRFS_I(inode)->root; |
485 | struct btrfs_trans_handle *trans; | 483 | struct btrfs_trans_handle *trans; |
486 | struct btrfs_ordered_extent *ordered_extent; | 484 | struct btrfs_ordered_extent *ordered_extent; |
@@ -550,6 +548,12 @@ int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | |||
550 | return 0; | 548 | return 0; |
551 | } | 549 | } |
552 | 550 | ||
551 | int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | ||
552 | struct extent_state *state, int uptodate) | ||
553 | { | ||
554 | return btrfs_finish_ordered_io(page->mapping->host, start, end); | ||
555 | } | ||
556 | |||
553 | int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end) | 557 | int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end) |
554 | { | 558 | { |
555 | int ret = 0; | 559 | int ret = 0; |
@@ -2663,8 +2667,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
2663 | clear_extent_bit(tree, page_start, page_end, | 2667 | clear_extent_bit(tree, page_start, page_end, |
2664 | EXTENT_DIRTY | EXTENT_DELALLOC | | 2668 | EXTENT_DIRTY | EXTENT_DELALLOC | |
2665 | EXTENT_LOCKED, 1, 0, GFP_NOFS); | 2669 | EXTENT_LOCKED, 1, 0, GFP_NOFS); |
2666 | btrfs_writepage_end_io_hook(page, page_start, | 2670 | btrfs_finish_ordered_io(page->mapping->host, |
2667 | page_end, NULL, 1); | 2671 | page_start, page_end); |
2668 | btrfs_put_ordered_extent(ordered); | 2672 | btrfs_put_ordered_extent(ordered); |
2669 | lock_extent(tree, page_start, page_end, GFP_NOFS); | 2673 | lock_extent(tree, page_start, page_end, GFP_NOFS); |
2670 | } | 2674 | } |