Add convenience helpers for more customized writeback handling. For example, the caller may wish to use iomap_start_folio_write() and iomap_finish_folio_write() for tracking when writeback state needs to be ended on the folio. Add a void *private field as well that callers can pass into the ->writeback_folio() handler. Signed-off-by: Joanne Koong <joannelkoong@xxxxxxxxx> --- fs/iomap/buffered-io-bio.c | 12 ------------ fs/iomap/buffered-io.c | 24 ++++++++++++++++++++++++ include/linux/iomap.h | 6 ++++++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/fs/iomap/buffered-io-bio.c b/fs/iomap/buffered-io-bio.c index e9f26a938c8d..2463e3b39f98 100644 --- a/fs/iomap/buffered-io-bio.c +++ b/fs/iomap/buffered-io-bio.c @@ -99,18 +99,6 @@ int iomap_bio_read_folio_sync(loff_t block_start, struct folio *folio, return submit_bio_wait(&bio); } -static void iomap_finish_folio_write(struct inode *inode, struct folio *folio, - size_t len) -{ - struct iomap_folio_state *ifs = folio->private; - - WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs); - WARN_ON_ONCE(ifs && atomic_read(&ifs->write_bytes_pending) <= 0); - - if (!ifs || atomic_sub_and_test(len, &ifs->write_bytes_pending)) - folio_end_writeback(folio); -} - /* * We're now finished for good with this ioend structure. Update the page * state, release holds on bios, and finally free up memory. Do not use the diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c index bdf917ae56dc..25ae1d53eccb 100644 --- a/fs/iomap/buffered-io.c +++ b/fs/iomap/buffered-io.c @@ -1638,3 +1638,27 @@ iomap_writepages(struct address_space *mapping, struct writeback_control *wbc, return iomap_writeback_complete(wpc, error); } EXPORT_SYMBOL_GPL(iomap_writepages); + +void iomap_start_folio_write(struct inode *inode, struct folio *folio, + size_t len) +{ + struct iomap_folio_state *ifs = folio->private; + + WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs); + if (ifs) + atomic_add(len, &ifs->write_bytes_pending); +} +EXPORT_SYMBOL_GPL(iomap_start_folio_write); + +void iomap_finish_folio_write(struct inode *inode, struct folio *folio, + size_t len) +{ + struct iomap_folio_state *ifs = folio->private; + + WARN_ON_ONCE(i_blocks_per_folio(inode, folio) > 1 && !ifs); + WARN_ON_ONCE(ifs && atomic_read(&ifs->write_bytes_pending) <= 0); + + if (!ifs || atomic_sub_and_test(len, &ifs->write_bytes_pending)) + folio_end_writeback(folio); +} +EXPORT_SYMBOL_GPL(iomap_finish_folio_write); diff --git a/include/linux/iomap.h b/include/linux/iomap.h index f4350e59fe7e..3115b00ff410 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -454,6 +454,7 @@ struct iomap_writepage_ctx { struct iomap_ioend *ioend; const struct iomap_writeback_ops *ops; u32 nr_folios; /* folios added to the ioend */ + void *private; }; struct iomap_writeback_folio_range { @@ -575,4 +576,9 @@ int iomap_bio_writeback_complete(struct iomap_writepage_ctx *wpc, int error, #define iomap_bio_writeback_complete(...) (-ENOSYS) #endif /* CONFIG_BLOCK */ +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, + size_t len); + #endif /* LINUX_IOMAP_H */ -- 2.47.1