From 4d1a4765426fb57439164089b3cb537ec65356eb Mon Sep 17 00:00:00 2001 From: Damien Le Moal Date: Tue, 22 Nov 2016 15:38:49 +0900 Subject: [PATCH] block_dev: Fixed direct I/O bio sector calculation A direct I/O alignment must be always checked against the device blocks size, but the I/O offset (bio->bi_iter.bi_sector must always use 512B sector unit, and not the actual logical block size. Signed-off-by: Damien Le Moal Reviewed-by: Christoph Hellwig Signed-off-by: Jens Axboe --- fs/block_dev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index 35cc494f2e1a..e49fb797e447 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -226,7 +226,7 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter, bio.bi_max_vecs = nr_pages; bio.bi_io_vec = vecs; bio.bi_bdev = bdev; - bio.bi_iter.bi_sector = pos >> blkbits; + bio.bi_iter.bi_sector = pos >> 9; bio.bi_private = current; bio.bi_end_io = blkdev_bio_end_io_simple; @@ -358,7 +358,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages) for (;;) { bio->bi_bdev = bdev; - bio->bi_iter.bi_sector = pos >> blkbits; + bio->bi_iter.bi_sector = pos >> 9; bio->bi_private = dio; bio->bi_end_io = blkdev_bio_end_io; -- 2.20.1