On Thu, Apr 06, 2017 at 10:52:01AM +0200, Hannes Reinecke wrote: > On 04/06/2017 10:19 AM, Omar Sandoval wrote: > > From: Omar Sandoval <osandov@xxxxxx> > > > > The request queue created when we create a loop device has the default > > logical block size of 512. When we associate the device with an fd, we > > set the block size on the block_device but don't update the logical > > block size of the request_queue. This makes it impossibe to use direct > > I/O with a backing file on a device with a block size >512, as the > > following check in __loop_update_dio() fails: > > > > sb_bsize = bdev_logical_block_size(inode->i_sb->s_bdev); > > if (queue_logical_block_size(lo->lo_queue) >= sb_bsize && > > ... > > > > Fix it by updating the logical block size when we set the fd. > > > > Signed-off-by: Omar Sandoval <osandov@xxxxxx> > > --- > > drivers/block/loop.c | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > > index cc981f34e017..1bb22903ad1a 100644 > > --- a/drivers/block/loop.c > > +++ b/drivers/block/loop.c > > @@ -941,6 +941,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, > > /* let user-space know about the new size */ > > kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); > > > > + blk_queue_logical_block_size(lo->lo_queue, lo_blocksize); > > set_blocksize(bdev, lo_blocksize); > > > > lo->lo_state = Lo_bound; > > > Gnaa. > > I've tried so change exactly this by my patchset titled 'loop: enable > different logical blocksizes'. > And I even got agreement from Jens to merge it once it got another > review. Which, of course, no-one did. Yours looks like a more complete solution, sorry that I missed it. I'll take a look when you repost the patches.