Messages in this thread | | | Date | Tue, 30 Sep 2014 12:37:07 -0400 | From | David Jeffery <> | Subject | Re: [PATCH] Return short read or 0 at end of a raw device, not EIO |
| |
On 09/30/2014 11:28 AM, Christoph Hellwig wrote: > On Mon, Sep 29, 2014 at 06:08:11PM -0400, David Jeffery wrote: >> On 09/29/2014 03:05 PM, Christoph Hellwig wrote: >>> Seems like this should be changed in the generic code, or is there some >>> reason why it would return EIO only for devices, but not for regular >>> files in this case? >>> >> >> Regular files shouldn't be returning EIO and don't in my tests. The file >> systems manage direct I/O EOF handling in their own block or direct_IO >> callbacks. Block devices do not and instead do the size checks up >> front. Raw devices were bypassing the block device check, so only the >> raw driver should be having this issue. > > So I guess the problem is commit > > "blkdev_aio_read(): switch to generic_file_read_iter(), get rid of iov_shorten()" > > which removes the iov_shorten call in blkdev_aio_read? This should be > mentioned in the changelog. > > But maybe we should instead make block devices behave more similar to > regular files in this respect?
The issue's origin should be with bbec0270bdd8 "blkdev_max_block: make private to fs/buffer.c". This change intentionally removed the size checks from blkdev_get_block() to avoid issues with the size variables changing underneath the calls. Commit 684c9aaebbb0 is the initial commit to add the size checks with blkdev_aio_read() since blkdev_get_block() no longer checks size. As the raw driver was also dependent on the size checks in blkdev_get_block(), it was broken by bbec0270bdd8 but not fixed at all by 684c9aaebbb0.
> > Also did you make sure to add your regression test somewhere, e.g. ltp? >
No I have not. I'll see about an ltp test.
| |