• D
    xfs: log the AGI/AGF buffers when rolling transactions during an AG repair · 3e59c010
    Darrick J. Wong 提交于
    Currently, the only way to lock an allocation group is to hold the AGI
    and AGF buffers.  If a repair needs to roll the transaction while
    repairing some AG metadata, it maintains that lock by holding the two
    buffers across the transaction roll and joins them afterwards.
    
    However, repair is not like other parts of XFS that employ the bhold -
    roll - bjoin sequence because it's possible that the AGI or AGF buffers
    are not actually dirty before the roll.  This presents two problems --
    First, we need to redirty those buffers to keep them moving along in the
    log to avoid pinning the log tail.  Second, a clean buffer log item can
    detach from the buffer.  If this happens, the buffer type state is
    discarded along with the bli and must be reattached before the next time
    the buffer is logged.   If it is not, the logging code will complain and
    log recovery will not work properly.
    
    An earlier version of this patch tried to fix the second problem by
    re-setting the buffer type in the bli after joining the buffer to the
    new transaction, but that looked weird and didn't solve the first
    problem.  Instead, solve both problems by logging the buffer before
    rolling the transaction.
    Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    3e59c010
repair.c 28.2 KB