Re: [PATCH v7 4/6] block: loop: prepare for supporing direct IO
From: Ming Lei <hidden>
Date: 2015-07-27 09:53:37
Also in:
lkml
On Mon, Jul 27, 2015 at 5:45 AM, Christoph Hellwig [off-list ref] wrote:
On Mon, Jul 27, 2015 at 05:41:57AM -0400, Ming Lei wrote:quoted
quoted
Why the hardcoded value? I suspect this should be more like: if (dio && inode->i_sb->s_bdev && (lo->lo_offset & (bdev_io_min(inode->i_sb->s_bdev) - 1)) != 0) dio = false;The above can't work if the backing device has a bigger sector size (such as 4K), that is why loop's direct-io requires 512 min_io_size of backing device.Why doesn't it work? If the backing device sector size is 4k and lo_offset is 0 or a multiple of 4k it should allow direct I/O, and my code sniplet will allow that.
Because size has to be 4k aligned too. And it can't work in the example posted by Dave Chinner:
I have a 4k sector backing device and a 512 byte sector filesystem image. I can't do 512 byte direct IO to the filesystem image, so I can't run tools that handle fs images in files using direct Io on that file. Create a loop device with the filesystem image, and now I can do 512 byte direct IO to the filesystem image, because all that direct IO to the filesystem image is now buffered by the loop device. If the loop device does direct io in this situation, the backing filesystem rejects direct IO from the loop device because it is not sector (4k) sized/aligned. User now swears, shouts and curses you from afar.
Thanks,