• Brian Foster's avatar
    xfs: bypass final dfops roll in trans commit path · b277c37f
    Brian Foster authored
    Once xfs_defer_finish() has completed all deferred operations, it
    checks the dirty state of the transaction and rolls it once more to
    return a clean transaction for the caller. This primarily to cover
    the case where repeated xfs_defer_finish() calls are made in a loop
    and we need to make sure that the caller starts the next iteration
    with a clean transaction. Otherwise we risk transaction reservation
    overrun.
    
    This final transaction roll is not required in the transaction
    commit path, however, because the transaction is immediately
    committed and freed after dfops completion. Refactor the final roll
    into a separate helper such that we can avoid it in the transaction
    commit path.  Lift the dfops reset as well so dfops remains valid
    until after the last call to xfs_defer_trans_roll(). The reset is
    also unnecessary in the transaction commit path because the
    transaction is about to complete.
    
    This eliminates unnecessary regrants of transactions where the
    associated transaction roll can be replaced by a transaction commit.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarBill O'Donnell <billodo@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>
    b277c37f
xfs_defer.h 2.9 KB