]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
exfat: add fallocate FALLOC_FL_ALLOCATE_RANGE support
authorDavid Timber <dxdt@dev.snart.me>
Sat, 28 Feb 2026 08:44:14 +0000 (17:44 +0900)
committerNamjae Jeon <linkinjeon@kernel.org>
Wed, 4 Mar 2026 10:29:27 +0000 (19:29 +0900)
commitbf1797960c20f3d4dc4e8b6f560ca39692abac56
tree025f95c6183341dc9a8d02e05bc2229c6b2966e1
parent3dce5bb82c97fc2ac28d80d496120a6525ce3fb7
exfat: add fallocate FALLOC_FL_ALLOCATE_RANGE support

Currently, the Linux (ex)FAT drivers do not employ any cluster
allocation strategy to keep fragmentation at bay. As a result, when
multiple processes are competing for new clusters to expand files in
exfat filesystem on Linux simultaneously, the files end up heavily
fragmented. HDDs are most impacted, but this could also have some
negative impact on various forms of flash memory depending on the
type of underlying technology.

For instance, modern digital cameras produce multiple media files for a
single video stream. If the application does not take the fragmentation
issue into account or the system is under memory pressure, the kernel
end up allocating clusters in said files in a interleaved manner.

Demo script:

for (( i = 0; i < 4; i += 1 ));
do
    dd if=/dev/urandom iflag=fullblock bs=1M count=64 of=frag-$i &
done
for (( i = 0; i < 4; i += 1 ));
do
    wait
done

filefrag frag-*

Result - Linux kernel native exfat, async mount:
780 extents found
740 extents found
809 extents found
712 extents found

Result - Linux kernel native exfat, sync mount:
1852 extents found
1836 extents found
1846 extents found
1881 extents found

Result - Windows XP:
3 extents found
3 extents found
3 extents found
2 extents found

Windows kernel, on the other hand, regardless of the underlying storage
interface or the medium, seems to space out clusters for each file.
Similar strategy has to be employed by Linux fat filesystems for
efficient utilisation of storage backend.

In the meantime, userspace applications like rsync may
use fallocate to combat this issue.

This patch may introduce a regression-like behaviour to some niche
filesystem-agnostic applications that use fallocate and proceed to
non-sequentially write to the file. Examples:

 - libtorrent's use of posix_fallocate() and the first fragment from a
   peer is near the end of the file
 - "Download accelerators" that do partial content requests(HTTP 206)
   in multiple threads writing to the same file

The delay incurred in such use cases is documented in WinAPI. Patches
that add the ioctl equivalents to the WinAPI function
SetFileValidData() and `fsutil file queryvaliddata ...` will follow.

Signed-off-by: David Timber <dxdt@dev.snart.me>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
fs/exfat/file.c