• Max Reitz's avatar
    xfs: Fix tail rounding in xfs_alloc_file_space() · e093c4be
    Max Reitz authored
    To ensure that all blocks touched by the range [offset, offset + count)
    are allocated, we need to calculate the block count from the difference
    of the range end (rounded up) and the range start (rounded down).
    
    Before this patch, we just round up the byte count, which may lead to
    unaligned ranges not being fully allocated:
    
    $ touch test_file
    $ block_size=$(stat -fc '%S' test_file)
    $ fallocate -o $((block_size / 2)) -l $block_size test_file
    $ xfs_bmap test_file
    test_file:
            0: [0..7]: 1396264..1396271
            1: [8..15]: hole
    
    There should not be a hole there.  Instead, the first two blocks should
    be fully allocated.
    
    With this patch applied, the result is something like this:
    
    $ touch test_file
    $ block_size=$(stat -fc '%S' test_file)
    $ fallocate -o $((block_size / 2)) -l $block_size test_file
    $ xfs_bmap test_file
    test_file:
            0: [0..15]: 11024..11039
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarCarlos Maiolino <cmaiolino@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>
    e093c4be
xfs_bmap_util.c 49.9 KB