diff options
author | Changman Lee <cm224.lee@samsung.com> | 2014-12-08 01:29:41 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2014-12-08 13:40:22 -0500 |
commit | 51455b19384d26afac4f214fab2ad0a4f1964e30 (patch) | |
tree | 170d57186dbd2f4461eb3f50a18a280345c13c34 /fs/f2fs | |
parent | 9c7bb702122fdf7c391f7d02c7d27a61a2c0c4b7 (diff) |
f2fs: cleanup path to need cp at fsync
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>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/file.c | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 0b9700216303..3c27e0ecb3bc 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -149,6 +149,26 @@ static bool need_inode_page_update(struct f2fs_sb_info *sbi, nid_t ino) | |||
149 | return ret; | 149 | return ret; |
150 | } | 150 | } |
151 | 151 | ||
152 | static void try_to_fix_pino(struct inode *inode) | ||
153 | { | ||
154 | struct f2fs_inode_info *fi = F2FS_I(inode); | ||
155 | nid_t pino; | ||
156 | |||
157 | down_write(&fi->i_sem); | ||
158 | fi->xattr_ver = 0; | ||
159 | if (file_wrong_pino(inode) && inode->i_nlink == 1 && | ||
160 | get_parent_ino(inode, &pino)) { | ||
161 | fi->i_pino = pino; | ||
162 | file_got_pino(inode); | ||
163 | up_write(&fi->i_sem); | ||
164 | |||
165 | mark_inode_dirty_sync(inode); | ||
166 | f2fs_write_inode(inode, NULL); | ||
167 | } else { | ||
168 | up_write(&fi->i_sem); | ||
169 | } | ||
170 | } | ||
171 | |||
152 | int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | 172 | int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) |
153 | { | 173 | { |
154 | struct inode *inode = file->f_mapping->host; | 174 | struct inode *inode = file->f_mapping->host; |
@@ -213,49 +233,36 @@ go_write: | |||
213 | up_read(&fi->i_sem); | 233 | up_read(&fi->i_sem); |
214 | 234 | ||
215 | if (need_cp) { | 235 | if (need_cp) { |
216 | nid_t pino; | ||
217 | |||
218 | /* all the dirty node pages should be flushed for POR */ | 236 | /* all the dirty node pages should be flushed for POR */ |
219 | ret = f2fs_sync_fs(inode->i_sb, 1); | 237 | ret = f2fs_sync_fs(inode->i_sb, 1); |
220 | 238 | ||
221 | down_write(&fi->i_sem); | 239 | /* |
222 | fi->xattr_ver = 0; | 240 | * We've secured consistency through sync_fs. Following pino |
223 | if (file_wrong_pino(inode) && inode->i_nlink == 1 && | 241 | * will be used only for fsynced inodes after checkpoint. |
224 | get_parent_ino(inode, &pino)) { | 242 | */ |
225 | fi->i_pino = pino; | 243 | try_to_fix_pino(inode); |
226 | file_got_pino(inode); | 244 | goto out; |
227 | up_write(&fi->i_sem); | 245 | } |
228 | mark_inode_dirty_sync(inode); | ||
229 | ret = f2fs_write_inode(inode, NULL); | ||
230 | if (ret) | ||
231 | goto out; | ||
232 | } else { | ||
233 | up_write(&fi->i_sem); | ||
234 | } | ||
235 | } else { | ||
236 | sync_nodes: | 246 | sync_nodes: |
237 | sync_node_pages(sbi, ino, &wbc); | 247 | sync_node_pages(sbi, ino, &wbc); |
238 | |||
239 | if (need_inode_block_update(sbi, ino)) { | ||
240 | mark_inode_dirty_sync(inode); | ||
241 | ret = f2fs_write_inode(inode, NULL); | ||
242 | if (ret) | ||
243 | goto out; | ||
244 | goto sync_nodes; | ||
245 | } | ||
246 | 248 | ||
247 | ret = wait_on_node_pages_writeback(sbi, ino); | 249 | if (need_inode_block_update(sbi, ino)) { |
248 | if (ret) | 250 | mark_inode_dirty_sync(inode); |
249 | goto out; | 251 | f2fs_write_inode(inode, NULL); |
252 | goto sync_nodes; | ||
253 | } | ||
250 | 254 | ||
251 | /* once recovery info is written, don't need to tack this */ | 255 | ret = wait_on_node_pages_writeback(sbi, ino); |
252 | remove_dirty_inode(sbi, ino, APPEND_INO); | 256 | if (ret) |
253 | clear_inode_flag(fi, FI_APPEND_WRITE); | 257 | goto out; |
258 | |||
259 | /* once recovery info is written, don't need to tack this */ | ||
260 | remove_dirty_inode(sbi, ino, APPEND_INO); | ||
261 | clear_inode_flag(fi, FI_APPEND_WRITE); | ||
254 | flush_out: | 262 | flush_out: |
255 | remove_dirty_inode(sbi, ino, UPDATE_INO); | 263 | remove_dirty_inode(sbi, ino, UPDATE_INO); |
256 | clear_inode_flag(fi, FI_UPDATE_WRITE); | 264 | clear_inode_flag(fi, FI_UPDATE_WRITE); |
257 | ret = f2fs_issue_flush(sbi); | 265 | ret = f2fs_issue_flush(sbi); |
258 | } | ||
259 | out: | 266 | out: |
260 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); | 267 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); |
261 | return ret; | 268 | return ret; |