• Brian Foster's avatar
    iomap: support partial page discard on writeback block mapping failure · 763e4cdc
    Brian Foster authored
    iomap writeback mapping failure only calls into ->discard_page() if
    the current page has not been added to the ioend. Accordingly, the
    XFS callback assumes a full page discard and invalidation. This is
    problematic for sub-page block size filesystems where some portion
    of a page might have been mapped successfully before a failure to
    map a delalloc block occurs. ->discard_page() is not called in that
    error scenario and the bio is explicitly failed by iomap via the
    error return from ->prepare_ioend(). As a result, the filesystem
    leaks delalloc blocks and corrupts the filesystem block counters.
    
    Since XFS is the only user of ->discard_page(), tweak the semantics
    to invoke the callback unconditionally on mapping errors and provide
    the file offset that failed to map. Update xfs_discard_page() to
    discard the corresponding portion of the file and pass the range
    along to iomap_invalidatepage(). The latter already properly handles
    both full and sub-page scenarios by not changing any iomap or page
    state on sub-page invalidations.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    763e4cdc
xfs_aops.c 18.2 KB