f2fs: record inode updating status correctly
authorChao Yu <yuchao0@huawei.com>
Wed, 2 Nov 2016 12:43:21 +0000 (20:43 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 23 Nov 2016 20:11:25 +0000 (12:11 -0800)
We should record updating status of inode only for living inode, for those
unlinked inode it needs to clear its ino cache, otherwise after the ino
was been reused, it will cause unneeded node page writing during ->fsync.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/inode.c

index 7b5e402f0a72dbd61b922bd2589fb9b46c1f3b02..af06bda51a5438a62f58695a8496f2844cf3b4c6 100644 (file)
@@ -377,6 +377,9 @@ void f2fs_evict_inode(struct inode *inode)
                goto no_delete;
 #endif
 
+       remove_ino_entry(sbi, inode->i_ino, APPEND_INO);
+       remove_ino_entry(sbi, inode->i_ino, UPDATE_INO);
+
        sb_start_intwrite(inode->i_sb);
        set_inode_flag(inode, FI_NO_ALLOC);
        i_size_write(inode, 0);
@@ -409,10 +412,12 @@ no_delete:
        invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino, inode->i_ino);
        if (xnid)
                invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid);
-       if (is_inode_flag_set(inode, FI_APPEND_WRITE))
-               add_ino_entry(sbi, inode->i_ino, APPEND_INO);
-       if (is_inode_flag_set(inode, FI_UPDATE_WRITE))
-               add_ino_entry(sbi, inode->i_ino, UPDATE_INO);
+       if (inode->i_nlink) {
+               if (is_inode_flag_set(inode, FI_APPEND_WRITE))
+                       add_ino_entry(sbi, inode->i_ino, APPEND_INO);
+               if (is_inode_flag_set(inode, FI_UPDATE_WRITE))
+                       add_ino_entry(sbi, inode->i_ino, UPDATE_INO);
+       }
        if (is_inode_flag_set(inode, FI_FREE_NID)) {
                alloc_nid_failed(sbi, inode->i_ino);
                clear_inode_flag(inode, FI_FREE_NID);