Move ifs read_bytes_pending increment logic into a separate helper, iomap_start_folio_read(), which will be needed later on by caller-provided read callbacks (added in a later commit) for read/readahead. This is the counterpart to the currently existing iomap_finish_folio_read(). Make iomap_start_folio_read() and iomap_finish_folio_read() publicly accessible. These need to be accessible in order for caller-provided read callbacks to use. Signed-off-by: Joanne Koong Reviewed-by: "Darrick J. Wong" --- fs/iomap/buffered-io.c | 26 +++++++++++++++++--------- include/linux/iomap.h | 3 +++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c index 008042108c68..50de09426c96 100644 --- a/fs/iomap/buffered-io.c +++ b/fs/iomap/buffered-io.c @@ -317,9 +317,20 @@ static int iomap_read_inline_data(const struct iomap_iter *iter, return 0; } -#ifdef CONFIG_BLOCK -static void iomap_finish_folio_read(struct folio *folio, size_t off, - size_t len, int error) +void iomap_start_folio_read(struct folio *folio, size_t len) +{ + struct iomap_folio_state *ifs = folio->private; + + if (ifs) { + spin_lock_irq(&ifs->state_lock); + ifs->read_bytes_pending += len; + spin_unlock_irq(&ifs->state_lock); + } +} +EXPORT_SYMBOL_GPL(iomap_start_folio_read); + +void iomap_finish_folio_read(struct folio *folio, size_t off, size_t len, + int error) { struct iomap_folio_state *ifs = folio->private; bool uptodate = !error; @@ -339,7 +350,9 @@ static void iomap_finish_folio_read(struct folio *folio, size_t off, if (finished) folio_end_read(folio, uptodate); } +EXPORT_SYMBOL_GPL(iomap_finish_folio_read); +#ifdef CONFIG_BLOCK static void iomap_read_end_io(struct bio *bio) { int error = blk_status_to_errno(bio->bi_status); @@ -381,18 +394,13 @@ static void iomap_read_folio_range_bio_async(const struct iomap_iter *iter, { struct folio *folio = ctx->cur_folio; const struct iomap *iomap = &iter->iomap; - struct iomap_folio_state *ifs = folio->private; size_t poff = offset_in_folio(folio, pos); loff_t length = iomap_length(iter); sector_t sector; struct bio *bio = ctx->private; ctx->folio_owned = true; - if (ifs) { - spin_lock_irq(&ifs->state_lock); - ifs->read_bytes_pending += plen; - spin_unlock_irq(&ifs->state_lock); - } + iomap_start_folio_read(folio, plen); sector = iomap_sector(iomap, pos); if (!bio || bio_end_sector(bio) != sector || diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 73dceabc21c8..0938c4a57f4c 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -467,6 +467,9 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio, loff_t pos, loff_t end_pos, unsigned int dirty_len); int iomap_ioend_writeback_submit(struct iomap_writepage_ctx *wpc, int error); +void iomap_start_folio_read(struct folio *folio, size_t len); +void iomap_finish_folio_read(struct folio *folio, size_t off, size_t len, + int error); void iomap_start_folio_write(struct inode *inode, struct folio *folio, size_t len); void iomap_finish_folio_write(struct inode *inode, struct folio *folio, -- 2.47.3