From: John Garry <john.g.garry@oracle.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: brauner@kernel.org, djwong@kernel.org, cem@kernel.org,
linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, ojaswin@linux.ibm.com,
ritesh.list@gmail.com, martin.petersen@oracle.com
Subject: Re: [PATCH v5 05/10] xfs: Iomap SW-based atomic write support
Date: Wed, 12 Mar 2025 09:00:52 +0000 [thread overview]
Message-ID: <ea94c5cd-ebba-404f-ba14-d59f1baa6e16@oracle.com> (raw)
In-Reply-To: <Z9E5nDg3_cred1bH@infradead.org>
On 12/03/2025 07:37, Christoph Hellwig wrote:
> On Mon, Mar 10, 2025 at 06:39:41PM +0000, John Garry wrote:
>> In cases of an atomic write occurs for misaligned or discontiguous disk
>> blocks, we will use a CoW-based method to issue the atomic write.
>>
>> So, for that case, return -EAGAIN to request that the write be issued in
>> CoW atomic write mode. The dio write path should detect this, similar to
>> how misaligned regular DIO writes are handled.
>
> How is -EAGAIN going to work here given that it is also used to defer
> non-blocking requests to the caller blocking context?
You are talking about IOMAP_NOWAIT handling, right? If so, we handle
that in xfs_file_dio_write_atomic(), similar to
xfs_file_dio_write_unaligned(), i.e. if IOMAP_NOWAIT is set and we get
-EAGAIN, then we will return -EAGAIN directly to the caller.
>
> What is the probem with only setting the flag that causes REQ_ATOMIC
> to be set from the file system instead of forcing it when calling
> iomap_dio_rw?
We have this in __iomap_dio_rw():
if (dio_flags & IOMAP_DIO_ATOMIC_SW)
iomi.flags |= IOMAP_ATOMIC_SW;
else if (iocb->ki_flags & IOCB_ATOMIC)
iomi.flags |= IOMAP_ATOMIC_HW;
I do admit that the checks are a bit uneven, i.e. check vs
IOMAP_DIO_ATOMIC_SW and IOCB_ATOMIC
If we want a flag to set REQ_ATOMIC from the FS then we need
IOMAP_DIO_BIO_ATOMIC, and that would set IOMAP_BIO_ATOMIC. Is that better?
>
> Also how you ensure this -EAGAIN only happens on the first extent
> mapped and you doesn't cause double writes?
When we find that a mapping does not suit REQ_ATOMIC-based atomic write,
then we immediately bail and retry with FS-based atomic write. And that
check should cover all requirements for a REQ_ATOMIC-based atomic write:
- aligned
- contiguous blocks, i.e. the mapping covers the full write
And we also have the check in iomap_dio_bit_iter() to ensure that the
mapping covers the full write (for REQ_ATOMIC-based atomic write).
>
>> + bool atomic_hw = flags & IOMAP_ATOMIC_HW;
>
> Again, atomic_hw is not a very useful variable name. But the
> whole idea of using a non-descriptive bool variable for a flags
> field feels like an antipattern to me.
>
>> - if (shared)
>> + if (shared) {
>> + if (atomic_hw &&
>> + !xfs_bmap_valid_for_atomic_write(&cmap,
>> + offset_fsb, end_fsb)) {
>> + error = -EAGAIN;
>> + goto out_unlock;
>> + }
>> goto out_found_cow;
>
> This needs a big fat comment explaining why bailing out here is
> fine and how it works.
ok
>
>> + /*
>> + * Use CoW method for when we need to alloc > 1 block,
>> + * otherwise we might allocate less than what we need here and
>> + * have multiple mappings.
>> + */
>
> Describe why this is done, not just what is done.
I did say that we may get multiple mappings, which obvs is not useful
for REQ_ATOMIC-based atomic write. But I can add a bit more detail.
Thanks,
John
next prev parent reply other threads:[~2025-03-12 9:01 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-10 18:39 [PATCH v5 00/10] large atomic writes for xfs with CoW John Garry
2025-03-10 18:39 ` [PATCH v5 01/10] xfs: Pass flags to xfs_reflink_allocate_cow() John Garry
2025-03-12 7:15 ` Christoph Hellwig
2025-03-12 8:19 ` John Garry
2025-03-10 18:39 ` [PATCH v5 02/10] xfs: Switch atomic write size check in xfs_file_write_iter() John Garry
2025-03-12 7:17 ` Christoph Hellwig
2025-03-12 8:21 ` John Garry
2025-03-10 18:39 ` [PATCH v5 03/10] xfs: Refactor xfs_reflink_end_cow_extent() John Garry
2025-03-12 7:24 ` Christoph Hellwig
2025-03-12 8:27 ` John Garry
2025-03-12 8:35 ` Christoph Hellwig
2025-03-12 15:46 ` Darrick J. Wong
2025-03-12 22:06 ` John Garry
2025-03-12 23:22 ` Darrick J. Wong
2025-03-13 1:25 ` Dave Chinner
2025-03-13 4:51 ` Darrick J. Wong
2025-03-13 6:11 ` John Garry
2025-03-18 0:43 ` Dave Chinner
2025-03-13 7:21 ` Dave Chinner
2025-03-22 5:19 ` Darrick J. Wong
2025-03-10 18:39 ` [PATCH v5 04/10] xfs: Reflink CoW-based atomic write support John Garry
2025-03-12 7:27 ` Christoph Hellwig
2025-03-12 9:13 ` John Garry
2025-03-12 13:45 ` Christoph Hellwig
2025-03-12 14:48 ` John Garry
2025-03-10 18:39 ` [PATCH v5 05/10] xfs: Iomap SW-based " John Garry
2025-03-12 7:37 ` Christoph Hellwig
2025-03-12 9:00 ` John Garry [this message]
2025-03-12 13:52 ` Christoph Hellwig
2025-03-12 14:57 ` John Garry
2025-03-12 15:55 ` Christoph Hellwig
2025-03-12 16:11 ` John Garry
2025-03-10 18:39 ` [PATCH v5 06/10] xfs: Add xfs_file_dio_write_atomic() John Garry
2025-03-10 18:39 ` [PATCH v5 07/10] xfs: Commit CoW-based atomic writes atomically John Garry
2025-03-12 7:39 ` Christoph Hellwig
2025-03-12 9:04 ` John Garry
2025-03-12 13:54 ` Christoph Hellwig
2025-03-12 15:01 ` John Garry
2025-03-10 18:39 ` [PATCH v5 08/10] xfs: Update atomic write max size John Garry
2025-03-11 14:40 ` Carlos Maiolino
2025-03-12 7:41 ` Christoph Hellwig
2025-03-12 8:09 ` John Garry
2025-03-12 8:13 ` Christoph Hellwig
2025-03-12 8:14 ` John Garry
2025-03-10 18:39 ` [PATCH v5 09/10] xfs: Allow block allocator to take an alignment hint John Garry
2025-03-12 7:42 ` Christoph Hellwig
2025-03-12 8:05 ` John Garry
2025-03-12 13:45 ` Christoph Hellwig
2025-03-12 14:47 ` John Garry
2025-03-12 16:00 ` Darrick J. Wong
2025-03-12 16:28 ` John Garry
2025-03-10 18:39 ` [PATCH RFC v5 10/10] iomap: Rename ATOMIC flags again John Garry
2025-03-12 7:13 ` Christoph Hellwig
2025-03-12 23:59 ` Dave Chinner
2025-03-13 6:28 ` John Garry
2025-03-13 7:02 ` Christoph Hellwig
2025-03-13 7:41 ` John Garry
2025-03-13 7:49 ` Christoph Hellwig
2025-03-13 7:53 ` John Garry
2025-03-13 8:09 ` Christoph Hellwig
2025-03-13 8:18 ` Christoph Hellwig
2025-03-13 8:24 ` John Garry
2025-03-13 8:28 ` Christoph Hellwig
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=ea94c5cd-ebba-404f-ba14-d59f1baa6e16@oracle.com \
--to=john.g.garry@oracle.com \
--cc=brauner@kernel.org \
--cc=cem@kernel.org \
--cc=djwong@kernel.org \
--cc=hch@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=ojaswin@linux.ibm.com \
--cc=ritesh.list@gmail.com \
/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.