]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
f2fs: cleanup path to need cp at fsync
authorChangman Lee <cm224.lee@samsung.com>
Mon, 8 Dec 2014 06:29:41 +0000 (15:29 +0900)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 8 Dec 2014 18:40:22 +0000 (10:40 -0800)
Added some commentaries for code readability and cleaned up if-statement
clearly.

Signed-off-by: Changman Lee <cm224.lee@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 0b97002163035fc7c7ce63933dd17ff705e2f823..3c27e0ecb3bcf1d57a1b349b0e00b30ce99cd43f 100644 (file)
@@ -149,6 +149,26 @@ static bool need_inode_page_update(struct f2fs_sb_info *sbi, nid_t ino)
        return ret;
 }
 
+static void try_to_fix_pino(struct inode *inode)
+{
+       struct f2fs_inode_info *fi = F2FS_I(inode);
+       nid_t pino;
+
+       down_write(&fi->i_sem);
+       fi->xattr_ver = 0;
+       if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
+                       get_parent_ino(inode, &pino)) {
+               fi->i_pino = pino;
+               file_got_pino(inode);
+               up_write(&fi->i_sem);
+
+               mark_inode_dirty_sync(inode);
+               f2fs_write_inode(inode, NULL);
+       } else {
+               up_write(&fi->i_sem);
+       }
+}
+
 int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 {
        struct inode *inode = file->f_mapping->host;
@@ -213,49 +233,36 @@ go_write:
        up_read(&fi->i_sem);
 
        if (need_cp) {
-               nid_t pino;
-
                /* all the dirty node pages should be flushed for POR */
                ret = f2fs_sync_fs(inode->i_sb, 1);
 
-               down_write(&fi->i_sem);
-               fi->xattr_ver = 0;
-               if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
-                                       get_parent_ino(inode, &pino)) {
-                       fi->i_pino = pino;
-                       file_got_pino(inode);
-                       up_write(&fi->i_sem);
-                       mark_inode_dirty_sync(inode);
-                       ret = f2fs_write_inode(inode, NULL);
-                       if (ret)
-                               goto out;
-               } else {
-                       up_write(&fi->i_sem);
-               }
-       } else {
+               /*
+                * We've secured consistency through sync_fs. Following pino
+                * will be used only for fsynced inodes after checkpoint.
+                */
+               try_to_fix_pino(inode);
+               goto out;
+       }
 sync_nodes:
-               sync_node_pages(sbi, ino, &wbc);
-
-               if (need_inode_block_update(sbi, ino)) {
-                       mark_inode_dirty_sync(inode);
-                       ret = f2fs_write_inode(inode, NULL);
-                       if (ret)
-                               goto out;
-                       goto sync_nodes;
-               }
+       sync_node_pages(sbi, ino, &wbc);
 
-               ret = wait_on_node_pages_writeback(sbi, ino);
-               if (ret)
-                       goto out;
+       if (need_inode_block_update(sbi, ino)) {
+               mark_inode_dirty_sync(inode);
+               f2fs_write_inode(inode, NULL);
+               goto sync_nodes;
+       }
 
-               /* once recovery info is written, don't need to tack this */
-               remove_dirty_inode(sbi, ino, APPEND_INO);
-               clear_inode_flag(fi, FI_APPEND_WRITE);
+       ret = wait_on_node_pages_writeback(sbi, ino);
+       if (ret)
+               goto out;
+
+       /* once recovery info is written, don't need to tack this */
+       remove_dirty_inode(sbi, ino, APPEND_INO);
+       clear_inode_flag(fi, FI_APPEND_WRITE);
 flush_out:
-               remove_dirty_inode(sbi, ino, UPDATE_INO);
-               clear_inode_flag(fi, FI_UPDATE_WRITE);
-               ret = f2fs_issue_flush(sbi);
-       }
+       remove_dirty_inode(sbi, ino, UPDATE_INO);
+       clear_inode_flag(fi, FI_UPDATE_WRITE);
+       ret = f2fs_issue_flush(sbi);
 out:
        trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret);
        return ret;