Skip to content

Commit 4e163c3

Browse files
YuezhangMonamjaejeon
authored andcommitted
exfat: zero out post-EOF page cache on file extension
xfstests generic/363 was failing due to unzeroed post-EOF page cache that allowed mmap writes beyond EOF to become visible after file extension. For example, in following xfs_io sequence, 0x22 should not be written to the file but would become visible after the extension: xfs_io -f -t -c "pwrite -S 0x11 0 8" \ -c "mmap 0 4096" \ -c "mwrite -S 0x22 32 32" \ -c "munmap" \ -c "pwrite -S 0x33 512 32" \ $testfile This violates the expected behavior where writes beyond EOF via mmap should not persist after the file is extended. Instead, the extended region should contain zeros. Fix this by using truncate_pagecache() to truncate the page cache after the current EOF when extending the file. Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
1 parent 9aee8de commit 4e163c3

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

fs/exfat/file.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ static int exfat_cont_expand(struct inode *inode, loff_t size)
2525
struct exfat_sb_info *sbi = EXFAT_SB(sb);
2626
struct exfat_chain clu;
2727

28+
truncate_pagecache(inode, i_size_read(inode));
29+
2830
ret = inode_newsize_ok(inode, size);
2931
if (ret)
3032
return ret;
@@ -639,6 +641,9 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
639641

640642
inode_lock(inode);
641643

644+
if (pos > i_size_read(inode))
645+
truncate_pagecache(inode, i_size_read(inode));
646+
642647
valid_size = ei->valid_size;
643648

644649
ret = generic_write_checks(iocb, iter);

0 commit comments

Comments
 (0)