Btrfs: Init address_space->writeback_index properly
authorChris Mason <chris.mason@oracle.com>
Fri, 15 Aug 2008 19:34:14 +0000 (15:34 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:06 +0000 (11:04 -0400)
The writeback_index field is used by write_cache_pages to pick up where
writeback on a given inode left off.  But, it is never set to a sane
value, so writeback can often start at a random offset in the file.

Kernels 2.6.28 and higher will have this fixed, but for everyone else,
we also fill in the value in btrfs.

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

index a26d365111e5371a1e5d38853c9bc1ea2efa51aa..33b990878d84f40a2095786c4b9b04f620431867 100644 (file)
@@ -1833,6 +1833,7 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p)
        inode->i_ino = args->ino;
        BTRFS_I(inode)->root = args->root;
        BTRFS_I(inode)->delalloc_bytes = 0;
+       inode->i_mapping->writeback_index = 0;
        BTRFS_I(inode)->disk_i_size = 0;
        BTRFS_I(inode)->index_cnt = (u64)-1;
        extent_map_tree_init(&BTRFS_I(inode)->extent_tree, GFP_NOFS);
@@ -2239,6 +2240,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
        mutex_init(&BTRFS_I(inode)->csum_mutex);
        mutex_init(&BTRFS_I(inode)->extent_mutex);
        BTRFS_I(inode)->delalloc_bytes = 0;
+       inode->i_mapping->writeback_index = 0;
        BTRFS_I(inode)->disk_i_size = 0;
        BTRFS_I(inode)->root = root;
 
@@ -2486,6 +2488,7 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
                mutex_init(&BTRFS_I(inode)->extent_mutex);
                BTRFS_I(inode)->delalloc_bytes = 0;
                BTRFS_I(inode)->disk_i_size = 0;
+               inode->i_mapping->writeback_index = 0;
                BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
                btrfs_ordered_inode_tree_init(&BTRFS_I(inode)->ordered_tree);
        }
@@ -3549,6 +3552,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
                mutex_init(&BTRFS_I(inode)->extent_mutex);
                BTRFS_I(inode)->delalloc_bytes = 0;
                BTRFS_I(inode)->disk_i_size = 0;
+               inode->i_mapping->writeback_index = 0;
                BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
                btrfs_ordered_inode_tree_init(&BTRFS_I(inode)->ordered_tree);
        }