Unverified Commit 7588469b authored by Joanne Koong's avatar Joanne Koong Committed by Christian Brauner
Browse files

iomap: move read/readahead bio submission logic into helper function



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: default avatarJoanne Koong <joannelkoong@gmail.com>
Tested-by: default avatar <syzbot@syzkaller.appspotmail.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 573c14c8
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -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,13 +564,11 @@ 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)
	iomap_bio_submit_read(&ctx);

	if (ctx.cur_folio && !ctx.cur_folio_in_bio)
		folio_unlock(ctx.cur_folio);
}
}
EXPORT_SYMBOL_GPL(iomap_readahead);

static int iomap_bio_read_folio_range_sync(const struct iomap_iter *iter,