[PATCH v3 0/8] exfat: fix valid_size update races

From: Chi Zhiling

Date: Thu Oct 15 2026 - 23:35:40 EST


From: Chi Zhiling <chizhiling@xxxxxxxxxx>

exFAT uses valid_size (ValidDataLength) as the on-disk boundary of
initialised data, but the current code advances it too late or without
proper serialisation. As a result, buffered writes can silently lose
data reclaimed before valid_size covers it, page faults and direct I/O
can race with writes, and a failed direct write still grows the file
on disk.

This series advances valid_size under the folio lock for buffered
writes, revalidates cached iomaps, drops i_rwsem from
exfat_page_mkwrite(), and publishes i_size/valid_size only on
successful direct I/O completion.

V3:
- Add Fixes: tags to some patches
- Fix two issues since v2 (p2, p6)

V2: https://lore.kernel.org/exfat/20261013033837.2748258-1-chizhiling@xxxxxxx/
V1: https://lore.kernel.org/exfat/59056131-e3bd-4003-8c30-0a356cf0bd82@xxxxxxx/
Link: https://lore.kernel.org/exfat/10029d6f-13cc-4d17-a2f9-b093a8339dde/T/#t


Chi Zhiling (8):
iomap: export iomap_bio_read_folio_range_sync()
exfat: zero the invalid tail of the straddle block under the folio
lock
exfat: advance valid_size under the folio lock for buffered writes
exfat: advance valid_size while zeroing new ranges
exfat: validate cached iomaps during buffered writes
exfat: drop i_rwsem from exfat_page_mkwrite
exfat: complete direct writes synchronously when they update metadata
exfat: publish i_size and valid_size on direct I/O completion

fs/exfat/file.c | 111 +++++++++++++++++----------------
fs/exfat/inode.c | 9 +--
fs/exfat/iomap.c | 139 +++++++++++++++++++++++++++++++-----------
fs/exfat/iomap.h | 1 +
fs/iomap/bio.c | 1 +
fs/iomap/internal.h | 12 ----
include/linux/iomap.h | 9 +++
7 files changed, 176 insertions(+), 106 deletions(-)

--
2.53.0