Loading fs/f2fs/file.c +43 −36 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -213,34 +233,22 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 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) /* * 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; } else { up_write(&fi->i_sem); } } else { 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; f2fs_write_inode(inode, NULL); goto sync_nodes; } Loading @@ -255,7 +263,6 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 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; Loading Loading
fs/f2fs/file.c +43 −36 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -213,34 +233,22 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 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) /* * 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; } else { up_write(&fi->i_sem); } } else { 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; f2fs_write_inode(inode, NULL); goto sync_nodes; } Loading @@ -255,7 +263,6 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 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; Loading