• Andreas Gruenbacher's avatar
    gfs2: Rework the log space allocation logic · fe3e3976
    Andreas Gruenbacher authored
    The current log space allocation logic is hard to understand or extend.
    The principle it that when the log is flushed, we may or may not have a
    transaction active that has space allocated in the log.  To deal with
    that, we set aside a magical number of blocks to be used in case we
    don't have an active transaction.  It isn't clear that the pool will
    always be big enough.  In addition, we can't return unused log space at
    the end of a transaction, so the number of blocks allocated must exactly
    match the number of blocks used.
    
    Simplify this as follows:
     * When transactions are allocated or merged, always reserve enough
       blocks to flush the transaction (err on the safe side).
     * In gfs2_log_flush, return any allocated blocks that haven't been used.
     * Maintain a pool of spare blocks big enough to do one log flush, as
       before.
     * In gfs2_log_flush, when we have no active transaction, allocate a
       suitable number of blocks.  For that, use the spare pool when
       called from logd, and leave the pool alone otherwise.  This means
       that when the log is almost full, logd will still be able to do one
       more log flush, which will result in more log space becoming
       available.
    
    This will make the log space allocator code easier to work with in
    the future.
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    fe3e3976
trans.c 8.42 KB