Re: [PATCH v6 5/9] block: fail a short atomic pin in bio_iov_iter_get_pages()

From: John Garry

Date: Tue Oct 13 2026 - 04:43:51 EST


On 10/9/26 17:50, Tal Zussman wrote:
On a partial page pin, __blkdev_direct_IO_simple() and
__blkdev_direct_IO_async() submit what was pinned with REQ_ATOMIC set
and leave the rest to the buffered fallback, tearing an IOCB_ATOMIC
write.

This can be triggered deterministically. A 16K pwritev2(RWF_ATOMIC)
whose last page is PROT_NONE, on a scsi_debug device with atomic_wr=1,
completes short with only three of the four pages written, violating
RWF_ATOMIC semantics.

Make bio_iov_iter_get_pages() release the pins and return -EINVAL when
a REQ_ATOMIC bio doesn't cover the whole iterator, since an atomic
write is submitted as a single bio and a short one would be torn. That
covers iomap as well, where a partially unmapped buffer could trip the
WARN_ON_ONCE() in iomap_dio_bio_iter_one(). The async block device path
currently sets REQ_ATOMIC after pinning, so set it before, and move
REQ_NOWAIT along with it.

Fixes: caf336f81b3a ("block: Add fops atomic write support")
Reported-by: Sashiko<sashiko-bot@xxxxxxxxxx>
Link:https://sashiko.dev/#/patchset/20260802-blkdev-fixes-v1-0- a82fc549fd74%40columbia.edu?part=2
Assisted-by:Claude:claude-fable-5
Reviewed-by: John Garry<john.garry@xxxxxxxxx>
Reviewed-by: Hannes Reinecke<hare@xxxxxxxxxx>
Signed-off-by: Tal Zussman<tz2294@xxxxxxxxxxxx>

I think that you can now remove the REQ_ATOMIC check after the iomap_dio_bio_iter_one() -> bio_iov_iter_get_pages() call also; however, considering the trees, it's better to wait until 7.4-rc1 is released.

Thanks,
John