From: Vyacheslav Dubeyko <[email protected]>
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 <[email protected]>
CC: Ryusuke Konishi <[email protected]>
---
 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-nilfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to