Btrfs: Properly clear dirty and delalloc extent bits while preparing the file for...
authorChris Mason <chris.mason@oracle.com>
Tue, 19 Feb 2008 16:29:24 +0000 (11:29 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:00 +0000 (11:04 -0400)
Yan Zheng noticed that we don't clear the extent state tree dirty and delalloc
bits when we clear the dirty bits on the page during file write.

This leads to csum errors later on.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/file.c

index b0352b5958a57bdb23006b41db359ebb3a81b1dd..1a47251a9d4d18c10f10096e48f8786cf05ab212 100644 (file)
@@ -762,6 +762,13 @@ static int prepare_pages(struct btrfs_root *root, struct file *file,
                set_page_extent_mapped(pages[i]);
                WARN_ON(!PageLocked(pages[i]));
        }
+       if (start_pos < inode->i_size) {
+               u64 last_pos;
+               last_pos = (index + num_pages) << PAGE_CACHE_SHIFT;
+               clear_extent_bits(&BTRFS_I(inode)->io_tree, start_pos,
+                                 last_pos - 1, EXTENT_DIRTY | EXTENT_DELALLOC,
+                                 GFP_NOFS);
+       }
        return 0;
 }