[PATCH v2 0/7] block device fixes for large block sizes, IOCB_NOWAIT, and direct I/O
From: Tal Zussman
Date: Fri Aug 28 2026 - 09:53:35 EST
A set of independent fixes for the block device file operations. The
first two were found by Sashiko while reviewing the RWF_DONTCACHE series
[1]. The fourth and fifth were found by Sashiko's review of v1 of this
series, and the rest came from asking an LLM to find any similar or
related issues. Each issue has been reproduced, with the fixes resolving
the issues.
Patch 1 fixes silently lost mmap writes with CONFIG_BUFFER_HEAD=n.
Patches 2 and 3 take i_rwsem around the direct I/O write fallback and
the splice read path, which race set_blocksize() changing the mapping's
minimum folio order.
Patch 4 makes the buffered read path honor IOCB_NOWAIT instead of
blocking on i_rwsem.
Patch 5 makes IOCB_ATOMIC writes fail instead of tearing and falling
back to buffered I/O. Block devices can reject both paths into the
fallback before submitting any I/O, so we fail rather than issue a
WARN() like ext4 does.
Patch 6 fixes leaked page pins in bio_iov_iter_align_down(), and patch
7 removes dead metadata handling in the async direct I/O path.
These issues are currently unlikely to be hit in practice due to the
specific configurations required to trigger them.
The reproducer for patch 1 has been submitted to blktests [2].
[1] https://lore.kernel.org/all/20260730-blk-dontcache-v7-0-3e8e6850068d@xxxxxxxxxxxx/
[2] https://github.com/linux-blktests/blktests/pull/258
---
Changes in v2:
- Rebase on current master.
- 1/7: Add Christoph's Reviewed-by and submit the reproducer to
blktests.
- 2/7: Skip the buffered fallback for IOCB_NOWAIT direct writes, per
Sashiko.
- 2/7: Change the Fixes: commit from c0e473a0d226 to 3c20917120ce
- 3/7 to 7/7: New patches.
- Link to v1: https://lore.kernel.org/r/20260802-blkdev-fixes-v1-0-a82fc549fd74@xxxxxxxxxxxx
---
Tal Zussman (7):
block: use iomap_dirty_folio for block devices
block: take i_rwsem for the direct I/O write fallback
block: take i_rwsem for the splice read path
block: honor IOCB_NOWAIT in the block device buffered read path
block: fail atomic writes instead of falling back to buffered I/O
block: unpin all pages of a bvec in bio_iov_iter_align_down()
block: remove dead metadata handling from the async direct I/O path
block/bio.c | 18 ++++++++++++-
block/fops.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++------------
2 files changed, 84 insertions(+), 18 deletions(-)
---
base-commit: 1b78070aaef63512688aebfbc82365ef9d6660f1
change-id: 20260801-blkdev-fixes-771b1c314ebb
Best regards,
--
Tal Zussman <tz2294@xxxxxxxxxxxx>