Re: [RFC 3/8] iomap: Add atomic write support for direct-io

Dave Chinner
2024-03-04T01:17:00Z

On Sat, Mar 02, 2024 at 01:12:00PM +0530, Ritesh Harjani (IBM) wrote:
> This adds direct-io atomic writes support in iomap. This adds -
> 1. IOMAP_ATOMIC flag for iomap iter.
> 2. Sets REQ_ATOMIC to bio opflags.
> 3. Adds necessary checks in iomap_dio code to ensure a single bio is
> submitted for an atomic write request. (since we only support ubuf
> type iocb). Otherwise return an error EIO.
> 4. Adds a common helper routine iomap_dio_check_atomic(). It helps in
> verifying mapped length and start/end physical offset against the hw
> device constraints for supporting atomic writes.
>
> This patch is based on a patch from John Garry <john.g.garry@oracle.com>
> which adds such support of DIO atomic writes to iomap.
>
> Co-developed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
> ---
> fs/iomap/direct-io.c | 75 +++++++++++++++++++++++++++++++++++++++++--
> fs/iomap/trace.h | 3 +-
> include/linux/iomap.h | 1 +
> 3 files changed, 75 insertions(+), 4 deletions(-)

Ugh. Now we have two competing sets of changes to bring RWF_ATOMIC
support to iomap. One from John here:

https://lore.kernel.org/linux-fsdevel/20240124142645.9334-1-john.g.garry@oracle.com/

and now this one.

Can the two of you please co-ordinate your efforts and based your
filesysetm work off the same iomap infrastructure changes?

.....

> @@ -356,6 +360,11 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
> if (need_zeroout) {
> /* zero out from the start of the block to the write offset */
> pad = pos & (fs_block_size - 1);
> + if (unlikely(pad && atomic_write)) {
> + WARN_ON_ONCE("pos not atomic write aligned\n");
> + ret = -EINVAL;
> + goto out;
> + }

This atomic IO should have been rejected before it even got to
the layers where the bios are being built. If the IO alignment is
such that it does not align to filesystem allocation constraints, it
should be rejected at the filesystem ->write_iter() method and not
even get to the iomap layer.

.....

> @@ -516,6 +535,44 @@ static loff_t iomap_dio_iter(const struct iomap_iter *iter,
> }
> }
>
> +/*
> + * iomap_dio_check_atomic: DIO Atomic checks before calling bio submission.
> + * @iter: iomap iterator
> + * This function is called after filesystem block mapping and before bio
> + * formation/submission. This is the right place to verify hw device/block
> + * layer constraints to be followed for doing atomic writes. Hence do those
> + * common checks here.
> + */
> +static bool iomap_dio_check_atomic(struct iomap_iter *iter)
> +{
> + struct block_device *bdev = iter->iomap.bdev;
> + unsigned long long map_len = iomap_length(iter);
> + unsigned long long start = iomap_sector(&iter->iomap, iter->pos)
> + << SECTOR_SHIFT;
> + unsigned long long end = start + map_len - 1;
> + unsigned int awu_min =
> + queue_atomic_write_unit_min_bytes(bdev->bd_queue);
> + unsigned int awu_max =
> + queue_atomic_write_unit_max_bytes(bdev->bd_queue);
> + unsigned long boundary =
> + queue_atomic_write_boundary_bytes(bdev->bd_queue);
> + unsigned long mask = ~(boundary - 1);
> +
> +
> + /* map_len should be same as user specified iter->len */
> + if (map_len < iter->len)
> + return false;
> + /* start should be aligned to block device min atomic unit alignment */
> + if (!IS_ALIGNED(start, awu_min))
> + return false;
> + /* If top bits doesn't match, means atomic unit boundary is crossed */
> + if (boundary && ((start | mask) != (end | mask)))
> + return false;
> +
> + return true;
> +}

I think you are re-implementing stuff that John has already done at
higher layers and in a generic manner. i.e.
generic_atomic_write_valid() in this patch:

https://lore.kernel.org/linux-fsdevel/20240226173612.1478858-4-john.g.garry@oracle.com/

We shouldn't be getting anywhere near the iomap layer if the IO is
not properly aligned to atomic IO constraints...

So, yeah, can you please co-ordinate the development of this
patchset with John and the work that has already been done to
support this functionality on block devices and XFS?

-Dave.
--
Dave Chinner
david@fromorbit.com