lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 20 Mar 2008 00:02:55 +0530 From: "Aneesh Kumar K.V" <aneesh.kumar@...ux.vnet.ibm.com> To: Eric Sandeen <sandeen@...hat.com> Cc: Mingming Cao <cmm@...ibm.com>, ext4 <linux-ext4@...r.kernel.org> Subject: Re: BUG with delayed allocation On Wed, Mar 19, 2008 at 09:42:13AM -0500, Eric Sandeen wrote: > 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. > > > > kenrel: 2.6.25-rc5 + > > With all the patches in the patch queue > > ... > > I also see this with only: > > patches/delalloc-vfs.patch > patches/delalloc-ext4.patch > > applied. This one seems to work for me. Need to think a bit more about parallel truncate. -aneesh diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 79930df..b74426d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1488,6 +1488,43 @@ out: return ret; } +static int ext4_da_writepage(struct page *page, + struct writeback_control *wbc) +{ + struct inode *inode = page->mapping->host; + handle_t *handle = NULL; + int ret = 0; + int err; + + if (ext4_journal_current_handle()) + goto out_fail; + + handle = ext4_journal_start(inode, ext4_writepage_trans_blocks(inode)); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_fail; + } + + if (test_opt(inode->i_sb, NOBH) && ext4_should_writeback_data(inode)) + ret = nobh_writepage(page, ext4_get_block, wbc); + else + ret = block_write_full_page(page, ext4_get_block, wbc); + + if (!ret && inode->i_size > EXT4_I(inode)->i_disksize) { + EXT4_I(inode)->i_disksize = inode->i_size; + ext4_mark_inode_dirty(handle, inode); + } + + err = ext4_journal_stop(handle); + if (!ret) + ret = err; + return ret; + +out_fail: + redirty_page_for_writepage(wbc, page); + unlock_page(page); + return ret; +} static int ext4_da_writepages(struct address_space *mapping, struct writeback_control *wbc) @@ -2015,7 +2052,7 @@ static const struct address_space_operations ext4_journalled_aops = { static const struct address_space_operations ext4_da_aops = { .readpage = ext4_readpage, .readpages = ext4_readpages, - .writepage = ext4_writeback_writepage, + .writepage = ext4_da_writepage, .writepages = ext4_da_writepages, .sync_page = block_sync_page, .write_begin = ext4_da_write_begin, -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists