From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vyacheslav Dubeyko Subject: [PATCH] nilfs2: add logic for the case of file growing (old size <= new size) in nilfs_truncate() Date: Wed, 24 Apr 2013 15:44:26 +0400 Message-ID: <1366803866.2146.2.camel@slavad-ubuntu> Reply-To: slava@dubeyko.com Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Cc: Ryusuke Konishi , linux-fsdevel@vger.kernel.org, Andrew Morton To: linux-nilfs@vger.kernel.org Return-path: Received: from oproxy5-pub.bluehost.com ([67.222.38.55]:54844 "HELO oproxy5-pub.bluehost.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1756841Ab3DXLom (ORCPT ); Wed, 24 Apr 2013 07:44:42 -0400 Sender: linux-fsdevel-owner@vger.kernel.org List-ID: From: Vyacheslav Dubeyko 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 CC: Ryusuke Konishi --- 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