From c9932d40594da6065125b76b55bd9cea1fabc812 Mon Sep 17 00:00:00 2001 Message-Id: From: Qu Wenruo Date: Mon, 26 Dec 2022 16:44:08 +0800 Subject: [PATCH] btrfs: add extra debug for level mismatch Currently I assume there is some race or uninitialized value for check::level. The extra output are for two locations: - validate_extent_buffer() Output the error message for read error and the members of check. - read_extent_buffer_pages() This will dump the stack for us to catch the offender. Signed-off-by: Qu Wenruo --- fs/btrfs/disk-io.c | 15 +++++++++++++-- fs/btrfs/extent_io.c | 12 +++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index f8b5955f003f..62e6ad909b19 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -530,6 +530,10 @@ static int validate_extent_buffer(struct extent_buffer *eb, } if (found_level != check->level) { + btrfs_err(eb->fs_info, +"level verify failed on logical %llu mirror %u wanted %u found %u", + eb->start, eb->read_mirror, check->level, + found_level); ret = -EIO; goto out; } @@ -581,13 +585,20 @@ static int validate_extent_buffer(struct extent_buffer *eb, if (found_level > 0 && btrfs_check_node(eb)) ret = -EIO; +out: if (!ret) set_extent_buffer_uptodate(eb); - else + else { btrfs_err(fs_info, "read time tree block corruption detected on logical %llu mirror %u", eb->start, eb->read_mirror); -out: + btrfs_err(eb->fs_info, +"check owner_root=%llu transid=%llu first_key=(%llu %u %llu) has_first_key=%d level=%u", + check->owner_root, + check->transid, check->first_key.objectid, + check->first_key.type, check->first_key.offset, + check->has_first_key, check->level); + } return ret; } diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 83dd3aa59663..5f267345ef94 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -5005,8 +5005,18 @@ int read_extent_buffer_pages(struct extent_buffer *eb, int wait, int mirror_num, for (i = 0; i < num_pages; i++) { page = eb->pages[i]; wait_on_page_locked(page); - if (!PageUptodate(page)) + if (!PageUptodate(page)) { ret = -EIO; + btrfs_err(eb->fs_info, +"read failed, check owner_root=%llu transid=%llu has_first_key=%d first_key=(%llu %u %llu) level=%u", + check->owner_root, check->transid, + check->has_first_key, + check->first_key.objectid, + check->first_key.type, + check->first_key.offset, + check->level); + dump_stack(); + } } return ret; -- 2.39.0