• Eryu Guan's avatar
    mm/filemap: don't allow partially uptodate page for pipes · 60da81ea
    Eryu Guan authored
    Starting from 4.9-rc1 kernel, I started noticing some test failures of
    sendfile(2) and splice(2) (sendfile0N and splice01 from LTP) when
    testing on sub-page block size filesystems (tested both XFS and ext4),
    these syscalls start to return EIO in the tests.  e.g.
    
      sendfile02    1  TFAIL  :  sendfile02.c:133: sendfile(2) failed to return expected value, expected: 26, got: -1
      sendfile02    2  TFAIL  :  sendfile02.c:133: sendfile(2) failed to return expected value, expected: 24, got: -1
      sendfile02    3  TFAIL  :  sendfile02.c:133: sendfile(2) failed to return expected value, expected: 22, got: -1
      sendfile02    4  TFAIL  :  sendfile02.c:133: sendfile(2) failed to return expected value, expected: 20, got: -1
    
    This is because that in sub-page block size cases, we don't need the
    whole page to be uptodate, only the part we care about is uptodate is OK
    (if fs has ->is_partially_uptodate defined).
    
    But page_cache_pipe_buf_confirm() doesn't have the ability to check the
    partially-uptodate case, it needs the whole page to be uptodate.  So it
    returns EIO in this case.
    
    This is a regression introduced by commit 82c156f8 ("switch
    generic_file_splice_read() to use of ->read_iter()").  Prior to the
    change, generic_file_splice_read() doesn't allow partially-uptodate page
    either, so it worked fine.
    
    Fix it by skipping the partially-uptodate check if we're working on a
    pipe in do_generic_file_read(), so we read the whole page from disk as
    long as the page is not uptodate.
    
    I think the other way to fix it is to add the ability to check & allow
    partially-uptodate page to page_cache_pipe_buf_confirm(), but that is
    much harder to do and seems gain little.
    
    Link: http://lkml.kernel.org/r/1477986187-12717-1-git-send-email-guaneryu@gmail.comSigned-off-by: default avatarEryu Guan <guaneryu@gmail.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    60da81ea
filemap.c 77.5 KB