Thread (12 messages) flat view 12 messages, 3 authors, 2015-07-30

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,
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help