]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iomap: consolidate bio submission
authorChristoph Hellwig <hch@lst.de>
Mon, 29 Jun 2026 12:17:38 +0000 (14:17 +0200)
committerChristian Brauner <brauner@kernel.org>
Wed, 1 Jul 2026 13:26:47 +0000 (15:26 +0200)
Add a iomap_bio_submit_read_endio helper factored out of
iomap_bio_submit_read to that all ->submit_read implementations for
iomap_read_ops that use iomap_bio_read_folio_range can shared the
logic.

Right now that logic is mostly trivial, but already has a bug for XFS
because the XFS version is too trivial:  file system integrity validation
needs a workqueue context and thus can't happen from the default iomap
bi_end_io I/O handler.  Unfortunately the iomap refactoring just before
fs integrity landed moved code around here and the call go misplaced,
meaning it never got called.  The PI information still is verified by
the block layer, but the offloading is less efficient (and the future
userspace interface can't get at it).

Fixes: 0b10a370529c ("iomap: support T10 protection information")
Cc: stable@vger.kernel.org # v7.1
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20260629121750.3392300-2-hch@lst.de
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Joanne Koong <joannelkoong@gmail.com>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/exfat/iomap.c
fs/iomap/bio.c
fs/ntfs/aops.c
fs/ntfs3/inode.c
fs/xfs/xfs_aops.c
include/linux/iomap.h

index 1aac38e63fe6f0b4b45e9f681eba5a16d6ee1365..190fc6471f8493ff49320cc15edd1231548450ab 100644 (file)
@@ -253,10 +253,7 @@ static void exfat_iomap_read_end_io(struct bio *bio)
 static void exfat_iomap_bio_submit_read(const struct iomap_iter *iter,
                struct iomap_read_folio_ctx *ctx)
 {
-       struct bio *bio = ctx->read_ctx;
-
-       bio->bi_end_io = exfat_iomap_read_end_io;
-       submit_bio(bio);
+       iomap_bio_submit_read_endio(iter, ctx, exfat_iomap_read_end_io);
 }
 
 const struct iomap_read_ops exfat_iomap_bio_read_ops = {
index 4504f4633f17592cbc24a5f102f7b5c00959971a..0f31e35567b4b4c6593aa9e53e06632660a242e4 100644 (file)
@@ -78,15 +78,23 @@ u32 iomap_finish_ioend_buffered_read(struct iomap_ioend *ioend)
        return __iomap_read_end_io(&ioend->io_bio, ioend->io_error);
 }
 
-static void iomap_bio_submit_read(const struct iomap_iter *iter,
-               struct iomap_read_folio_ctx *ctx)
+void iomap_bio_submit_read_endio(const struct iomap_iter *iter,
+               struct iomap_read_folio_ctx *ctx, bio_end_io_t end_io)
 {
        struct bio *bio = ctx->read_ctx;
 
+       bio->bi_end_io = end_io;
        if (iter->iomap.flags & IOMAP_F_INTEGRITY)
                fs_bio_integrity_alloc(bio);
        submit_bio(bio);
 }
+EXPORT_SYMBOL_GPL(iomap_bio_submit_read_endio);
+
+static void iomap_bio_submit_read(const struct iomap_iter *iter,
+               struct iomap_read_folio_ctx *ctx)
+{
+       return iomap_bio_submit_read_endio(iter, ctx, iomap_read_end_io);
+}
 
 static struct bio_set *iomap_read_bio_set(struct iomap_read_folio_ctx *ctx)
 {
@@ -127,7 +135,6 @@ static void iomap_read_alloc_bio(const struct iomap_iter *iter,
        if (ctx->rac)
                bio->bi_opf |= REQ_RAHEAD;
        bio->bi_iter.bi_sector = iomap_sector(iomap, iter->pos);
-       bio->bi_end_io = iomap_read_end_io;
        bio_add_folio_nofail(bio, folio, plen,
                        offset_in_folio(folio, iter->pos));
        ctx->read_ctx = bio;
index 1fbf832ad1654093d032da409d54b8ecf46a136b..f2bb5650604657aea48b0389307df89879818e4b 100644 (file)
@@ -38,11 +38,9 @@ static void ntfs_iomap_read_end_io(struct bio *bio)
 }
 
 static void ntfs_iomap_bio_submit_read(const struct iomap_iter *iter,
-       struct iomap_read_folio_ctx *ctx)
+               struct iomap_read_folio_ctx *ctx)
 {
-       struct bio *bio = ctx->read_ctx;
-       bio->bi_end_io = ntfs_iomap_read_end_io;
-       submit_bio(bio);
+       iomap_bio_submit_read_endio(iter, ctx, ntfs_iomap_read_end_io);
 }
 
 static const struct iomap_read_ops ntfs_iomap_bio_read_ops = {
index c43101cc064d53f4327362efa2a28dbb87a3cac9..0c9bd669117de5e652216e073c05228b3d696c83 100644 (file)
@@ -608,10 +608,7 @@ static void ntfs_iomap_read_end_io(struct bio *bio)
 static void ntfs_iomap_bio_submit_read(const struct iomap_iter *iter,
                struct iomap_read_folio_ctx *ctx)
 {
-       struct bio *bio = ctx->read_ctx;
-
-       bio->bi_end_io = ntfs_iomap_read_end_io;
-       submit_bio(bio);
+       iomap_bio_submit_read_endio(iter, ctx, ntfs_iomap_read_end_io);
 }
 
 static const struct iomap_read_ops ntfs_iomap_bio_read_ops = {
index 2a0c54256e93f2fd92bd01345ad797a6a529abd9..51293b6f331f0bf3999528ccb3c69bccb63d4474 100644 (file)
@@ -764,8 +764,7 @@ xfs_bio_submit_read(
 
        /* defer read completions to the ioend workqueue */
        iomap_init_ioend(iter->inode, bio, ctx->read_ctx_file_offset, 0);
-       bio->bi_end_io = xfs_end_bio;
-       submit_bio(bio);
+       iomap_bio_submit_read_endio(iter, ctx, xfs_end_bio);
 }
 
 static const struct iomap_read_ops xfs_iomap_read_ops = {
index 3582ed1fe23611edd87c445f4791385eb3ae59f7..56b43d594e6e2957573b37e60a61602128f35bc4 100644 (file)
@@ -622,6 +622,8 @@ extern struct bio_set iomap_ioend_bioset;
 #ifdef CONFIG_BLOCK
 int iomap_bio_read_folio_range(const struct iomap_iter *iter,
                struct iomap_read_folio_ctx *ctx, size_t plen);
+void iomap_bio_submit_read_endio(const struct iomap_iter *iter,
+               struct iomap_read_folio_ctx *ctx, bio_end_io_t end_io);
 
 extern const struct iomap_read_ops iomap_bio_read_ops;