Btrfs: Don't allow releasepage to succeed if EXTENT_ORDERED is set
authorChris Mason <chris.mason@oracle.com>
Fri, 18 Jul 2008 15:56:15 +0000 (11:56 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:05 +0000 (11:04 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_io.c
fs/btrfs/inode.c

index feff16cb9b40acffbf9a21d1083b71e962f7802f..3153b4fdd0b375227b9ae97d55474edab5cc4cee 100644 (file)
@@ -2542,7 +2542,8 @@ int try_release_extent_state(struct extent_map_tree *map,
        u64 end = start + PAGE_CACHE_SIZE - 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;
        else {
                if ((mask & GFP_NOFS) == GFP_NOFS)
index 4d729d90d2b88957660467afc55b176c630d5310..8803abc89bb85ff892836196bb5ed994c6c3d987 100644 (file)
@@ -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);
        }