• B
    xfs: checksum log record ext headers based on record size · a3f20014
    Brian Foster 提交于
    The first 4 bytes of every basic block in the physical log is stamped
    with the current lsn. To support this mechanism, the log record header
    (first block of each new log record) contains space for the original
    first byte of each log record block before it is replaced with the lsn.
    The log record header has space for 32k worth of blocks. The version 2
    log adds new extended record headers for each additional 32k worth of
    blocks beyond what is supported by the record header.
    
    The log record checksum incorporates the log record header, the extended
    headers and the record payload. xlog_cksum() checksums the extended
    headers based on log->l_iclog_heads, which specifies the number of
    extended headers in a log record based on the log buffer size mount
    option. The log buffer size is variable, however, and thus means the
    checksum can be calculated differently based on how a filesystem is
    mounted. This is problematic if a filesystem crashes and recovery occurs
    on a subsequent mount using a different log buffer size. For example,
    crash an active filesystem that is mounted with the default (32k)
    logbsize, attempt remount/recovery using '-o logbsize=64k' and the mount
    fails on or warns about log checksum failures.
    
    To avoid this problem, update xlog_cksum() to calculate the checksum
    based on the size of the log buffer according to the log record. The
    size is already included in the h_size field of the log record header
    and thus is available at log recovery time. Extended log record headers
    are also only written when the log record is large enough to require
    them. This makes checksum calculation of log records consistent with the
    extended record header mechanism as well as how on-disk records are
    checksummed with various log buffer size mount options.
    Signed-off-by: NBrian Foster <bfoster@redhat.com>
    Reviewed-by: NDave Chinner <dchinner@redhat.com>
    Signed-off-by: NDave Chinner <david@fromorbit.com>
    a3f20014
xfs_log.c 109.0 KB