]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iomap: move read/readahead bio submission logic into helper function
authorJoanne Koong <joannelkoong@gmail.com>
Fri, 26 Sep 2025 00:25:57 +0000 (17:25 -0700)
committerChristian Brauner <brauner@kernel.org>
Mon, 20 Oct 2025 18:21:25 +0000 (20:21 +0200)
Move the read/readahead bio submission logic into a separate helper.
This is needed to make iomap read/readahead more generically usable,
especially for filesystems that do not require CONFIG_BLOCK.

Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Tested-by: syzbot@syzkaller.appspotmail.com
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/iomap/buffered-io.c

index 7e65075b63451e91117a4e00905ce8f7bb6b2d70..f8b985bb5a6b5d19781885766ac48a2b572b9b37 100644 (file)
@@ -367,6 +367,14 @@ struct iomap_readpage_ctx {
        struct readahead_control *rac;
 };
 
+static void iomap_bio_submit_read(struct iomap_readpage_ctx *ctx)
+{
+       struct bio *bio = ctx->bio;
+
+       if (bio)
+               submit_bio(bio);
+}
+
 static void iomap_bio_read_folio_range(const struct iomap_iter *iter,
                struct iomap_readpage_ctx *ctx, loff_t pos, size_t plen)
 {
@@ -392,8 +400,7 @@ static void iomap_bio_read_folio_range(const struct iomap_iter *iter,
                gfp_t orig_gfp = gfp;
                unsigned int nr_vecs = DIV_ROUND_UP(length, PAGE_SIZE);
 
-               if (ctx->bio)
-                       submit_bio(ctx->bio);
+               iomap_bio_submit_read(ctx);
 
                if (ctx->rac) /* same as readahead_gfp_mask */
                        gfp |= __GFP_NORETRY | __GFP_NOWARN;
@@ -488,13 +495,10 @@ int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops)
        while ((ret = iomap_iter(&iter, ops)) > 0)
                iter.status = iomap_read_folio_iter(&iter, &ctx);
 
-       if (ctx.bio) {
-               submit_bio(ctx.bio);
-               WARN_ON_ONCE(!ctx.cur_folio_in_bio);
-       } else {
-               WARN_ON_ONCE(ctx.cur_folio_in_bio);
+       iomap_bio_submit_read(&ctx);
+
+       if (!ctx.cur_folio_in_bio)
                folio_unlock(folio);
-       }
 
        /*
         * Just like mpage_readahead and block_read_full_folio, we always
@@ -560,12 +564,10 @@ void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
        while (iomap_iter(&iter, ops) > 0)
                iter.status = iomap_readahead_iter(&iter, &ctx);
 
-       if (ctx.bio)
-               submit_bio(ctx.bio);
-       if (ctx.cur_folio) {
-               if (!ctx.cur_folio_in_bio)
-                       folio_unlock(ctx.cur_folio);
-       }
+       iomap_bio_submit_read(&ctx);
+
+       if (ctx.cur_folio && !ctx.cur_folio_in_bio)
+               folio_unlock(ctx.cur_folio);
 }
 EXPORT_SYMBOL_GPL(iomap_readahead);