On Tue, Feb 26, 2019 at 09:42:48PM +0800, Ming Lei wrote:
> On Tue, Feb 26, 2019 at 05:02:30AM -0800, Matthew Wilcox wrote:
> > Wait, we're imposing a ridiculous amount of complexity on XFS for no
> > reason at all? We should just change this to 512-byte alignment. Tying
> > it to the blocksize of the device never made any sense.
>
> OK, that is fine since we can fallback to buffered IO for loop in case of
> unaligned dio.
>
> Then something like the following patch should work for all fs, could
> anyone comment on this approach?
That's not even close to what I meant.
diff --git a/fs/direct-io.c b/fs/direct-io.c
index ec2fb6fe6d37..dee1fc47a7fc 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -1185,18 +1185,20 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode
*inode,
struct dio_submit sdio = { 0, };
struct buffer_head map_bh = { 0, };
struct blk_plug plug;
- unsigned long align = offset | iov_iter_alignment(iter);
/*
* Avoid references to bdev if not absolutely needed to give
* the early prefetch in the caller enough time.
*/
- if (align & blocksize_mask) {
+ if (iov_iter_alignment(iter) & 511)
+ goto out;
+
+ if (offset & blocksize_mask) {
if (bdev)
blkbits = blksize_bits(bdev_logical_block_size(bdev));
blocksize_mask = (1 << blkbits) - 1;
- if (align & blocksize_mask)
+ if (offset & blocksize_mask)
goto out;
}