cifs_setsize() relied on pagecache_isize_extended() to zero the tail of the folio straddling the old EOF, but that helper is a no-op on CIFS (i_blkbits is 14), so data dirtied past EOF through an mmap survived and became visible once the file was extended. When extending, zero the tail of the folio straddling the old EOF with netfs_clear_stale_post_eof() instead, mirroring what pagecache_isize_extended() does for filesystems with a sub-page block size. truncate_pagecache() is then called as in truncate_setsize(): it is essentially a no-op on extend and drops the pagecache beyond the new EOF on shrink. Closes: https://sashiko.dev/#/patchset/20260921154957.903891-1-pc%40manguebit.org Fixes: c510edb9734a ("cifs: call pagecache_isize_extended() in cifs_setsize() when extending") Reviewed-by: David Howells Signed-off-by: Paulo Alcantara Cc: Christian Brauner Cc: Namjae Jeon Cc: Ronnie Sahlberg Cc: Shyam Prasad N Cc: Tom Talpey Cc: Bharath SM Cc: stable@vger.kernel.org --- fs/smb/client/inode.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 1fe0ef0a95db..9abb40f871c6 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -3071,8 +3071,16 @@ void cifs_setsize(struct inode *inode, loff_t offset) inode->i_blocks = blocks; spin_unlock(&inode->i_lock); inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); + /* + * When extending, zero the tail of the folio straddling the old EOF + * so that data dirtied past EOF through an mmap isn't exposed once the + * file is extended. This mirrors pagecache_isize_extended(), which + * can't be used here as it is a no-op when the block size is >= + * PAGE_SIZE, as on CIFS. truncate_pagecache() then drops the + * pagecache beyond the new EOF, as in truncate_setsize(). + */ if (offset > old_size) - pagecache_isize_extended(inode, old_size, offset); + netfs_clear_stale_post_eof(inode, old_size, offset, false); truncate_pagecache(inode, offset); netfs_wait_for_outstanding_io(inode); } -- 2.55.0