On Sun, Dec 2, 2018 at 8:10 PM Darrick J. Wong <darrick.wong@xxxxxxxxxx> wrote: > > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > In commit 4721a601099, 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: 4721a601099 ("iomap: dio data corruption and spurious errors when pipes fill") > Reported-by: Amir Goldstein <amir73il@xxxxxxxxx> Wasn't me. I believe it was Murphy Zhou <jencce.kernel@xxxxxxxxx>. If you want you can add Ranted-by Amir ;-) Anyway, looks fine. > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > v2: split into two patches per hch request > --- > fs/iomap.c | 9 --------- > 1 file changed, 9 deletions(-) > > diff --git a/fs/iomap.c b/fs/iomap.c > index 3ffb776fbebe..d6bc98ae8d35 100644 > --- a/fs/iomap.c > +++ b/fs/iomap.c > @@ -1877,15 +1877,6 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, > dio->wait_for_completion = true; > ret = 0; > } > - > - /* > - * Splicing to pipes can fail on a full pipe. We have to > - * swallow this to make it look like a short IO > - * otherwise the higher splice layers will completely > - * mishandle the error and stop moving data. > - */ > - if (ret == -EFAULT) > - ret = 0; > break; > } > pos += ret;