aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorChangman Lee <cm224.lee@samsung.com>2014-12-08 01:29:41 -0500
committerJaegeuk Kim <jaegeuk@kernel.org>2014-12-08 13:40:22 -0500
commit51455b19384d26afac4f214fab2ad0a4f1964e30 (patch)
tree170d57186dbd2f4461eb3f50a18a280345c13c34 /fs/f2fs
parent9c7bb702122fdf7c391f7d02c7d27a61a2c0c4b7 (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.c79
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
152static 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
152int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 172int 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 {
236sync_nodes: 246sync_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);
254flush_out: 262flush_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 }
259out: 266out:
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;