|
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) |
| 39 | +{ |
| 40 | + loff_t old_size = i_size_read(inode); |
| 41 | + |
| 42 | + if (old_size >= new_size) |
| 43 | + return; |
| 44 | + |
| 45 | + /* zero or drop pages only in range of [old_size, new_size] */ |
| 46 | + truncate_pagecache(inode, old_size); |
| 47 | +} |
| 48 | + |
38 | 49 | static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
|
39 | 50 | {
|
40 | 51 | struct inode *inode = file_inode(vmf->vma->vm_file);
|
@@ -103,8 +114,13 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
|
103 | 114 |
|
104 | 115 | f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
|
105 | 116 |
|
| 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); |
| 120 | + |
106 | 121 | file_update_time(vmf->vma->vm_file);
|
107 | 122 | filemap_invalidate_lock_shared(inode->i_mapping);
|
| 123 | + |
108 | 124 | folio_lock(folio);
|
109 | 125 | if (unlikely(folio->mapping != inode->i_mapping ||
|
110 | 126 | folio_pos(folio) > i_size_read(inode) ||
|
@@ -1109,6 +1125,8 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
|
1109 | 1125 | f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
|
1110 | 1126 | filemap_invalidate_lock(inode->i_mapping);
|
1111 | 1127 |
|
| 1128 | + if (attr->ia_size > old_size) |
| 1129 | + f2fs_zero_post_eof_page(inode, attr->ia_size); |
1112 | 1130 | truncate_setsize(inode, attr->ia_size);
|
1113 | 1131 |
|
1114 | 1132 | if (attr->ia_size <= old_size)
|
@@ -1227,6 +1245,10 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
|
1227 | 1245 | if (ret)
|
1228 | 1246 | return ret;
|
1229 | 1247 |
|
| 1248 | + filemap_invalidate_lock(inode->i_mapping); |
| 1249 | + f2fs_zero_post_eof_page(inode, offset + len); |
| 1250 | + filemap_invalidate_unlock(inode->i_mapping); |
| 1251 | + |
1230 | 1252 | pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
|
1231 | 1253 | pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
|
1232 | 1254 |
|
@@ -1510,6 +1532,8 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
|
1510 | 1532 | f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
|
1511 | 1533 | filemap_invalidate_lock(inode->i_mapping);
|
1512 | 1534 |
|
| 1535 | + f2fs_zero_post_eof_page(inode, offset + len); |
| 1536 | + |
1513 | 1537 | f2fs_lock_op(sbi);
|
1514 | 1538 | f2fs_drop_extent_tree(inode);
|
1515 | 1539 | truncate_pagecache(inode, offset);
|
@@ -1631,6 +1655,10 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
|
1631 | 1655 | if (ret)
|
1632 | 1656 | return ret;
|
1633 | 1657 |
|
| 1658 | + filemap_invalidate_lock(mapping); |
| 1659 | + f2fs_zero_post_eof_page(inode, offset + len); |
| 1660 | + filemap_invalidate_unlock(mapping); |
| 1661 | + |
1634 | 1662 | pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
|
1635 | 1663 | pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
|
1636 | 1664 |
|
@@ -1762,6 +1790,8 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
|
1762 | 1790 | /* avoid gc operation during block exchange */
|
1763 | 1791 | f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
|
1764 | 1792 | filemap_invalidate_lock(mapping);
|
| 1793 | + |
| 1794 | + f2fs_zero_post_eof_page(inode, offset + len); |
1765 | 1795 | truncate_pagecache(inode, offset);
|
1766 | 1796 |
|
1767 | 1797 | while (!ret && idx > pg_start) {
|
@@ -1819,6 +1849,10 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset,
|
1819 | 1849 | if (err)
|
1820 | 1850 | return err;
|
1821 | 1851 |
|
| 1852 | + filemap_invalidate_lock(inode->i_mapping); |
| 1853 | + f2fs_zero_post_eof_page(inode, offset + len); |
| 1854 | + filemap_invalidate_unlock(inode->i_mapping); |
| 1855 | + |
1822 | 1856 | f2fs_balance_fs(sbi, true);
|
1823 | 1857 |
|
1824 | 1858 | pg_start = ((unsigned long long)offset) >> PAGE_SHIFT;
|
@@ -4860,6 +4894,10 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from)
|
4860 | 4894 | err = file_modified(file);
|
4861 | 4895 | if (err)
|
4862 | 4896 | return err;
|
| 4897 | + |
| 4898 | + filemap_invalidate_lock(inode->i_mapping); |
| 4899 | + f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from)); |
| 4900 | + filemap_invalidate_unlock(inode->i_mapping); |
4863 | 4901 | return count;
|
4864 | 4902 | }
|
4865 | 4903 |
|
|
0 commit comments