All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Joanne Koong <joannelkoong@gmail.com>
Cc: brauner@kernel.org, hch@lst.de, willy@infradead.org,
	hsiangkao@linux.alibaba.com, linux-fsdevel@vger.kernel.org,
	linux-xfs@vger.kernel.org, Jonathan Corbet <corbet@lwn.net>,
	Shuah Khan <skhan@linuxfoundation.org>,
	"open list:DOCUMENTATION" <linux-doc@vger.kernel.org>,
	open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 18/18] Documentation: iomap: update docs to reflect iomap_next model
Date: Thu, 2 Jul 2026 19:00:20 -0700	[thread overview]
Message-ID: <20260703020020.GS9392@frogsfrogsfrogs> (raw)
In-Reply-To: <CAJnrk1YZQOQ0D6p6qYx1BPvKQaDgZsrKzLbGZzaH8tUkj_OoOQ@mail.gmail.com>

On Thu, Jul 02, 2026 at 06:36:55PM -0700, Joanne Koong wrote:
> On Thu, Jul 2, 2026 at 12:27 PM Darrick J. Wong <djwong@kernel.org> wrote:
> >
> > On Tue, Jun 30, 2026 at 05:09:33PM -0700, Joanne Koong wrote:
> > > Filesystems no longer pass a struct iomap_ops with separate
> > > ->iomap_begin() and ->iomap_end() callbacks.  Instead, every iomap
> > > operation takes a single iomap_next() callback directly. iomap_next()
> > > finishes the previous mapping (if any) and produces the next one. Most
> > > filesystems build it from begin and end helpers via the iomap_process()
> > > helper.
> > >
> > > Update the iomap documentation to match this change.
> > >
> > > Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
> > > ---
> > >  Documentation/filesystems/iomap/design.rst    | 115 +++++++++++++-----
> > >  .../filesystems/iomap/operations.rst          |  60 +++++----
> > >  Documentation/filesystems/iomap/porting.rst   |  22 +++-
> > >  3 files changed, 132 insertions(+), 65 deletions(-)
> > >
> > > diff --git a/Documentation/filesystems/iomap/design.rst b/Documentation/filesystems/iomap/design.rst
> > > index 0f7672676c0b..7a37e303eea8 100644
> > > --- a/Documentation/filesystems/iomap/design.rst
> > > +++ b/Documentation/filesystems/iomap/design.rst
> > > @@ -75,7 +75,10 @@ At a high level, an iomap operation `looks like this
> > >
> > >  1. For each byte in the operation range...
> > >
> > > -   1. Obtain a space mapping via ``->iomap_begin``
> > > +   1. Obtain the next space mapping via the ``iomap_next`` callback.
> > > +      From the second iteration onwards this same callback first finishes
> > > +      the previous mapping (committing or unreserving space as needed)
> > > +      and then produces the next one.
> > >
> > >     2. For each sub-unit of work...
> > >
> > > @@ -86,7 +89,13 @@ At a high level, an iomap operation `looks like this
> > >
> > >     3. Increment operation cursor
> > >
> > > -   4. Release the mapping via ``->iomap_end``, if necessary
> > > +iomap repeats this until the range is fully consumed.  The ``iomap_next``
> > > +callback returns ``1`` while there is more of the range left to process,
> > > +``0`` once it is fully consumed, and a negative errno on error.
> >
> > s/and/or/
> >
> > > +Filesystems rarely implement ``->iomap_next`` by hand. The ``iomap_process``
> > > +helper implements the finish-then-produce sequence in +terms of two smaller
> > > +callbacks, ``begin`` and ``end``. See `The Mapping Callback`_ below for more
> > > +info.
> >
> > I wonder, under what circumstances would a filesystem /not/ use
> > iomap_process()?
> 
> Hmm, maybe a situation where they need to share or carry some
> filesystem-specific state / info between finishing the mapping and
> producing the next one?

The ->begin method can still set iomap::private and the ->end method can
dispose of it, right?  Oh, wait, no, that doesn't work because you're
talking about ->begin/->end passing something to the next ->begin.

I suppose you could make iomap_iter_continue preserve the iomap/srcmap
private pointer across the memset(0) calls.  But all current users
either rely on private being zeroed by iomap_iter after ->iomap_end
returns, so that would be quite the change.

Hm.  I was thinking that the signature for iomap_process could be
cleaner if you didn't have to pass iomap/srcmap explicitly.
iomap_process could do the (dangerous) casting from the (const struct
iomap_iter *) to the (struct iomap *) pointers before calling ->begin
and ->end.

