f2fs: fix to avoid redundant discard during fstrim
[cascardo/linux.git] / fs / f2fs / recovery.c
index 3d7216d..a39d84a 100644 (file)
@@ -175,7 +175,7 @@ static void recover_inode(struct inode *inode, struct page *page)
        char *name;
 
        inode->i_mode = le16_to_cpu(raw->i_mode);
-       i_size_write(inode, le64_to_cpu(raw->i_size));
+       f2fs_i_size_write(inode, le64_to_cpu(raw->i_size));
        inode->i_atime.tv_sec = le64_to_cpu(raw->i_mtime);
        inode->i_ctime.tv_sec = le64_to_cpu(raw->i_ctime);
        inode->i_mtime.tv_sec = le64_to_cpu(raw->i_mtime);
@@ -455,6 +455,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
                        continue;
                }
 
+               if ((start + 1) << PAGE_SHIFT > i_size_read(inode))
+                       f2fs_i_size_write(inode, (start + 1) << PAGE_SHIFT);
+
                /*
                 * dest is reserved block, invalidate src block
                 * and then reserve one new block in dnode page.
@@ -490,9 +493,6 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
                }
        }
 
-       if (IS_INODE(dn.node_page))
-               sync_inode_page(&dn);
-
        copy_node_footer(dn.node_page, page);
        fill_node_footer(dn.node_page, dn.nid, ni.ino,
                                        ofs_of_node(page), false);
@@ -624,8 +624,12 @@ out:
        if (err) {
                bool invalidate = false;
 
-               if (discard_next_dnode(sbi, blkaddr))
+               if (test_opt(sbi, LFS)) {
+                       update_meta_page(sbi, NULL, blkaddr);
                        invalidate = true;
+               } else if (discard_next_dnode(sbi, blkaddr)) {
+                       invalidate = true;
+               }
 
                /* Flush all the NAT/SIT pages */
                while (get_pages(sbi, F2FS_DIRTY_META))