diff options
Diffstat (limited to 'fs/f2fs/file.c')
-rw-r--r-- | fs/f2fs/file.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index f9e085dfb1f0..3191b52aafb0 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -96,8 +96,9 @@ out: | |||
96 | } | 96 | } |
97 | 97 | ||
98 | static const struct vm_operations_struct f2fs_file_vm_ops = { | 98 | static const struct vm_operations_struct f2fs_file_vm_ops = { |
99 | .fault = filemap_fault, | 99 | .fault = filemap_fault, |
100 | .page_mkwrite = f2fs_vm_page_mkwrite, | 100 | .page_mkwrite = f2fs_vm_page_mkwrite, |
101 | .remap_pages = generic_file_remap_pages, | ||
101 | }; | 102 | }; |
102 | 103 | ||
103 | static int need_to_sync_dir(struct f2fs_sb_info *sbi, struct inode *inode) | 104 | static int need_to_sync_dir(struct f2fs_sb_info *sbi, struct inode *inode) |
@@ -137,6 +138,9 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
137 | if (ret) | 138 | if (ret) |
138 | return ret; | 139 | return ret; |
139 | 140 | ||
141 | /* guarantee free sections for fsync */ | ||
142 | f2fs_balance_fs(sbi); | ||
143 | |||
140 | mutex_lock(&inode->i_mutex); | 144 | mutex_lock(&inode->i_mutex); |
141 | 145 | ||
142 | if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) | 146 | if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) |
@@ -160,15 +164,17 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
160 | if (need_to_sync_dir(sbi, inode)) | 164 | if (need_to_sync_dir(sbi, inode)) |
161 | need_cp = true; | 165 | need_cp = true; |
162 | 166 | ||
163 | f2fs_write_inode(inode, NULL); | ||
164 | |||
165 | if (need_cp) { | 167 | if (need_cp) { |
166 | /* all the dirty node pages should be flushed for POR */ | 168 | /* all the dirty node pages should be flushed for POR */ |
167 | ret = f2fs_sync_fs(inode->i_sb, 1); | 169 | ret = f2fs_sync_fs(inode->i_sb, 1); |
168 | clear_inode_flag(F2FS_I(inode), FI_NEED_CP); | 170 | clear_inode_flag(F2FS_I(inode), FI_NEED_CP); |
169 | } else { | 171 | } else { |
170 | while (sync_node_pages(sbi, inode->i_ino, &wbc) == 0) | 172 | /* if there is no written node page, write its inode page */ |
171 | f2fs_write_inode(inode, NULL); | 173 | while (!sync_node_pages(sbi, inode->i_ino, &wbc)) { |
174 | ret = f2fs_write_inode(inode, NULL); | ||
175 | if (ret) | ||
176 | goto out; | ||
177 | } | ||
172 | filemap_fdatawait_range(sbi->node_inode->i_mapping, | 178 | filemap_fdatawait_range(sbi->node_inode->i_mapping, |
173 | 0, LONG_MAX); | 179 | 0, LONG_MAX); |
174 | } | 180 | } |
@@ -405,6 +411,8 @@ int truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end) | |||
405 | struct dnode_of_data dn; | 411 | struct dnode_of_data dn; |
406 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 412 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); |
407 | 413 | ||
414 | f2fs_balance_fs(sbi); | ||
415 | |||
408 | mutex_lock_op(sbi, DATA_TRUNC); | 416 | mutex_lock_op(sbi, DATA_TRUNC); |
409 | set_new_dnode(&dn, inode, NULL, NULL, 0); | 417 | set_new_dnode(&dn, inode, NULL, NULL, 0); |
410 | err = get_dnode_of_data(&dn, index, RDONLY_NODE); | 418 | err = get_dnode_of_data(&dn, index, RDONLY_NODE); |
@@ -532,7 +540,6 @@ static long f2fs_fallocate(struct file *file, int mode, | |||
532 | loff_t offset, loff_t len) | 540 | loff_t offset, loff_t len) |
533 | { | 541 | { |
534 | struct inode *inode = file->f_path.dentry->d_inode; | 542 | struct inode *inode = file->f_path.dentry->d_inode; |
535 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | ||
536 | long ret; | 543 | long ret; |
537 | 544 | ||
538 | if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) | 545 | if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) |
@@ -543,7 +550,10 @@ static long f2fs_fallocate(struct file *file, int mode, | |||
543 | else | 550 | else |
544 | ret = expand_inode_data(inode, offset, len, mode); | 551 | ret = expand_inode_data(inode, offset, len, mode); |
545 | 552 | ||
546 | f2fs_balance_fs(sbi); | 553 | if (!ret) { |
554 | inode->i_mtime = inode->i_ctime = CURRENT_TIME; | ||
555 | mark_inode_dirty(inode); | ||
556 | } | ||
547 | return ret; | 557 | return ret; |
548 | } | 558 | } |
549 | 559 | ||