> +i.e. at a high level how iomap does write iter is [1]:: > + user IO > + loop for file IO range > + loop for each mapped extent > + if (buffered) { > + loop for each page/folio { > + instantiate page cache > + copy data to/from page cache > + update page cache state > + } > + } else { /* direct IO */ > + loop for each bio { > + pack user pages into bio > + submit bio > + } > + } > + } > + } This would probably be easier to follow (and match the actual code) with two separate flows for buffered vs direct I/O. The loop for each bio in direct I/O is also not wrong, but maybe a bit confusing as we really map over a pinned memory range. The code just has a little optimization to directly place that into a bio. > +Guideline for filesystem conversion to iomap > +============================================= Maybe split this into a separate file?