btrfs: output mirror number for bad metadata
authorQu Wenruo <wqu@suse.com>
Sun, 19 Jun 2022 13:47:56 +0000 (21:47 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:38 +0000 (17:45 +0200)
When handling a real world transid mismatch image, it's hard to know
which copy is corrupted, as the error messages just look like this:

  BTRFS warning (device dm-3): checksum verify failed on 30408704 wanted 0xcdcdcdcd found 0x3c0adc8e level 0
  BTRFS warning (device dm-3): checksum verify failed on 30408704 wanted 0xcdcdcdcd found 0x3c0adc8e level 0
  BTRFS warning (device dm-3): checksum verify failed on 30408704 wanted 0xcdcdcdcd found 0x3c0adc8e level 0
  BTRFS warning (device dm-3): checksum verify failed on 30408704 wanted 0xcdcdcdcd found 0x3c0adc8e level 0

We don't even know if the retry is caused by btrfs or the VFS retry.

To make things a little easier to read, add mirror number for all
related tree block read errors.

So the above messages would look like this:

  BTRFS warning (device dm-3): checksum verify failed on logical 30408704 mirror 1 wanted 0xcdcdcdcd found 0x3c0adc8e level 0
  BTRFS warning (device dm-3): checksum verify failed on logical 30408704 mirror 2 wanted 0xcdcdcdcd found 0x3c0adc8e level 0
  BTRFS warning (device dm-3): checksum verify failed on logical 30408704 mirror 1 wanted 0xcdcdcdcd found 0x3c0adc8e level 0
  BTRFS warning (device dm-3): checksum verify failed on logical 30408704 mirror 2 wanted 0xcdcdcdcd found 0x3c0adc8e level 0

Signed-off-by: Qu Wenruo <wqu@suse.com>
[ update messages, add "logical" ]
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c

index 32b88a2277340cf96220741867d5da254677b8c4..4f514919b03b74df2a7ae58e884eca718d912453 100644 (file)
@@ -221,8 +221,8 @@ static int verify_parent_transid(struct extent_io_tree *io_tree,
                goto out;
        }
        btrfs_err_rl(eb->fs_info,
-               "parent transid verify failed on %llu wanted %llu found %llu",
-                       eb->start,
+"parent transid verify failed on logical %llu mirror %u wanted %llu found %llu",
+                       eb->start, eb->read_mirror,
                        parent_transid, btrfs_header_generation(eb));
        ret = 1;
        clear_extent_buffer_uptodate(eb);
@@ -552,21 +552,23 @@ static int validate_extent_buffer(struct extent_buffer *eb)
 
        found_start = btrfs_header_bytenr(eb);
        if (found_start != eb->start) {
-               btrfs_err_rl(fs_info, "bad tree block start, want %llu have %llu",
-                            eb->start, found_start);
+               btrfs_err_rl(fs_info,
+                       "bad tree block start, mirror %u want %llu have %llu",
+                            eb->read_mirror, eb->start, found_start);
                ret = -EIO;
                goto out;
        }
        if (check_tree_block_fsid(eb)) {
-               btrfs_err_rl(fs_info, "bad fsid on block %llu",
-                            eb->start);
+               btrfs_err_rl(fs_info, "bad fsid on logical %llu mirror %u",
+                            eb->start, eb->read_mirror);
                ret = -EIO;
                goto out;
        }
        found_level = btrfs_header_level(eb);
        if (found_level >= BTRFS_MAX_LEVEL) {
-               btrfs_err(fs_info, "bad tree block level %d on %llu",
-                         (int)btrfs_header_level(eb), eb->start);
+               btrfs_err(fs_info,
+                       "bad tree block level, mirror %u level %d on logical %llu",
+                       eb->read_mirror, btrfs_header_level(eb), eb->start);
                ret = -EIO;
                goto out;
        }
@@ -577,8 +579,8 @@ static int validate_extent_buffer(struct extent_buffer *eb)
 
        if (memcmp(result, header_csum, csum_size) != 0) {
                btrfs_warn_rl(fs_info,
-       "checksum verify failed on %llu wanted " CSUM_FMT " found " CSUM_FMT " level %d",
-                             eb->start,
+"checksum verify failed on logical %llu mirror %u wanted " CSUM_FMT " found " CSUM_FMT " level %d",
+                             eb->start, eb->read_mirror,
                              CSUM_FMT_VALUE(csum_size, header_csum),
                              CSUM_FMT_VALUE(csum_size, result),
                              btrfs_header_level(eb));
@@ -603,8 +605,8 @@ static int validate_extent_buffer(struct extent_buffer *eb)
                set_extent_buffer_uptodate(eb);
        else
                btrfs_err(fs_info,
-                         "block=%llu read time tree block corruption detected",
-                         eb->start);
+               "read time tree block corruption detected on logical %llu mirror %u",
+                         eb->start, eb->read_mirror);
 out:
        return ret;
 }