[PATCH 0/3] fs: drain in-flight DIO before buffered write fallback

Jiale Yao posted 3 patches an hour ago
fs/exfat/file.c | 6 ++++++
fs/ext2/file.c  | 7 +++++++
fs/ntfs/file.c  | 7 +++++++
3 files changed, 20 insertions(+)
[PATCH 0/3] fs: drain in-flight DIO before buffered write fallback
Posted by Jiale Yao an hour ago
An asynchronous direct write can remain in flight after its submitting
thread releases the inode lock.  If another direct write falls back to
buffered I/O in the meantime, the buffered write can dirty page cache
before the first write completes post-I/O invalidation.  The invalidation
then finds dirty pages, emits a page cache invalidation failure warning,
and records -EIO in the mapping error sequence.  A later fsync() returns
-EIO.

Commit 15cdefd0c0522f9d5e12d947fa04f4c11649b699 ("ext4: drain
in-flight DIO before buffered write fallback") fixed this race in ext4.
The same ordering is missing from the buffered fallback paths in ext2,
NTFS, and exFAT.

This series adds inode_dio_wait() before each fallback dirties page cache.
Each patch fixes one filesystem and remains independently buildable.

A reproducer using concurrent AIO direct writes and buffered fallback
triggered the following warning on all three filesystems and made a
subsequent fsync() return -EIO:

  Page cache invalidation failure on direct I/O.  Possible data corruption
  due to collision with buffered I/O!

Jiale Yao (3):
  ext2: drain in-flight DIO before buffered write fallback
  ntfs: drain in-flight DIO before buffered write fallback
  exfat: drain in-flight DIO before buffered write fallback

 fs/exfat/file.c | 6 ++++++
 fs/ext2/file.c  | 7 +++++++
 fs/ntfs/file.c  | 7 +++++++
 3 files changed, 20 insertions(+)

-- 
2.34.1