summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
authorChris Mason2008-11-10 13:31:30 +0100
committerChris Mason2008-11-10 13:31:30 +0100
commitf2b1c41cf94d7f839fe9ede5f3ead92698a93fb3 (patch)
treedbde0effe5d2e147dd74af96b29ece862b94960d /fs/btrfs/extent_io.c
parentBtrfs: Don't substract too much from the allocation target (avoid wrapping) (diff)
downloadkernel-qcow2-linux-f2b1c41cf94d7f839fe9ede5f3ead92698a93fb3.tar.gz
kernel-qcow2-linux-f2b1c41cf94d7f839fe9ede5f3ead92698a93fb3.tar.xz
kernel-qcow2-linux-f2b1c41cf94d7f839fe9ede5f3ead92698a93fb3.zip
Btrfs: Make sure pages are dirty before doing delalloc for them
This adds a PageDirty check to the writeback path that locks pages for delalloc. If a page wasn't dirty at this point, it is in the process of being truncated away. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index ad75a9cc3604..69ea09659d47 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -1205,7 +1205,8 @@ static noinline int lock_delalloc_pages(struct inode *inode,
*/
if (pages[i] != locked_page) {
lock_page(pages[i]);
- if (pages[i]->mapping != inode->i_mapping) {
+ if (!PageDirty(pages[i]) ||
+ pages[i]->mapping != inode->i_mapping) {
ret = -EAGAIN;
unlock_page(pages[i]);
page_cache_release(pages[i]);