Hi all, This is a first pass at supporting more incremental, per-operation iomap_iter advancement. The motivation for this is folio_batch support for zero range [1], where the fs provides a batch of folios to process in certain situations. Since the batch may not be logically contiguous, processing loops require a bit more flexibility than the typical offset based iteration. The current iteration model basically has the operation _iter() handler lift the pos/length wrt to the current iomap out of the iomap_iter, process it locally, then return the result to be stored in iter.processed. The latter is overloaded with error status, so the handler must decide whether to return error or a partial completion (i.e. consider a short write). iomap_iter() then uses the result to advance the iter and look up the next iomap. The updated model proposed in this series is to allow an operation to advance the iter itself as subranges are processed and then return success or failure in iter.processed. Note that at least initially, this is implemented as an optional mode to minimize churn. This series converts operations that use iomap_write_begin(): buffered write, unshare, and zero range. The main advantage of this is that the future folio_batch work can be plumbed down into the folio get path more naturally, and the associated codepath can advance the iter itself when appropriate rather than require each operation to manage the gaps in the range being processed. Some secondary advantages are a little less boilerplate code for walking ranges and more clear semantics for partial completions in the event of errors, etc. I'll post an RFC of the folio_batch work shortly after this to give an example of how this is intended to be used. Otherwise, the changes here actually aren't all that substantial. Patches 1-2 are prep work, patch 3 enables incremental advances, and patches 4-6 switch over a few operations. Thoughts, reviews, flames appreciated. Brian v1: - Reworked and fixed a bunch of functional issues. RFC: https://lore.kernel.org/linux-fsdevel/20241125140623.20633-1-bfoster@xxxxxxxxxx/ [1] https://lore.kernel.org/linux-fsdevel/20241119154656.774395-1-bfoster@xxxxxxxxxx/ Brian Foster (6): iomap: split out iomap check and reset logic from iter advance iomap: factor out iomap length helper iomap: support incremental iomap_iter advances iomap: advance the iter directly on buffered writes iomap: advance the iter directly on unshare range iomap: advance the iter directly on zero range fs/iomap/buffered-io.c | 46 ++++++++++----------------- fs/iomap/iter.c | 72 ++++++++++++++++++++++++++---------------- include/linux/iomap.h | 14 ++++++-- 3 files changed, 73 insertions(+), 59 deletions(-) -- 2.47.0