diff options
Diffstat (limited to 'fs/f2fs/file.c')
-rw-r--r-- | fs/f2fs/file.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 1edc86e874e3..78e65288f2b2 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/uaccess.h> | 20 | #include <linux/uaccess.h> |
21 | #include <linux/mount.h> | 21 | #include <linux/mount.h> |
22 | #include <linux/pagevec.h> | 22 | #include <linux/pagevec.h> |
23 | #include <linux/uio.h> | ||
23 | #include <linux/uuid.h> | 24 | #include <linux/uuid.h> |
24 | #include <linux/file.h> | 25 | #include <linux/file.h> |
25 | 26 | ||
@@ -140,8 +141,6 @@ static inline bool need_do_checkpoint(struct inode *inode) | |||
140 | need_cp = true; | 141 | need_cp = true; |
141 | else if (!is_checkpointed_node(sbi, F2FS_I(inode)->i_pino)) | 142 | else if (!is_checkpointed_node(sbi, F2FS_I(inode)->i_pino)) |
142 | need_cp = true; | 143 | need_cp = true; |
143 | else if (F2FS_I(inode)->xattr_ver == cur_cp_version(F2FS_CKPT(sbi))) | ||
144 | need_cp = true; | ||
145 | else if (test_opt(sbi, FASTBOOT)) | 144 | else if (test_opt(sbi, FASTBOOT)) |
146 | need_cp = true; | 145 | need_cp = true; |
147 | else if (sbi->active_logs == 2) | 146 | else if (sbi->active_logs == 2) |
@@ -167,7 +166,6 @@ static void try_to_fix_pino(struct inode *inode) | |||
167 | nid_t pino; | 166 | nid_t pino; |
168 | 167 | ||
169 | down_write(&fi->i_sem); | 168 | down_write(&fi->i_sem); |
170 | fi->xattr_ver = 0; | ||
171 | if (file_wrong_pino(inode) && inode->i_nlink == 1 && | 169 | if (file_wrong_pino(inode) && inode->i_nlink == 1 && |
172 | get_parent_ino(inode, &pino)) { | 170 | get_parent_ino(inode, &pino)) { |
173 | f2fs_i_pino_write(inode, pino); | 171 | f2fs_i_pino_write(inode, pino); |
@@ -276,7 +274,8 @@ sync_nodes: | |||
276 | flush_out: | 274 | flush_out: |
277 | remove_ino_entry(sbi, ino, UPDATE_INO); | 275 | remove_ino_entry(sbi, ino, UPDATE_INO); |
278 | clear_inode_flag(inode, FI_UPDATE_WRITE); | 276 | clear_inode_flag(inode, FI_UPDATE_WRITE); |
279 | ret = f2fs_issue_flush(sbi); | 277 | if (!atomic) |
278 | ret = f2fs_issue_flush(sbi); | ||
280 | f2fs_update_time(sbi, REQ_TIME); | 279 | f2fs_update_time(sbi, REQ_TIME); |
281 | out: | 280 | out: |
282 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); | 281 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); |
@@ -567,8 +566,9 @@ int truncate_blocks(struct inode *inode, u64 from, bool lock) | |||
567 | } | 566 | } |
568 | 567 | ||
569 | if (f2fs_has_inline_data(inode)) { | 568 | if (f2fs_has_inline_data(inode)) { |
570 | if (truncate_inline_inode(ipage, from)) | 569 | truncate_inline_inode(ipage, from); |
571 | set_page_dirty(ipage); | 570 | if (from == 0) |
571 | clear_inode_flag(inode, FI_DATA_EXIST); | ||
572 | f2fs_put_page(ipage, 1); | 572 | f2fs_put_page(ipage, 1); |
573 | truncate_page = true; | 573 | truncate_page = true; |
574 | goto out; | 574 | goto out; |
@@ -1541,6 +1541,8 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) | |||
1541 | if (ret) | 1541 | if (ret) |
1542 | clear_inode_flag(inode, FI_ATOMIC_FILE); | 1542 | clear_inode_flag(inode, FI_ATOMIC_FILE); |
1543 | out: | 1543 | out: |
1544 | stat_inc_atomic_write(inode); | ||
1545 | stat_update_max_atomic_write(inode); | ||
1544 | inode_unlock(inode); | 1546 | inode_unlock(inode); |
1545 | mnt_drop_write_file(filp); | 1547 | mnt_drop_write_file(filp); |
1546 | return ret; | 1548 | return ret; |
@@ -1564,15 +1566,18 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp) | |||
1564 | goto err_out; | 1566 | goto err_out; |
1565 | 1567 | ||
1566 | if (f2fs_is_atomic_file(inode)) { | 1568 | if (f2fs_is_atomic_file(inode)) { |
1567 | clear_inode_flag(inode, FI_ATOMIC_FILE); | ||
1568 | ret = commit_inmem_pages(inode); | 1569 | ret = commit_inmem_pages(inode); |
1569 | if (ret) { | 1570 | if (ret) |
1570 | set_inode_flag(inode, FI_ATOMIC_FILE); | ||
1571 | goto err_out; | 1571 | goto err_out; |
1572 | |||
1573 | ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | ||
1574 | if (!ret) { | ||
1575 | clear_inode_flag(inode, FI_ATOMIC_FILE); | ||
1576 | stat_dec_atomic_write(inode); | ||
1572 | } | 1577 | } |
1578 | } else { | ||
1579 | ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | ||
1573 | } | 1580 | } |
1574 | |||
1575 | ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | ||
1576 | err_out: | 1581 | err_out: |
1577 | inode_unlock(inode); | 1582 | inode_unlock(inode); |
1578 | mnt_drop_write_file(filp); | 1583 | mnt_drop_write_file(filp); |
@@ -1870,7 +1875,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi, | |||
1870 | { | 1875 | { |
1871 | struct inode *inode = file_inode(filp); | 1876 | struct inode *inode = file_inode(filp); |
1872 | struct f2fs_map_blocks map = { .m_next_pgofs = NULL }; | 1877 | struct f2fs_map_blocks map = { .m_next_pgofs = NULL }; |
1873 | struct extent_info ei; | 1878 | struct extent_info ei = {0,0,0}; |
1874 | pgoff_t pg_start, pg_end; | 1879 | pgoff_t pg_start, pg_end; |
1875 | unsigned int blk_per_seg = sbi->blocks_per_seg; | 1880 | unsigned int blk_per_seg = sbi->blocks_per_seg; |
1876 | unsigned int total = 0, sec_num; | 1881 | unsigned int total = 0, sec_num; |
@@ -2250,8 +2255,12 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
2250 | inode_lock(inode); | 2255 | inode_lock(inode); |
2251 | ret = generic_write_checks(iocb, from); | 2256 | ret = generic_write_checks(iocb, from); |
2252 | if (ret > 0) { | 2257 | if (ret > 0) { |
2253 | int err = f2fs_preallocate_blocks(iocb, from); | 2258 | int err; |
2259 | |||
2260 | if (iov_iter_fault_in_readable(from, iov_iter_count(from))) | ||
2261 | set_inode_flag(inode, FI_NO_PREALLOC); | ||
2254 | 2262 | ||
2263 | err = f2fs_preallocate_blocks(iocb, from); | ||
2255 | if (err) { | 2264 | if (err) { |
2256 | inode_unlock(inode); | 2265 | inode_unlock(inode); |
2257 | return err; | 2266 | return err; |
@@ -2259,6 +2268,7 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
2259 | blk_start_plug(&plug); | 2268 | blk_start_plug(&plug); |
2260 | ret = __generic_file_write_iter(iocb, from); | 2269 | ret = __generic_file_write_iter(iocb, from); |
2261 | blk_finish_plug(&plug); | 2270 | blk_finish_plug(&plug); |
2271 | clear_inode_flag(inode, FI_NO_PREALLOC); | ||
2262 | } | 2272 | } |
2263 | inode_unlock(inode); | 2273 | inode_unlock(inode); |
2264 | 2274 | ||