On Wed, Jan 21, 2026 at 07:43:20AM +0100, Christoph Hellwig wrote: > Optionally allocate the bio from the bioset provided in > iomap_read_folio_ops. If no bioset is provided, fs_bio_set is still > used, which is the standard bioset for file systems. > > Based on a patch from Goldwyn Rodrigues <[email protected]>. > > Signed-off-by: Christoph Hellwig <[email protected]>
Looks reasonable, Reviewed-by: "Darrick J. Wong" <[email protected]> --D > --- > fs/iomap/bio.c | 14 ++++++++++++-- > include/linux/iomap.h | 6 ++++++ > 2 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/fs/iomap/bio.c b/fs/iomap/bio.c > index 903cb9fe759e..259a2bf95a43 100644 > --- a/fs/iomap/bio.c > +++ b/fs/iomap/bio.c > @@ -24,11 +24,19 @@ static void iomap_bio_submit_read(const struct iomap_iter > *iter, > submit_bio(ctx->read_ctx); > } > > +static struct bio_set *iomap_read_bio_set(struct iomap_read_folio_ctx *ctx) > +{ > + if (ctx->ops && ctx->ops->bio_set) > + return ctx->ops->bio_set; > + return &fs_bio_set; > +} > + > static void iomap_read_alloc_bio(const struct iomap_iter *iter, > struct iomap_read_folio_ctx *ctx, size_t plen) > { > const struct iomap *iomap = &iter->iomap; > unsigned int nr_vecs = DIV_ROUND_UP(iomap_length(iter), PAGE_SIZE); > + struct bio_set *bio_set = iomap_read_bio_set(ctx); > struct folio *folio = ctx->cur_folio; > gfp_t gfp = mapping_gfp_constraint(folio->mapping, GFP_KERNEL); > gfp_t orig_gfp = gfp; > @@ -47,9 +55,11 @@ static void iomap_read_alloc_bio(const struct iomap_iter > *iter, > * having to deal with partial page reads. This emulates what > * do_mpage_read_folio does. > */ > - bio = bio_alloc(iomap->bdev, bio_max_segs(nr_vecs), REQ_OP_READ, gfp); > + bio = bio_alloc_bioset(iomap->bdev, bio_max_segs(nr_vecs), REQ_OP_READ, > + gfp, bio_set); > if (!bio) > - bio = bio_alloc(iomap->bdev, 1, REQ_OP_READ, orig_gfp); > + bio = bio_alloc_bioset(iomap->bdev, 1, REQ_OP_READ, orig_gfp, > + bio_set); > if (ctx->rac) > bio->bi_opf |= REQ_RAHEAD; > bio->bi_iter.bi_sector = iomap_sector(iomap, iter->pos); > diff --git a/include/linux/iomap.h b/include/linux/iomap.h > index b3f545d41720..24f884b6b0c4 100644 > --- a/include/linux/iomap.h > +++ b/include/linux/iomap.h > @@ -515,6 +515,12 @@ struct iomap_read_ops { > */ > void (*submit_read)(const struct iomap_iter *iter, > struct iomap_read_folio_ctx *ctx); > + > + /* > + * Optional, allows filesystem to specify own bio_set, so new bio's > + * can be allocated from the provided bio_set. > + */ > + struct bio_set *bio_set; > }; > > /* > -- > 2.47.3 > >
