• Bob Peterson's avatar
    gfs2: Don't use filemap_splice_read · 0be84321
    Bob Peterson authored
    Starting with patch 2cb1e089, gfs2 started using the new function
    filemap_splice_read rather than the old (and subsequently deleted)
    function generic_file_splice_read.
    
    filemap_splice_read works by taking references to a number of folios in
    the page cache and splicing those folios into a pipe.  The folios are
    then read from the pipe and the folio references are dropped.  This can
    take an arbitrary amount of time.  We cannot allow that in gfs2 because
    those folio references will pin the inode glock to the node and prevent
    it from being demoted, which can lead to cluster-wide deadlocks.
    
    Instead, use copy_splice_read.
    
    (In addition, the old generic_file_splice_read called into ->read_iter,
    which called gfs2_file_read_iter, which took the inode glock during the
    operation.  The new filemap_splice_read interface does not take the
    inode glock anymore.  This is fixable, but it still wouldn't prevent
    cluster-wide deadlocks.)
    
    Fixes: 2cb1e089 ("splice: Use filemap_splice_read() instead of generic_file_splice_read()")
    Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    0be84321
file.c 40.4 KB