• Andreas Gruenbacher's avatar
    gfs2: Don't get stuck writing page onto itself under direct I/O · fa58cc88
    Andreas Gruenbacher authored
    When a direct I/O write is performed, iomap_dio_rw() invalidates the
    part of the page cache which the write is going to before carrying out
    the write.  In the odd case, the direct I/O write will be reading from
    the same page it is writing to.  gfs2 carries out writes with page
    faults disabled, so it should have been obvious that this page
    invalidation can cause iomap_dio_rw() to never make any progress.
    Currently, gfs2 will end up in an endless retry loop in
    gfs2_file_direct_write() instead, though.
    
    Break this endless loop by limiting the number of retries and falling
    back to buffered I/O after that.
    
    Also simplify should_fault_in_pages() sightly and add a comment to make
    the above case easier to understand.
    Reported-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    fa58cc88
file.c 40.5 KB