• Darrick J. Wong's avatar
    iomap: partially revert 4721a601 (simulated directio short read on EFAULT) · 8f67b5ad
    Darrick J. Wong authored
    In commit 4721a601, 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: 4721a601 ("iomap: dio data corruption and spurious errors when pipes fill")
    Reported-by: default avatarMurphy Zhou <jencce.kernel@gmail.com>
    Ranted-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    8f67b5ad
iomap.c 52.9 KB