• Lachlan McIlroy's avatar
    [XFS] Prevent direct I/O from mapping extents beyond eof · 364f358a
    Lachlan McIlroy authored
    With the help from some tracing I found that we try to map extents beyond
    eof when doing a direct I/O read. It appears that the way to inform the
    generic direct I/O path (ie do_direct_IO()) that we have breached eof is
    to return an unmapped buffer from xfs_get_blocks_direct(). This will cause
    do_direct_IO() to jump to the hole handling code where is will check for
    eof and then abort.
    
    This problem was found because a direct I/O read was trying to map beyond
    eof and was encountering delayed allocations. The delayed allocations
    beyond eof are speculative allocations and they didn't get converted when
    the direct I/O flushed the file because there was only enough space in the
    current AG to convert and write out the dirty pages within eof. Note that
    xfs_iomap_write_allocate() wont necessarily convert all the delayed
    allocation passed to it - it will return after allocating the first extent
    - so if the delayed allocation extends beyond eof then it will stay that
    way.
    
    SGI-PV: 983683
    
    SGI-Modid: xfs-linux-melb:xfs-kern:31929a
    Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
    364f358a
xfs_aops.c 38.8 KB