On Thu, Jul 11, 2024 at 10:36:37AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > As of v6.0, the DIO memory buffer alignment is no longer aligned to > the logical sector size of the underlying block device. There is now > a specific DMA alignment parameter that memory buffers should be > aligned to. statx(STATX_DIOALIGN) gets this right, but > XFS_IOC_DIOINFO does not - it still uses the older fixed alignment > defined by the block device logical sector size. > > This was found because the s390 DASD driver increased DMA alignment > to PAGE_SIZE in commit bc792884b76f ("s390/dasd: Establish DMA > alignment") and DIO aligned to logical sector sizes have started > failing on kernels with that commit. Fixing the "userspace fails > because device alignment constraints increased" issue is not XFS's > problem, but we really should be reporting the correct device memory > alignment in XFS_IOC_DIOINFO. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > --- > fs/xfs/xfs_ioctl.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index f0117188f302..71eba4849e03 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1368,7 +1368,8 @@ xfs_file_ioctl( > struct xfs_buftarg *target = xfs_inode_buftarg(ip); > struct dioattr da; > > - da.d_mem = da.d_miniosz = target->bt_logical_sectorsize; > + da.d_mem = bdev_dma_alignment(target->bt_bdev); bdev_dma_alignment returns a mask, so I think you want to add one here? Though at this point, perhaps DIOINFO should query the STATX_DIOALIGN information so xfs doesn't have to maintain this anymore? (Or just make a helper that statx and DIOINFO can both call?) --D > + da.d_miniosz = target->bt_logical_sectorsize; > da.d_maxiosz = INT_MAX & ~(da.d_miniosz - 1); > > if (copy_to_user(arg, &da, sizeof(da))) > -- > 2.45.1 > >