• Brian Foster's avatar
    xfs: shutdown if block allocation overruns tx reservation · 3e78b9a4
    Brian Foster authored
    The ->t_blk_res_used field tracks how many blocks have been used in
    the current transaction. This should never exceed the block
    reservation (->t_blk_res) for a particular transaction. We currently
    assert this condition in the transaction block accounting code, but
    otherwise take no additional action should this situation occur.
    
    The overrun generally has no effect if space ends up being available
    and the associated transaction commits. If the transaction is
    duplicated, however, the current block usage is used to determine
    the remaining block reservation to be transferred to the new
    transaction. If usage exceeds reservation, this calculation
    underflows and creates a transaction with an invalid and excessive
    reservation. When the second transaction commits, the release of
    unused blocks corrupts the in-core free space counters. With lazy
    superblock accounting enabled, this inconsistency eventually
    trickles to the on-disk superblock and corrupts the filesystem.
    
    Replace the transaction block usage accounting assert with an
    explicit overrun check. If the transaction overruns the reservation,
    shutdown the filesystem immediately to prevent corruption. Add a new
    assert to xfs_trans_dup() to catch any callers that might induce
    this invalid state in the future.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    3e78b9a4
xfs_trans.c 28.8 KB