]> git.baikalelectronics.ru Git - kernel.git/commit
iomap: partially revert f2735117c4f (simulated directio short read on EFAULT)
authorDarrick J. Wong <darrick.wong@oracle.com>
Sun, 2 Dec 2018 16:38:07 +0000 (08:38 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 4 Dec 2018 17:40:02 +0000 (09:40 -0800)
commitf16f7a73bee0f7e54c18c1e7d7effafe99f04b56
tree243a2ee808dac5f912fc3816f7b6a05f1905cfa8
parentf08bd32bdc326d6204896f73ef55ef4b38130f7c
iomap: partially revert f2735117c4f (simulated directio short read on EFAULT)

In commit f2735117c4f, we tried to fix a problem wherein directio reads
into a splice pipe will bounce EFAULT/EAGAIN all the way out to
userspace by simulating a zero-byte short read.  This happens because
some directio read implementations (xfs) will call
bio_iov_iter_get_pages to grab pipe buffer pages and issue asynchronous
reads, but as soon as we run out of pipe buffers that _get_pages call
returns EFAULT, which the splice code translates to EAGAIN and bounces
out to userspace.

In that commit, the iomap code catches the EFAULT and simulates a
zero-byte read, but that causes assertion errors on regular splice reads
because xfs doesn't allow short directio reads.  This causes infinite
splice() loops and assertion failures on generic/095 on overlayfs
because xfs only permit total success or total failure of a directio
operation.  The underlying issue in the pipe splice code has now been
fixed by changing the pipe splice loop to avoid avoid reading more data
than there is space in the pipe.

Therefore, it's no longer necessary to simulate the short directio, so
remove the hack from iomap.

Fixes: f2735117c4f ("iomap: dio data corruption and spurious errors when pipes fill")
Reported-by: Murphy Zhou <jencce.kernel@gmail.com>
Ranted-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/iomap.c