summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorChris Mason2008-07-18 17:56:15 +0200
committerChris Mason2008-09-25 17:04:05 +0200
commit211f90e68b679d27fe23c5505f86d6ce62c98bae (patch)
tree18e3b7a86328ca0571c88eb029af5ba7570d82c7 /fs/btrfs/inode.c
parentBtrfs: Handle data checksumming on bios that span multiple ordered extents (diff)
downloadkernel-qcow2-linux-211f90e68b679d27fe23c5505f86d6ce62c98bae.tar.gz
kernel-qcow2-linux-211f90e68b679d27fe23c5505f86d6ce62c98bae.tar.xz
kernel-qcow2-linux-211f90e68b679d27fe23c5505f86d6ce62c98bae.zip
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/inode.c')
-rw-r--r--fs/btrfs/inode.c14
1 files changed, 9 insertions, 5 deletions
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
return -EAGAIN;
}
-int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
- struct extent_state *state, int uptodate)
+static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
{
- struct inode *inode = page->mapping->host;
struct btrfs_root *root = BTRFS_I(inode)->root;
struct btrfs_trans_handle *trans;
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;
}
+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 ret = 0;
@@ -2663,8 +2667,8 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset)
clear_extent_bit(tree, page_start, page_end,
EXTENT_DIRTY | EXTENT_DELALLOC |
EXTENT_LOCKED, 1, 0, GFP_NOFS);
- btrfs_writepage_end_io_hook(page, page_start,
- page_end, NULL, 1);
+ btrfs_finish_ordered_io(page->mapping->host,
+ page_start, page_end);
btrfs_put_ordered_extent(ordered);
lock_extent(tree, page_start, page_end, GFP_NOFS);
}