• Dave Chinner's avatar
    xfs: delayed alloc blocks beyond EOF are valid after writeback · 309c8480
    Dave Chinner authored
    There is an assumption in the parts of XFS that flushing a dirty
    file will make all the delayed allocation blocks disappear from an
    inode. That is, that after calling xfs_flush_pages() then
    ip->i_delayed_blks will be zero.
    
    This is an invalid assumption as we may have specualtive
    preallocation beyond EOF and they are recorded in
    ip->i_delayed_blks. A flush of the dirty pages of an inode will not
    change the state of these blocks beyond EOF, so a non-zero
    deeelalloc block count after a flush is valid.
    
    The bmap code has an invalid ASSERT() that needs to be removed, and
    the swapext code has a bug in that while it swaps the data forks
    around, it fails to swap the i_delayed_blks counter associated with
    the fork and hence can get the block accounting wrong.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    309c8480
xfs_bmap.c 184 KB