f2fs: skip unnecessary data writes during fsync
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 25 Jul 2014 02:08:02 +0000 (19:08 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 30 Jul 2014 21:13:03 +0000 (14:13 -0700)
This patch intends to improve the fsync performance by skipping remaining the
recovery information, only when there is no data that we should recover.

Reviewed-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 7c652b3e1511f65884ef7be9c8ba0414b1f1bc0c..9b888fbf08b64335dbb6565ccae3174d76d0a72b 100644 (file)
@@ -133,6 +133,17 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
                return ret;
        }
 
+       /*
+        * if there is no written data, don't waste time to write recovery info.
+        */
+       if (!is_inode_flag_set(fi, FI_APPEND_WRITE) &&
+               !exist_written_data(sbi, inode->i_ino, APPEND_INO)) {
+               if (is_inode_flag_set(fi, FI_UPDATE_WRITE) ||
+                       exist_written_data(sbi, inode->i_ino, UPDATE_INO))
+                       goto flush_out;
+               goto out;
+       }
+
        /* guarantee free sections for fsync */
        f2fs_balance_fs(sbi);
 
@@ -188,6 +199,13 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
                ret = wait_on_node_pages_writeback(sbi, inode->i_ino);
                if (ret)
                        goto out;
+
+               /* once recovery info is written, don't need to tack this */
+               remove_dirty_inode(sbi, inode->i_ino, APPEND_INO);
+               clear_inode_flag(fi, FI_APPEND_WRITE);
+flush_out:
+               remove_dirty_inode(sbi, inode->i_ino, UPDATE_INO);
+               clear_inode_flag(fi, FI_UPDATE_WRITE);
                ret = f2fs_issue_flush(F2FS_SB(inode->i_sb));
        }
 out: