• Q
    btrfs: scrub: properly report super block errors in system log · e69bf81c
    Qu Wenruo 提交于
    [PROBLEM]
    
    Unlike data/metadata corruption, if scrub detected some error in the
    super block, the only error message is from the updated device status:
    
      BTRFS info (device dm-1): scrub: started on devid 2
      BTRFS error (device dm-1): bdev /dev/mapper/test-scratch2 errs: wr 0, rd 0, flush 0, corrupt 1, gen 0
      BTRFS info (device dm-1): scrub: finished on devid 2 with status: 0
    
    This is not helpful at all.
    
    [CAUSE]
    Unlike data/metadata error reporting, there is no visible report in
    kernel dmesg to report supper block errors.
    
    In fact, return value of scrub_checksum_super() is intentionally
    skipped, thus scrub_handle_errored_block() will never be called for
    super blocks.
    
    [FIX]
    Make super block errors to output an error message, now the full
    dmesg would looks like this:
    
      BTRFS info (device dm-1): scrub: started on devid 2
      BTRFS warning (device dm-1): super block error on device /dev/mapper/test-scratch2, physical 67108864
      BTRFS error (device dm-1): bdev /dev/mapper/test-scratch2 errs: wr 0, rd 0, flush 0, corrupt 1, gen 0
      BTRFS info (device dm-1): scrub: finished on devid 2 with status: 0
      BTRFS info (device dm-1): scrub: started on devid 2
    
    This fix involves:
    
    - Move the super_errors reporting to scrub_handle_errored_block()
      This allows the device status message to show after the super block
      error message.
      But now we no longer distinguish super block corruption and generation
      mismatch, now all counted as corruption.
    
    - Properly check the return value from scrub_checksum_super()
    - Add extra super block error reporting for scrub_print_warning().
    Signed-off-by: NQu Wenruo <wqu@suse.com>
    Reviewed-by: NDavid Sterba <dsterba@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    e69bf81c
scrub.c 119.1 KB