On Wed, 2008-03-19 at 14:22 +0530, Aneesh Kumar K.V wrote: > Hi, > > Eric actually observed it yesterday. I am able to reproduce it locally. > With delayed allocation we are observing wrong value of i_size. > The problem is current delalloc does not update on-disk i_size until writeout time, the in-core i_size is updated though. Could you try the following patch? It updates the i_disksize at the write_end time. Signed-off-by: Mingming Cao <cmm@xxxxxxxxxx> --- fs/ext4/inode.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) Index: linux-2.6.25-rc5/fs/ext4/inode.c =================================================================== --- linux-2.6.25-rc5.orig/fs/ext4/inode.c 2008-03-19 17:32:44.000000000 -0700 +++ linux-2.6.25-rc5/fs/ext4/inode.c 2008-03-19 17:43:19.000000000 -0700 @@ -1355,6 +1355,43 @@ static int ext4_writeback_write_end(stru return ret ? ret : copied; } +static int ext4_da_write_end(struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + handle_t *handle; + struct inode *inode = file->f_mapping->host; + int needed_blocks = ext4_writepage_trans_blocks(inode); + int ret = 0, ret2; + loff_t new_i_size; + + handle = ext4_journal_start(inode, needed_blocks); + if (IS_ERR(handle)) { + unlock_page(page); + page_cache_release(page); + ret = PTR_ERR(handle); + return ret; + } + + new_i_size = pos + copied; + if (new_i_size > EXT4_I(inode)->i_disksize) + EXT4_I(inode)->i_disksize = new_i_size; + + copied = ext4_generic_write_end(file, mapping, pos, len, copied, + page, fsdata); + if (copied < 0) + ret = copied; + + ret2 = ext4_journal_stop(handle); + if (!ret) + ret = ret2; + unlock_page(page); + page_cache_release(page); + + return ret ? ret : copied; +} + static int ext4_journalled_write_end(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned copied, @@ -2020,7 +2057,7 @@ static const struct address_space_operat .writepages = ext4_da_writepages, .sync_page = block_sync_page, .write_begin = ext4_da_write_begin, - .write_end = generic_write_end, + .write_end = ext4_da_write_end, .bmap = ext4_bmap, .invalidatepage = ext4_da_invalidatepage, .releasepage = ext4_releasepage, -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html