Re: [PATCH 2/4] fs: add STATX_DIO_READ_ALIGN

Jan Kara
2025-01-06T16:32:16Z

On Mon 06-01-25 16:15:55, Christoph Hellwig wrote:
> Add a separate dio read align field, as many out of place write
> file systems can easily do reads aligned to the device sector size,
> but require bigger alignment for writes.
>
> This is usually papered over by falling back to buffered I/O for smaller
> writes and doing read-modify-write cycles, but performance for this
> sucks, so applications benefit from knowing the actual write alignment.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Darrick J. Wong <djwong@kernel.org>

So if I understand right dio_offset_align is guaranteed to work for all DIO
(i.e., maximum of all possible alignments), dio_read_offset_align is
possibly lower and works only for reads. Looks good to me. Feel free to
add:

Reviewed-by: Jan Kara <jack@suse.cz>

Honza

> ---
> fs/stat.c | 1 +
> include/linux/stat.h | 1 +
> include/uapi/linux/stat.h | 4 +++-
> 3 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/fs/stat.c b/fs/stat.c
> index 0870e969a8a0..2c0e111a098a 100644
> --- a/fs/stat.c
> +++ b/fs/stat.c
> @@ -725,6 +725,7 @@ cp_statx(const struct kstat *stat, struct statx __user *buffer)
> tmp.stx_mnt_id = stat->mnt_id;
> tmp.stx_dio_mem_align = stat->dio_mem_align;
> tmp.stx_dio_offset_align = stat->dio_offset_align;
> + tmp.stx_dio_read_offset_align = stat->dio_read_offset_align;
> tmp.stx_subvol = stat->subvol;
> tmp.stx_atomic_write_unit_min = stat->atomic_write_unit_min;
> tmp.stx_atomic_write_unit_max = stat->atomic_write_unit_max;
> diff --git a/include/linux/stat.h b/include/linux/stat.h
> index 3d900c86981c..9d8382e23a9c 100644
> --- a/include/linux/stat.h
> +++ b/include/linux/stat.h
> @@ -52,6 +52,7 @@ struct kstat {
> u64 mnt_id;
> u32 dio_mem_align;
> u32 dio_offset_align;
> + u32 dio_read_offset_align;
> u64 change_cookie;
> u64 subvol;
> u32 atomic_write_unit_min;
> diff --git a/include/uapi/linux/stat.h b/include/uapi/linux/stat.h
> index 8b35d7d511a2..f78ee3670dd5 100644
> --- a/include/uapi/linux/stat.h
> +++ b/include/uapi/linux/stat.h
> @@ -179,7 +179,8 @@ struct statx {
> /* Max atomic write segment count */
> __u32 stx_atomic_write_segments_max;
>
> - __u32 __spare1[1];
> + /* File offset alignment for direct I/O reads */
> + __u32 stx_dio_read_offset_align;
>
> /* 0xb8 */
> __u64 __spare3[9]; /* Spare space for future expansion */
> @@ -213,6 +214,7 @@ struct statx {
> #define STATX_MNT_ID_UNIQUE 0x00004000U /* Want/got extended stx_mount_id */
> #define STATX_SUBVOL 0x00008000U /* Want/got stx_subvol */
> #define STATX_WRITE_ATOMIC 0x00010000U /* Want/got atomic_write_* fields */
> +#define STATX_DIO_READ_ALIGN 0x00020000U /* Want/got dio read alignment info */
>
> #define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */
>
> --
> 2.45.2
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR