From: Vyacheslav Dubeyko <slava@xxxxxxxxxxx> Subject: [PATCH] nilfs2: add logic for the case of file growing (old size <= new size) in nilfs_truncate() There are situations when nilfs_truncate() is called with new value of i_size that is greater than old one. This patch adds logic for such case. Signed-off-by: Vyacheslav Dubeyko <slava@xxxxxxxxxxx> CC: Ryusuke Konishi <konishi.ryusuke@xxxxxxxxxxxxx> --- fs/nilfs2/inode.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 6b49f14..5ccaace 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c @@ -698,6 +698,36 @@ void nilfs_truncate(struct inode *inode) blocksize = sb->s_blocksize; blkoff = (inode->i_size + blocksize - 1) >> sb->s_blocksize_bits; + + if (blkoff > inode->i_blocks) { + int err; + struct address_space *mapping = inode->i_mapping; + struct page *page; + void *fsdata; + loff_t size = inode->i_size; + + err = pagecache_write_begin(NULL, mapping, size, 0, + AOP_FLAG_UNINTERRUPTIBLE, + &page, &fsdata); + if (err) { + printk(KERN_ERR + "NILFS: pagecache_write_begin() failed: err %d", + err); + return; + } + err = pagecache_write_end(NULL, mapping, size, + 0, 0, page, fsdata); + if (err < 0) { + printk(KERN_ERR + "NILFS: pagecache_write_end() failed: err %d", + err); + return; + } + mark_inode_dirty(inode); + return; + } else if (blkoff == inode->i_blocks) + return; + nilfs_transaction_begin(sb, &ti, 0); /* never fails */ block_truncate_page(inode->i_mapping, inode->i_size, nilfs_get_block); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html