Commit 8f0ed7d4 authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: output mirror number for bad metadata

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: default avatarQu Wenruo <wqu@suse.com>
[ update messages, add "logical" ]
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent aaafa1eb
...@@ -221,8 +221,8 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, ...@@ -221,8 +221,8 @@ static int verify_parent_transid(struct extent_io_tree *io_tree,
goto out; goto out;
} }
btrfs_err_rl(eb->fs_info, btrfs_err_rl(eb->fs_info,
"parent transid verify failed on %llu wanted %llu found %llu", "parent transid verify failed on logical %llu mirror %u wanted %llu found %llu",
eb->start, eb->start, eb->read_mirror,
parent_transid, btrfs_header_generation(eb)); parent_transid, btrfs_header_generation(eb));
ret = 1; ret = 1;
clear_extent_buffer_uptodate(eb); clear_extent_buffer_uptodate(eb);
...@@ -552,21 +552,23 @@ static int validate_extent_buffer(struct extent_buffer *eb) ...@@ -552,21 +552,23 @@ static int validate_extent_buffer(struct extent_buffer *eb)
found_start = btrfs_header_bytenr(eb); found_start = btrfs_header_bytenr(eb);
if (found_start != eb->start) { if (found_start != eb->start) {
btrfs_err_rl(fs_info, "bad tree block start, want %llu have %llu", btrfs_err_rl(fs_info,
eb->start, found_start); "bad tree block start, mirror %u want %llu have %llu",
eb->read_mirror, eb->start, found_start);
ret = -EIO; ret = -EIO;
goto out; goto out;
} }
if (check_tree_block_fsid(eb)) { if (check_tree_block_fsid(eb)) {
btrfs_err_rl(fs_info, "bad fsid on block %llu", btrfs_err_rl(fs_info, "bad fsid on logical %llu mirror %u",
eb->start); eb->start, eb->read_mirror);
ret = -EIO; ret = -EIO;
goto out; goto out;
} }
found_level = btrfs_header_level(eb); found_level = btrfs_header_level(eb);
if (found_level >= BTRFS_MAX_LEVEL) { if (found_level >= BTRFS_MAX_LEVEL) {
btrfs_err(fs_info, "bad tree block level %d on %llu", btrfs_err(fs_info,
(int)btrfs_header_level(eb), eb->start); "bad tree block level, mirror %u level %d on logical %llu",
eb->read_mirror, btrfs_header_level(eb), eb->start);
ret = -EIO; ret = -EIO;
goto out; goto out;
} }
...@@ -577,8 +579,8 @@ static int validate_extent_buffer(struct extent_buffer *eb) ...@@ -577,8 +579,8 @@ static int validate_extent_buffer(struct extent_buffer *eb)
if (memcmp(result, header_csum, csum_size) != 0) { if (memcmp(result, header_csum, csum_size) != 0) {
btrfs_warn_rl(fs_info, btrfs_warn_rl(fs_info,
"checksum verify failed on %llu wanted " CSUM_FMT " found " CSUM_FMT " level %d", "checksum verify failed on logical %llu mirror %u wanted " CSUM_FMT " found " CSUM_FMT " level %d",
eb->start, eb->start, eb->read_mirror,
CSUM_FMT_VALUE(csum_size, header_csum), CSUM_FMT_VALUE(csum_size, header_csum),
CSUM_FMT_VALUE(csum_size, result), CSUM_FMT_VALUE(csum_size, result),
btrfs_header_level(eb)); btrfs_header_level(eb));
...@@ -603,8 +605,8 @@ static int validate_extent_buffer(struct extent_buffer *eb) ...@@ -603,8 +605,8 @@ static int validate_extent_buffer(struct extent_buffer *eb)
set_extent_buffer_uptodate(eb); set_extent_buffer_uptodate(eb);
else else
btrfs_err(fs_info, btrfs_err(fs_info,
"block=%llu read time tree block corruption detected", "read time tree block corruption detected on logical %llu mirror %u",
eb->start); eb->start, eb->read_mirror);
out: out:
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment