]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iomap: fix submission side handling of completion side errors
authorChristoph Hellwig <hch@lst.de>
Mon, 26 Jan 2026 05:53:38 +0000 (06:53 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Jan 2026 12:16:39 +0000 (05:16 -0700)
The "if (dio->error)" in iomap_dio_bio_iter exists to stop submitting
more bios when a completion already return an error.  Commit cfe057f7db1f
("iomap_dio_actor(): fix iov_iter bugs") made it revert the iov by
"copied", which is very wrong given that we've already consumed that
range and submitted a bio for it.

Fixes: cfe057f7db1f ("iomap_dio_actor(): fix iov_iter bugs")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/iomap/direct-io.c

index 4000c8596d9bf27b560f06c199bd8fc58b8fb855..867c0ac6df8fad61b567e985df64acee02f15624 100644 (file)
@@ -443,9 +443,13 @@ static int iomap_dio_bio_iter(struct iomap_iter *iter, struct iomap_dio *dio)
        nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter, BIO_MAX_VECS);
        do {
                size_t n;
-               if (dio->error) {
-                       iov_iter_revert(dio->submit.iter, copied);
-                       copied = ret = 0;
+
+               /*
+                * If completions already occurred and reported errors, give up now and
+                * don't bother submitting more bios.
+                */
+               if (unlikely(data_race(dio->error))) {
+                       ret = 0;
                        goto out;
                }