But if you do have an ->iomap_next function that doesn't use
iomap_process, then it has to do the pointer extraction itself.  We
already expose the innards of struct iomap_iter to callers, so maybe
it's ok to have some gross helpers like:

static inline struct iomap *iomap_iter_iomap(const struct iomap_iter *i)
{
	return (struct iomap *)&i->iomap;
}

static inline struct iomap *iomap_iter_srcmap(const struct iomap_iter *i)
{
	return (struct iomap *)&i->srcmap;
}

I'm not sure *that*'s any cleaner.  And I think it gets confusing with
the other srcmap extraction function.

Eh never mind, I've talked myself out of this. ;)

> > >  Each iomap operation will be covered in more detail below.
> > >  This library was covered previously by an `LWN article
> > > @@ -189,7 +198,7 @@ The fields are as follows:
> > >     * **IOMAP_DELALLOC**: A promise to allocate space at a later time
> > >       ("delayed allocation").
> > >       If the filesystem returns IOMAP_F_NEW here and the write fails, the
> > > -     ``->iomap_end`` function must delete the reservation.
> > > +     ``end`` function must delete the reservation.
> > >       The ``addr`` field must be set to ``IOMAP_NULL_ADDR``.
> > >
> > >     * **IOMAP_MAPPED**: The file range maps to specific space on the
> > > @@ -208,12 +217,12 @@ The fields are as follows:
> > >
> > >     * **IOMAP_INLINE**: The file range maps to the memory buffer
> > >       specified by ``inline_data``.
> > > -     For write operation, the ``->iomap_end`` function presumably
> > > -     handles persisting the data.
> > > +     For write operation, the ``end`` function presumably handles
> > > +     persisting the data.
> >
> > Unrelated to this patch, but this should say "For write operations, the
> > end function must persist the data" because iomap_writepages doesn't
> > handle inline data.
> >
> > >       The ``addr`` field must be set to ``IOMAP_NULL_ADDR``.
> > >
> > >   * ``flags`` describe the status of the space mapping.
> > > -   These flags should be set by the filesystem in ``->iomap_begin``:
> > > +   These flags should be set by the filesystem in ``begin``:
> >>
> > > +``->iomap_next``
> > > +~~~~~~~~~~~~~~~~
> > > +
> > > +Each call must finish the previous mapping, if any, and then produce the
> >
> > Each call?  Oh, each implementation of ->iomap_next must finish the
> > previous mapping.
> >
> > > +next mapping for the current iteration position described by ``iter``.
> > > +The mapping is returned through ``iomap`` (and through ``srcmap`` for
> > > +operations that read from one mapping while writing to another; see
> > > +``begin`` below).
> > >
> > > -``->iomap_begin``
> > > +The callback returns ``1`` to continue iterating, ``0`` once the file
> > > +range has been fully consumed, and a negative errno on error.
> >
> > s/and/or/
> >
> > I think there should be a transition sentence here along the lines of
> >
> > "Most filesystems are not expected to implement all of these behaviors
> > in ->iomap_next themselves.  They should instead call iomap_process as
> > described below."
> >
> > Or demote the next section so it's more obvious that the "iomap_process"
> > and "->iomap_next" sections aren't independent?
> >
> 
> Sounds good, I'll incorporate all the suggestions you recommended.

<nod>

--D

> Thanks,
> Joanne
> 

  reply	other threads:[~2026-07-03  2:00 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-01  0:09 [PATCH v2 00/18] iomap: convert to in-iter iomap_next() model Joanne Koong
2026-07-01  0:09 ` [PATCH v2 01/18] iomap: add ->iomap_next() and iomap_process() helper Joanne Koong
2026-07-02 14:00   ` Christoph Hellwig
2026-07-02 23:01     ` Joanne Koong
2026-07-02 16:23   ` Darrick J. Wong
2026-07-02 22:41     ` Joanne Koong
2026-07-01  0:09 ` [PATCH v2 02/18] xfs: convert iomap ops to ->iomap_next() Joanne Koong
2026-07-02 14:03   ` Christoph Hellwig
2026-07-02 16:48     ` Darrick J. Wong
2026-07-03 12:33       ` Christoph Hellwig
2026-07-03 15:50         ` Darrick J. Wong
2026-07-02 16:43   ` Darrick J. Wong
2026-07-02 23:59     ` Joanne Koong
2026-07-03  1:21       ` Joanne Koong
2026-07-03  1:41         ` Darrick J. Wong
2026-07-03 12:32         ` Christoph Hellwig
2026-07-03  1:38       ` Darrick J. Wong
2026-07-01  0:09 ` [PATCH v2 03/18] btrfs: " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 04/18] ntfs3: " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 05/18] ntfs: " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 06/18] ext4: " Joanne Koong
2026-07-01 10:01   ` Jan Kara
2026-07-01  0:09 ` [PATCH v2 07/18] erofs: " Joanne Koong
2026-07-01  0:41   ` Gao Xiang
2026-07-01  0:09 ` [PATCH v2 08/18] zonefs: " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 09/18] ext2: " Joanne Koong
2026-07-01 10:02   ` Jan Kara
2026-07-01  0:09 ` [PATCH v2 10/18] block: " Joanne Koong
2026-07-01  0:55   ` Keith Busch
2026-07-02 14:03     ` Christoph Hellwig
2026-07-03  0:06     ` Joanne Koong
2026-07-01  0:09 ` [PATCH v2 11/18] f2fs: " Joanne Koong
2026-07-01  0:09   ` [f2fs-dev] " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 12/18] gfs2: " Joanne Koong
2026-07-03 11:45   ` Andreas Gruenbacher
2026-07-04  0:07     ` Joanne Koong
2026-07-01  0:09 ` [PATCH v2 13/18] hpfs: " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 14/18] fuse: " Joanne Koong
2026-07-01  0:09 ` [PATCH v2 15/18] exfat: " Joanne Koong
2026-07-03  1:41   ` Joanne Koong
2026-07-01  0:09 ` [PATCH v2 16/18] iomap: remove ->iomap_begin()/->iomap_end() legacy path Joanne Koong
2026-07-02 14:04   ` Christoph Hellwig
2026-07-02 16:51   ` Darrick J. Wong
2026-07-01  0:09 ` [PATCH v2 17/18] iomap: pass iomap_next_fn directly instead of struct iomap_ops Joanne Koong
2026-07-01  0:09   ` [f2fs-dev] " Joanne Koong
2026-07-01 10:04   ` Jan Kara
2026-07-01 10:04     ` [f2fs-dev] " Jan Kara
2026-07-02 14:07   ` Christoph Hellwig
2026-07-02 14:07     ` [f2fs-dev] " Christoph Hellwig
2026-07-02 16:51     ` Darrick J. Wong
2026-07-02 16:51       ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-07-03  1:47       ` Joanne Koong
2026-07-03  1:47         ` [f2fs-dev] " Joanne Koong
2026-07-03  2:01         ` Darrick J. Wong
2026-07-03  2:01           ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-07-03 10:37         ` Christian Brauner
2026-07-03 10:37           ` [f2fs-dev] " Christian Brauner via Linux-f2fs-devel
2026-07-02 16:58   ` Darrick J. Wong
2026-07-02 16:58     ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-07-03  0:17     ` Joanne Koong
2026-07-03  0:17       ` [f2fs-dev] " Joanne Koong
2026-07-03  1:42       ` Darrick J. Wong
2026-07-03  1:42         ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-07-01  0:09 ` [PATCH v2 18/18] Documentation: iomap: update docs to reflect iomap_next model Joanne Koong
2026-07-02 14:07   ` Christoph Hellwig
2026-07-02 19:26   ` Darrick J. Wong
2026-07-03  1:36     ` Joanne Koong
2026-07-03  2:00       ` Darrick J. Wong [this message]
2026-07-03 12:43         ` Christoph Hellwig
2026-07-03 16:11           ` Darrick J. Wong
2026-07-04  0:34             ` Joanne Koong
2026-07-04  4:38               ` Darrick J. Wong
2026-07-06  4:59                 ` Christoph Hellwig
2026-07-06  3:59               ` Christoph Hellwig
2026-07-06  3:56             ` Christoph Hellwig
2026-07-02 13:49 ` [PATCH v2 00/18] iomap: convert to in-iter iomap_next() model Christoph Hellwig
2026-07-03  1:08   ` Joanne Koong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260703020020.GS9392@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=brauner@kernel.org \
    --cc=corbet@lwn.net \
    --cc=hch@lst.de \
    --cc=hsiangkao@linux.alibaba.com \
    --cc=joannelkoong@gmail.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=skhan@linuxfoundation.org \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.