f2fs: truncate stale block for inline_data
Jaegeuk Kim [Mon, 25 Aug 2014 21:45:59 +0000 (14:45 -0700)]
This verifies to truncate any allocated blocks, offset[0], by inline_data.
Not figured out, but for making sure.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

Conflicts:
fs/f2fs/node.c

Change-Id: Icd98dbf108de75fb7af7d8d00be7fc6df239792a

fs/f2fs/node.c

index 73f98eb..1afe574 100644 (file)
@@ -836,26 +836,30 @@ int truncate_xattr_node(struct inode *inode, struct page *page)
  */
 void remove_inode_page(struct inode *inode)
 {
-       struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
-       struct page *page;
-       nid_t ino = inode->i_ino;
        struct dnode_of_data dn;
 
-       page = get_node_page(sbi, ino);
-       if (IS_ERR(page))
+       set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
+       if (get_dnode_of_data(&dn, 0, LOOKUP_NODE))
                return;
 
-       if (truncate_xattr_node(inode, page)) {
-               f2fs_put_page(page, 1);
+       if (truncate_xattr_node(inode, dn.inode_page)) {
+               f2fs_put_dnode(&dn);
                return;
        }
-       /* 0 is possible, after f2fs_new_inode() is failed */
+       /* remove potential inline_data blocks */
+       if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
+                               S_ISLNK(inode->i_mode))
+               truncate_data_blocks_range(&dn, 1);
+
+       /* 0 is possible, after f2fs_new_inode() has failed */
        if (inode->i_blocks != 0 && inode->i_blocks != 1) {
-               f2fs_msg(sbi->sb, KERN_ERR, "inode %u still has %llu blocks",
-                               ino, (unsigned long long)inode->i_blocks);
+               struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
+               f2fs_msg(sbi->sb, KERN_ERR, "inode %lu still has %llu blocks",
+                        inode->i_ino, (unsigned long long)inode->i_blocks);
                f2fs_handle_error(sbi);
        }
-       set_new_dnode(&dn, inode, page, page, ino);
+
+       /* will put inode & node pages */
        truncate_node(&dn);
 }