On Mon, May 23, 2022 at 02:01:19PM -0700, Keith Busch wrote: > From: Keith Busch <kbusch@xxxxxxxxxx> > diff --git a/block/fops.c b/block/fops.c > index b9b83030e0df..218e4a8b92aa 100644 > --- a/block/fops.c > +++ b/block/fops.c > @@ -42,6 +42,16 @@ static unsigned int dio_bio_write_op(struct kiocb *iocb) > return op; > } > > +static int blkdev_dio_aligned(struct block_device *bdev, loff_t pos, > + struct iov_iter *iter) > +{ > + if ((pos | iov_iter_count(iter)) & (bdev_logical_block_size(bdev) - 1)) Minor nit as ALIGN* macros have been used in other places, this alignment check can also be changed to using IS_ALIGNED macro: if (!IS_ALIGNED(pos | iov_iter_count(iter), bdev_logical_block_size(bdev))) > + return -EINVAL; > + if (iov_iter_alignment(iter) & bdev_dma_alignment(bdev)) > + return -EINVAL; > + return 0; > +} > + > #define DIO_INLINE_BIO_VECS 4 > > static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb, > @@ -54,9 +64,9 @@ static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb, > struct bio bio; > ssize_t ret; > > - if ((pos | iov_iter_alignment(iter)) & > - (bdev_logical_block_size(bdev) - 1)) > - return -EINVAL; > + ret = blkdev_dio_aligned(bdev, pos, iter); > + if (ret) > + return ret; > -- Pankaj Raghav