|
38 | 38 | #undef CREATE_TRACE_POINTS |
39 | 39 | #include <trace/hooks/fs.h> |
40 | 40 |
|
41 | | -static void f2fs_zero_post_eof_page(struct inode *inode, loff_t new_size) |
| 41 | +static void f2fs_zero_post_eof_page(struct inode *inode, |
| 42 | + loff_t new_size, bool lock) |
42 | 43 | { |
43 | 44 | loff_t old_size = i_size_read(inode); |
44 | 45 |
|
45 | 46 | if (old_size >= new_size) |
46 | 47 | return; |
47 | 48 |
|
| 49 | + if (mapping_empty(inode->i_mapping)) |
| 50 | + return; |
| 51 | + |
| 52 | + if (lock) |
| 53 | + filemap_invalidate_lock(inode->i_mapping); |
48 | 54 | /* zero or drop pages only in range of [old_size, new_size] */ |
49 | | - truncate_pagecache(inode, old_size); |
| 55 | + truncate_inode_pages_range(inode->i_mapping, old_size, new_size); |
| 56 | + if (lock) |
| 57 | + filemap_invalidate_unlock(inode->i_mapping); |
50 | 58 | } |
51 | 59 |
|
52 | 60 | vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf) |
@@ -117,9 +125,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf) |
117 | 125 |
|
118 | 126 | f2fs_bug_on(sbi, f2fs_has_inline_data(inode)); |
119 | 127 |
|
120 | | - filemap_invalidate_lock(inode->i_mapping); |
121 | | - f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT); |
122 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 128 | + f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT, true); |
123 | 129 |
|
124 | 130 | file_update_time(vmf->vma->vm_file); |
125 | 131 | filemap_invalidate_lock_shared(inode->i_mapping); |
@@ -1134,7 +1140,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, |
1134 | 1140 | filemap_invalidate_lock(inode->i_mapping); |
1135 | 1141 |
|
1136 | 1142 | if (attr->ia_size > old_size) |
1137 | | - f2fs_zero_post_eof_page(inode, attr->ia_size); |
| 1143 | + f2fs_zero_post_eof_page(inode, attr->ia_size, false); |
1138 | 1144 | truncate_setsize(inode, attr->ia_size); |
1139 | 1145 |
|
1140 | 1146 | if (attr->ia_size <= old_size) |
@@ -1253,9 +1259,7 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len) |
1253 | 1259 | if (ret) |
1254 | 1260 | return ret; |
1255 | 1261 |
|
1256 | | - filemap_invalidate_lock(inode->i_mapping); |
1257 | | - f2fs_zero_post_eof_page(inode, offset + len); |
1258 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 1262 | + f2fs_zero_post_eof_page(inode, offset + len, true); |
1259 | 1263 |
|
1260 | 1264 | pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; |
1261 | 1265 | pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; |
@@ -1540,7 +1544,7 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len) |
1540 | 1544 | f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1541 | 1545 | filemap_invalidate_lock(inode->i_mapping); |
1542 | 1546 |
|
1543 | | - f2fs_zero_post_eof_page(inode, offset + len); |
| 1547 | + f2fs_zero_post_eof_page(inode, offset + len, false); |
1544 | 1548 |
|
1545 | 1549 | f2fs_lock_op(sbi); |
1546 | 1550 | f2fs_drop_extent_tree(inode); |
@@ -1663,9 +1667,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len, |
1663 | 1667 | if (ret) |
1664 | 1668 | return ret; |
1665 | 1669 |
|
1666 | | - filemap_invalidate_lock(mapping); |
1667 | | - f2fs_zero_post_eof_page(inode, offset + len); |
1668 | | - filemap_invalidate_unlock(mapping); |
| 1670 | + f2fs_zero_post_eof_page(inode, offset + len, true); |
1669 | 1671 |
|
1670 | 1672 | pg_start = ((unsigned long long) offset) >> PAGE_SHIFT; |
1671 | 1673 | pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT; |
@@ -1799,7 +1801,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) |
1799 | 1801 | f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1800 | 1802 | filemap_invalidate_lock(mapping); |
1801 | 1803 |
|
1802 | | - f2fs_zero_post_eof_page(inode, offset + len); |
| 1804 | + f2fs_zero_post_eof_page(inode, offset + len, false); |
1803 | 1805 | truncate_pagecache(inode, offset); |
1804 | 1806 |
|
1805 | 1807 | while (!ret && idx > pg_start) { |
@@ -1857,9 +1859,7 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset, |
1857 | 1859 | if (err) |
1858 | 1860 | return err; |
1859 | 1861 |
|
1860 | | - filemap_invalidate_lock(inode->i_mapping); |
1861 | | - f2fs_zero_post_eof_page(inode, offset + len); |
1862 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 1862 | + f2fs_zero_post_eof_page(inode, offset + len, true); |
1863 | 1863 |
|
1864 | 1864 | f2fs_balance_fs(sbi, true); |
1865 | 1865 |
|
@@ -4912,9 +4912,8 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from) |
4912 | 4912 | if (err) |
4913 | 4913 | return err; |
4914 | 4914 |
|
4915 | | - filemap_invalidate_lock(inode->i_mapping); |
4916 | | - f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from)); |
4917 | | - filemap_invalidate_unlock(inode->i_mapping); |
| 4915 | + f2fs_zero_post_eof_page(inode, |
| 4916 | + iocb->ki_pos + iov_iter_count(from), true); |
4918 | 4917 | return count; |
4919 | 4918 | } |
4920 | 4919 |
|
|
0 commit comments