• Omar Sandoval's avatar
    xfs: fix realtime file data space leak · 0c4da70c
    Omar Sandoval authored
    Realtime files in XFS allocate extents in rextsize units. However, the
    written/unwritten state of those extents is still tracked in blocksize
    units. Therefore, a realtime file can be split up into written and
    unwritten extents that are not necessarily aligned to the realtime
    extent size. __xfs_bunmapi() has some logic to handle these various
    corner cases. Consider how it handles the following case:
    
    1. The last extent is unwritten.
    2. The last extent is smaller than the realtime extent size.
    3. startblock of the last extent is not aligned to the realtime extent
       size, but startblock + blockcount is.
    
    In this case, __xfs_bunmapi() calls xfs_bmap_add_extent_unwritten_real()
    to set the second-to-last extent to unwritten. This should merge the
    last and second-to-last extents, so __xfs_bunmapi() moves on to the
    second-to-last extent.
    
    However, if the size of the last and second-to-last extents combined is
    greater than MAXEXTLEN, xfs_bmap_add_extent_unwritten_real() does not
    merge the two extents. When that happens, __xfs_bunmapi() skips past the
    last extent without unmapping it, thus leaking the space.
    
    Fix it by only unwriting the minimum amount needed to align the last
    extent to the realtime extent size, which is guaranteed to merge with
    the last extent.
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    0c4da70c
xfs_bmap.c 169 KB