diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 4c18b313c9df..45f8b1f354ef 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -996,6 +996,16 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, if (!(lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync) blk_queue_write_cache(lo->lo_queue, true, false); + if (io_is_direct(lo->lo_backing_file) && inode->i_sb->s_bdev) { + /* In case of direct I/O, match underlying block size */ + unsigned short bsize = bdev_logical_block_size( + inode->i_sb->s_bdev); + + blk_queue_logical_block_size(lo->lo_queue, bsize); + blk_queue_physical_block_size(lo->lo_queue, bsize); + blk_queue_io_min(lo->lo_queue, bsize); + } + loop_update_dio(lo); set_capacity(lo->lo_disk, size); bd_set_size(bdev, size << 9);