On Thu, Dec 12, 2024 at 11:51:49AM -0800, Darrick J. Wong wrote: > > +struct iomap_ioend *iomap_split_ioend(struct iomap_ioend *ioend, bool is_append, > > Can you determine is_append from (ioend->io_flags & ZONE_APPEND)? That would require us to add that flag first :) As we don't really need that as persistent per-iomap that it's probably not worth it. > Also it's not clear to me what the initial and output state of > *alloc_len is supposed to be? I guess you set it to the number of bytes > the @ioend covers? It gets set to the number of blocks that the allocator could find, and iomap_split_ioend decrements the amount of that it used for the ioend returned, which is min(*alloc_len, max_zone_append_sectors) for sequential zones, or *alloc_len for conventional zones. > > +++ b/include/linux/iomap.h > > @@ -354,6 +354,9 @@ struct iomap_ioend { > > struct list_head io_list; /* next ioend in chain */ > > u16 io_flags; /* IOMAP_IOEND_* */ > > struct inode *io_inode; /* file being written to */ > > + atomic_t io_remaining; /* completetion defer count */ > > + int io_error; /* stashed away status */ > > + struct iomap_ioend *io_parent; /* parent for completions */ > > I guess this means ioends can chain together, sort of like how bios can > when you split them? Exactly.