Skip to contentSkip to conversation

btrfs-progs: print-tree: Enhance warning on tree block level mismatch and error handling

PATCH Applied Qu Wenruo 2 participants 2 messages Mar 15, 2018 – Mar 19, 2018 Btrfs file system

lore
Share & tools
lore

Qu Wenruo

author
#0 lore raw

PATCH 1/1 btrfs-progs: print-tree: Enhance warning on tree block level mismatch and error handling

This patch enhance the tree block level mismatch by the following methods:

1) Merge same warning branches into one
We had two branches showing the same message, and their condition is also the same. Merge them

2) Only skip bad slot
The old code skipped all the remaining slots, here we just skip one slot to output as many correct tree blocks as possible.

3) Enhance warning message
Ouput the parent bytenr and expected and wrong level, so we don't need refer to the stdout to get which tree block is corrupted.

---
 print-tree.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)
print-tree.c +8 -12
index 45350fea0963..c1e7af65ce4b 100644
@@ -1389,19 +1389,16 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol
 				(unsigned long long)btrfs_header_owner(eb));
 			continue;
 		}
-		if (btrfs_is_leaf(next) && btrfs_header_level(eb) != 1) {
-			warning(
-	"eb corrupted: item %d eb level %d next level %d, skipping the rest",
-				i, btrfs_header_level(next),
-				btrfs_header_level(eb));
-			goto out;
-		}
 		if (btrfs_header_level(next) != btrfs_header_level(eb) - 1) {
 			warning(
-	"eb corrupted: item %d eb level %d next level %d, skipping the rest",
-				i, btrfs_header_level(next),
-				btrfs_header_level(eb));
-			goto out;
+	"eb corrupted: parent bytenr %llu slot %d level %d child bytenr %llu level has %d expect %d, skipping the slot",
+				btrfs_header_bytenr(eb), i,
+				btrfs_header_level(eb),
+				btrfs_header_bytenr(next),
+				btrfs_header_level(next),
+				btrfs_header_level(eb) - 1);
+			free_extent_buffer(next);
+			continue;
 		}
 		btrfs_print_tree(root, next, 1);
 		free_extent_buffer(next);
@@ -1409,6 +1406,5 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol
 
 	return;
 
-out:
 	free_extent_buffer(next);
 }
Signature · 1 line
2.16.2
Applied
#1 lore raw
Quoted 11 lines · Qu Wenruo

This patch enhance the tree block level mismatch by the following methods:

1) Merge same warning branches into one
We had two branches showing the same message, and their condition is also the same. Merge them

2) Only skip bad slot
The old code skipped all the remaining slots, here we just skip one slot to output as many correct tree blocks as possible.

Quoted 5 lines

3) Enhance warning message
Ouput the parent bytenr and expected and wrong level, so we don't need refer to the stdout to get which tree block is corrupted.

Applied, thanks.