summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorChris Mason2008-07-17 19:53:27 +0200
committerChris Mason2008-09-25 17:04:05 +0200
commiteb84ae039e10f1f80443d846ba1350122bbdc753 (patch)
treed87bcbead436eaf96f5160ac46f78699d65c5251 /fs/btrfs/inode.c
parentBtrfs: Force caching of metadata block groups on mount to avoid deadlock (diff)
downloadkernel-qcow2-linux-eb84ae039e10f1f80443d846ba1350122bbdc753.tar.gz
kernel-qcow2-linux-eb84ae039e10f1f80443d846ba1350122bbdc753.tar.xz
kernel-qcow2-linux-eb84ae039e10f1f80443d846ba1350122bbdc753.zip
Btrfs: Cleanup and comment ordered-data.c
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 0d1e2ba47a9c..f37e09e724f7 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1343,7 +1343,7 @@ again:
unlock_extent(io_tree, page_start, page_end, GFP_NOFS);
unlock_page(page);
page_cache_release(page);
- btrfs_wait_ordered_extent(inode, ordered);
+ btrfs_start_ordered_extent(inode, ordered, 1);
btrfs_put_ordered_extent(ordered);
goto again;
}
@@ -2660,6 +2660,10 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset)
ordered = btrfs_lookup_ordered_extent(page->mapping->host,
page_offset(page));
if (ordered) {
+ /*
+ * IO on this page will never be started, so we need
+ * to account for any ordered extents now
+ */
clear_extent_bit(tree, page_start, page_end,
EXTENT_DIRTY | EXTENT_DELALLOC |
EXTENT_LOCKED, 1, 0, GFP_NOFS);
@@ -2732,11 +2736,15 @@ again:
lock_extent(io_tree, page_start, page_end, GFP_NOFS);
set_page_extent_mapped(page);
+ /*
+ * we can't set the delalloc bits if there are pending ordered
+ * extents. Drop our locks and wait for them to finish
+ */
ordered = btrfs_lookup_ordered_extent(inode, page_start);
if (ordered) {
unlock_extent(io_tree, page_start, page_end, GFP_NOFS);
unlock_page(page);
- btrfs_wait_ordered_extent(inode, ordered);
+ btrfs_start_ordered_extent(inode, ordered, 1);
btrfs_put_ordered_extent(ordered);
goto again;
}