|
35 | 35 | #include <trace/events/f2fs.h> |
36 | 36 | #include <uapi/linux/f2fs.h> |
37 | 37 |
|
38 | | -static void f2fs_zero_post_eof_page(struct inode *inode, loff_t new_size) |
| 38 | +static void f2fs_zero_post_eof_page(struct inode *inode, |
| 39 | + loff_t new_size, bool lock) |
39 | 40 | { |
40 | 41 | loff_t old_size = i_size_read(inode); |
41 | 42 |
|
42 | 43 | if (old_size >= new_size) |
43 | 44 | return; |
44 | 45 |
|
| 46 | + if (mapping_empty(inode->i_mapping)) |
| 47 | + return; |
| 48 | + |
| 49 | + if (lock) |
| 50 | + filemap_invalidate_lock(inode->i_mapping); |
45 | 51 | /* zero or drop pages only in range of [old_size, new_size] */ |
46 | | - truncate_pagecache(inode, old_size); |
| 52 | + truncate_inode_pages_range(inode->i_mapping, old_size, new_size); |
| 53 | + if (lock) |
| 54 | + filemap_invalidate_unlock(inode->i_mapping); |
47 | 55 | } |
48 | 56 |
|
49 | 57 | static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) |
@@ -114,9 +122,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) |
114 | 122 |
|
115 | 123 | f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); |
116 | 124 |
|
117 | | - filemap_invalidate_lock(inode->i_mapping); |
118 | | - f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT); |
119 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 125 | + f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT, true); |
120 | 126 |
|
121 | 127 | file_update_time(vmf->vma->vm_file); |
122 | 128 | filemap_invalidate_lock_shared(inode->i_mapping); |
@@ -1149,7 +1155,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, |
1149 | 1155 | filemap_invalidate_lock(inode->i_mapping); |
1150 | 1156 |
|
1151 | 1157 | if (attr->ia_size > old_size) |
1152 | | - f2fs_zero_post_eof_page(inode, attr->ia_size); |
| 1158 | + f2fs_zero_post_eof_page(inode, attr->ia_size, false); |
1153 | 1159 | truncate_setsize(inode, attr->ia_size); |
1154 | 1160 |
|
1155 | 1161 | if (attr->ia_size <= old_size) |
@@ -1268,9 +1274,7 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len) |
1268 | 1274 | if (ret) |
1269 | 1275 | return ret; |
1270 | 1276 |
|
1271 | | - filemap_invalidate_lock(inode->i_mapping); |
1272 | | - f2fs_zero_post_eof_page(inode, offset + len); |
1273 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 1277 | + f2fs_zero_post_eof_page(inode, offset + len, true); |
1274 | 1278 |
|
1275 | 1279 | pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; |
1276 | 1280 | pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; |
@@ -1555,7 +1559,7 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len) |
1555 | 1559 | f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1556 | 1560 | filemap_invalidate_lock(inode->i_mapping); |
1557 | 1561 |
|
1558 | | - f2fs_zero_post_eof_page(inode, offset + len); |
| 1562 | + f2fs_zero_post_eof_page(inode, offset + len, false); |
1559 | 1563 |
|
1560 | 1564 | f2fs_lock_op(sbi); |
1561 | 1565 | f2fs_drop_extent_tree(inode); |
@@ -1678,9 +1682,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, |
1678 | 1682 | if (ret) |
1679 | 1683 | return ret; |
1680 | 1684 |
|
1681 | | - filemap_invalidate_lock(mapping); |
1682 | | - f2fs_zero_post_eof_page(inode, offset + len); |
1683 | | - filemap_invalidate_unlock(mapping); |
| 1685 | + f2fs_zero_post_eof_page(inode, offset + len, true); |
1684 | 1686 |
|
1685 | 1687 | pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; |
1686 | 1688 | pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; |
@@ -1814,7 +1816,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) |
1814 | 1816 | f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1815 | 1817 | filemap_invalidate_lock(mapping); |
1816 | 1818 |
|
1817 | | - f2fs_zero_post_eof_page(inode, offset + len); |
| 1819 | + f2fs_zero_post_eof_page(inode, offset + len, false); |
1818 | 1820 | truncate_pagecache(inode, offset); |
1819 | 1821 |
|
1820 | 1822 | while (!ret && idx > pg_start) { |
@@ -1872,9 +1874,7 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, |
1872 | 1874 | if (err) |
1873 | 1875 | return err; |
1874 | 1876 |
|
1875 | | - filemap_invalidate_lock(inode->i_mapping); |
1876 | | - f2fs_zero_post_eof_page(inode, offset + len); |
1877 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 1877 | + f2fs_zero_post_eof_page(inode, offset + len, true); |
1878 | 1878 |
|
1879 | 1879 | f2fs_balance_fs(sbi, true); |
1880 | 1880 |
|
@@ -4922,9 +4922,8 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from) |
4922 | 4922 | if (err) |
4923 | 4923 | return err; |
4924 | 4924 |
|
4925 | | - filemap_invalidate_lock(inode->i_mapping); |
4926 | | - f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from)); |
4927 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 4925 | + f2fs_zero_post_eof_page(inode, |
| 4926 | + iocb->ki_pos + iov_iter_count(from), true); |
4928 | 4927 | return count; |
4929 | 4928 | } |
4930 | 4929 |
|
|
0 commit comments