f2fs: do not skip latest inode information
authorJaegeuk Kim <jaegeuk@kernel.org>
Wed, 10 Sep 2014 22:04:03 +0000 (15:04 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 23 Sep 2014 18:10:16 +0000 (11:10 -0700)
In f2fs_sync_file, if there is no written appended writes, it skips
to write its node blocks.
But, if there is up-to-date inode page, we should write it to update
its metadata during the roll-forward recovery.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 3035c791d934355989f796c812f7fb5361133705..a041c66fd611300043f54d2d721a0325f1baf312 100644 (file)
@@ -169,12 +169,21 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
         */
        if (!is_inode_flag_set(fi, FI_APPEND_WRITE) &&
                        !exist_written_data(sbi, ino, APPEND_INO)) {
+               struct page *i = find_get_page(NODE_MAPPING(sbi), ino);
+
+               /* But we need to avoid that there are some inode updates */
+               if ((i && PageDirty(i)) || need_inode_block_update(sbi, ino)) {
+                       f2fs_put_page(i, 0);
+                       goto go_write;
+               }
+               f2fs_put_page(i, 0);
+
                if (is_inode_flag_set(fi, FI_UPDATE_WRITE) ||
                                exist_written_data(sbi, ino, UPDATE_INO))
                        goto flush_out;
                goto out;
        }
-
+go_write:
        /* guarantee free sections for fsync */
        f2fs_balance_fs(sbi);