• Darrick J. Wong's avatar
    xfs: fix buffer corruption reporting when xfs_dir3_free_header_check fails · ce99494c
    Darrick J. Wong authored
    xfs_verifier_error is supposed to be called on a corrupt metadata buffer
    from within a buffer verifier function, whereas xfs_buf_mark_corrupt
    is the function to be called when a piece of code has read a buffer and
    catches something that a read verifier cannot.  The first function sets
    b_error anticipating that the low level buffer handling code will see
    the nonzero b_error and clear XBF_DONE on the buffer, whereas the second
    function does not.
    
    Since xfs_dir3_free_header_check examines fields in the dir free block
    header that require more context than can be provided to read verifiers,
    we must call xfs_buf_mark_corrupt when it finds a problem.
    
    Switching the calls has a secondary effect that we no longer corrupt the
    buffer state by setting b_error and leaving XBF_DONE set.  When /that/
    happens, we'll trip over various state assertions (most commonly the
    b_error check in xfs_buf_reverify) on a subsequent attempt to read the
    buffer.
    
    Fixes: bc1a09b8 ("xfs: refactor verifier callers to print address of failing check")
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    ce99494c
xfs_dir2_node.c 63.3 KB