From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> Use btrfs_bioset so iomap allocates btrfs_bio for bios to be submitted for btrfs. Set the file_offset of the bbio from the first folio in the bio. For compressed/encoded reads, call btrfs_submit_compressed_read() else call btrfs_submit_bbio() After the read is complete, call iomap_read_end_io() to finish reads on the folios. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> --- fs/btrfs/bio.c | 2 +- fs/btrfs/bio.h | 1 + fs/btrfs/extent_io.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c index 056f8a171bba..9d448235b8bd 100644 --- a/fs/btrfs/bio.c +++ b/fs/btrfs/bio.c @@ -15,7 +15,7 @@ #include "file-item.h" #include "raid-stripe-tree.h" -static struct bio_set btrfs_bioset; +struct bio_set btrfs_bioset; static struct bio_set btrfs_clone_bioset; static struct bio_set btrfs_repair_bioset; static mempool_t btrfs_failed_bio_pool; diff --git a/fs/btrfs/bio.h b/fs/btrfs/bio.h index e48612340745..687a8361202a 100644 --- a/fs/btrfs/bio.h +++ b/fs/btrfs/bio.h @@ -15,6 +15,7 @@ struct btrfs_bio; struct btrfs_fs_info; struct btrfs_inode; +extern struct bio_set btrfs_bioset; #define BTRFS_BIO_INLINE_CSUM_SIZE 64 diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 6ef2fa802c30..43418b6d4824 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -985,10 +985,39 @@ static int btrfs_read_iomap_begin(struct inode *inode, loff_t pos, return 0; } +static void btrfs_read_endio(struct btrfs_bio *bbio) +{ + iomap_read_end_io(&bbio->bio); +} + +static void btrfs_read_submit_io(struct inode *inode, struct bio *bio, + const struct iomap *iomap) +{ + struct btrfs_bio *bbio = btrfs_bio(bio); + struct folio_iter fi; + + btrfs_bio_init(bbio, btrfs_sb(inode->i_sb), btrfs_read_endio, NULL); + bbio->inode = BTRFS_I(inode); + + bio_first_folio(&fi, bio, 0); + bbio->file_offset = folio_pos(fi.folio); + + if (iomap->type & IOMAP_ENCODED) { + bbio->bio.bi_iter.bi_sector = iomap->addr >> SECTOR_SHIFT; + btrfs_submit_compressed_read(bbio); + } else { + btrfs_submit_bbio(bbio, 0); + } +} + static const struct iomap_ops btrfs_buffered_read_iomap_ops = { .iomap_begin = btrfs_read_iomap_begin, }; +static const struct iomap_read_folio_ops btrfs_iomap_read_folio_ops = { + .submit_io = btrfs_read_submit_io, + .bio_set = &btrfs_bioset, +}; /* * basic readpage implementation. Locked extent state structs are inserted -- 2.46.1