From: Brian Foster <bfoster@redhat.com>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org
Subject: Re: [PATCH 6/6] iomap: rework iomap_write_begin() to return folio offset and length
Date: Fri, 2 May 2025 09:18:40 -0400 [thread overview]
Message-ID: <aBTGMGWjnVZ3lP4d@bfoster> (raw)
In-Reply-To: <20250501222229.GL25675@frogsfrogsfrogs>
On Thu, May 01, 2025 at 03:22:29PM -0700, Darrick J. Wong wrote:
> On Wed, Apr 30, 2025 at 03:01:12PM -0400, Brian Foster wrote:
> > iomap_write_begin() returns a folio based on current pos and
> > remaining length in the iter, and each caller then trims the
> > pos/length to the given folio. Clean this up a bit and let
> > iomap_write_begin() return the trimmed range along with the folio.
> >
> > Signed-off-by: Brian Foster <bfoster@redhat.com>
> > ---
> > fs/iomap/buffered-io.c | 26 +++++++++++++++-----------
> > 1 file changed, 15 insertions(+), 11 deletions(-)
> >
> > diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> > index d3b30ebad9ea..2fde268c39fc 100644
> > --- a/fs/iomap/buffered-io.c
> > +++ b/fs/iomap/buffered-io.c
> > @@ -793,15 +793,22 @@ static int iomap_write_begin_inline(const struct iomap_iter *iter,
> > return iomap_read_inline_data(iter, folio);
> > }
> >
> > -static int iomap_write_begin(struct iomap_iter *iter, size_t len,
> > - struct folio **foliop)
> > +/*
> > + * Grab and prepare a folio for write based on iter state. Returns the folio,
> > + * offset, and length. Callers can optionally pass a max length *plen,
> > + * otherwise init to zero.
> > + */
> > +static int iomap_write_begin(struct iomap_iter *iter, struct folio **foliop,
> > + size_t *poffset, u64 *plen)
>
> Hmm, is this offset and length supposed to be bytes within the folio?
> I find it a little odd that plen would be a u64 then, unless we're
> preparing for folios that huge? Or is that just to avoid integer
> truncation issues?
>
It was more the latter.. it's an input/output param for callers that use
iomap_length(). That returns a u64, so just trying to keep things
consistent. I suppose we could break the function decl into one param
per line with "in/out" type comments if you think that is useful..?
Brian
> --D
>
> > {
> > const struct iomap_folio_ops *folio_ops = iter->iomap.folio_ops;
> > const struct iomap *srcmap = iomap_iter_srcmap(iter);
> > loff_t pos = iter->pos;
> > + u64 len = min_t(u64, SIZE_MAX, iomap_length(iter));
> > struct folio *folio;
> > int status = 0;
> >
> > + len = *plen > 0 ? min_t(u64, len, *plen) : len;
> > BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
> > if (srcmap != &iter->iomap)
> > BUG_ON(pos + len > srcmap->offset + srcmap->length);
> > @@ -833,8 +840,7 @@ static int iomap_write_begin(struct iomap_iter *iter, size_t len,
> > }
> > }
> >
> > - if (pos + len > folio_pos(folio) + folio_size(folio))
> > - len = folio_pos(folio) + folio_size(folio) - pos;
> > + pos = iomap_trim_folio_range(iter, folio, poffset, &len);
> >
> > if (srcmap->type == IOMAP_INLINE)
> > status = iomap_write_begin_inline(iter, folio);
> > @@ -847,6 +853,7 @@ static int iomap_write_begin(struct iomap_iter *iter, size_t len,
> > goto out_unlock;
> >
> > *foliop = folio;
> > + *plen = len;
> > return 0;
> >
> > out_unlock:
> > @@ -967,7 +974,7 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
> > break;
> > }
> >
> > - status = iomap_write_begin(iter, bytes, &folio);
> > + status = iomap_write_begin(iter, &folio, &offset, &bytes);
> > if (unlikely(status)) {
> > iomap_write_failed(iter->inode, iter->pos, bytes);
> > break;
> > @@ -975,7 +982,7 @@ static int iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
> > if (iter->iomap.flags & IOMAP_F_STALE)
> > break;
> >
> > - pos = iomap_trim_folio_range(iter, folio, &offset, &bytes);
> > + pos = iter->pos;
> >
> > if (mapping_writably_mapped(mapping))
> > flush_dcache_folio(folio);
> > @@ -1295,14 +1302,12 @@ static int iomap_unshare_iter(struct iomap_iter *iter)
> > bool ret;
> >
> > bytes = min_t(u64, SIZE_MAX, bytes);
> > - status = iomap_write_begin(iter, bytes, &folio);
> > + status = iomap_write_begin(iter, &folio, &offset, &bytes);
> > if (unlikely(status))
> > return status;
> > if (iomap->flags & IOMAP_F_STALE)
> > break;
> >
> > - iomap_trim_folio_range(iter, folio, &offset, &bytes);
> > -
> > ret = iomap_write_end(iter, bytes, bytes, folio);
> > __iomap_put_folio(iter, bytes, folio);
> > if (WARN_ON_ONCE(!ret))
> > @@ -1367,7 +1372,7 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
> > bool ret;
> >
> > bytes = min_t(u64, SIZE_MAX, bytes);
> > - status = iomap_write_begin(iter, bytes, &folio);
> > + status = iomap_write_begin(iter, &folio, &offset, &bytes);
> > if (status)
> > return status;
> > if (iter->iomap.flags & IOMAP_F_STALE)
> > @@ -1376,7 +1381,6 @@ static int iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
> > /* warn about zeroing folios beyond eof that won't write back */
> > WARN_ON_ONCE(folio_pos(folio) > iter->inode->i_size);
> >
> > - iomap_trim_folio_range(iter, folio, &offset, &bytes);
> > folio_zero_range(folio, offset, bytes);
> > folio_mark_accessed(folio);
> >
> > --
> > 2.49.0
> >
> >
>
next prev parent reply other threads:[~2025-05-02 13:15 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-30 19:01 [PATCH 0/6] iomap: misc buffered write path cleanups and prep Brian Foster
2025-04-30 19:01 ` [PATCH 1/6] iomap: resample iter->pos after iomap_write_begin() calls Brian Foster
2025-05-05 9:00 ` Christoph Hellwig
2025-04-30 19:01 ` [PATCH 2/6] iomap: drop unnecessary pos param from iomap_write_[begin|end] Brian Foster
2025-05-01 22:22 ` Darrick J. Wong
2025-05-05 9:01 ` Christoph Hellwig
2025-04-30 19:01 ` [PATCH 3/6] iomap: drop pos param from __iomap_[get|put]_folio() Brian Foster
2025-05-01 22:22 ` Darrick J. Wong
2025-05-05 9:01 ` Christoph Hellwig
2025-04-30 19:01 ` [PATCH 4/6] iomap: helper to trim pos/bytes to within folio Brian Foster
2025-05-05 9:03 ` Christoph Hellwig
2025-05-05 14:38 ` Brian Foster
2025-04-30 19:01 ` [PATCH 5/6] iomap: push non-large folio check into get folio path Brian Foster
2025-05-05 9:03 ` Christoph Hellwig
2025-04-30 19:01 ` [PATCH 6/6] iomap: rework iomap_write_begin() to return folio offset and length Brian Foster
2025-05-01 22:22 ` Darrick J. Wong
2025-05-02 13:18 ` Brian Foster [this message]
2025-05-02 19:40 ` Darrick J. Wong
2025-05-02 20:00 ` Darrick J. Wong
2025-05-05 14:39 ` Brian Foster
2025-05-05 9:05 ` Christoph Hellwig
2025-05-05 14:39 ` Brian Foster
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=aBTGMGWjnVZ3lP4d@bfoster \
--to=bfoster@redhat.com \
--cc=djwong@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.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.