@@ -54,6 +54,8 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
5454 struct bkey_buf prev ;
5555 int ret = 0 ;
5656
57+ printbuf_indent_add_nextline (& buf , 2 );
58+
5759 BUG_ON (b -> key .k .type == KEY_TYPE_btree_ptr_v2 &&
5860 !bpos_eq (bkey_i_to_btree_ptr_v2 (& b -> key )-> v .min_key ,
5961 b -> data -> min_key ));
@@ -64,19 +66,20 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
6466
6567 if (b == btree_node_root (c , b )) {
6668 if (!bpos_eq (b -> data -> min_key , POS_MIN )) {
67- printbuf_reset (& buf );
69+ ret = __bch2_topology_error (c , & buf );
70+
6871 bch2_bpos_to_text (& buf , b -> data -> min_key );
6972 log_fsck_err (trans , btree_root_bad_min_key ,
7073 "btree root with incorrect min_key: %s" , buf .buf );
71- goto topology_repair ;
74+ goto out ;
7275 }
7376
7477 if (!bpos_eq (b -> data -> max_key , SPOS_MAX )) {
75- printbuf_reset ( & buf );
78+ ret = __bch2_topology_error ( c , & buf );
7679 bch2_bpos_to_text (& buf , b -> data -> max_key );
7780 log_fsck_err (trans , btree_root_bad_max_key ,
7881 "btree root with incorrect max_key: %s" , buf .buf );
79- goto topology_repair ;
82+ goto out ;
8083 }
8184 }
8285
@@ -94,9 +97,8 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
9497 : bpos_successor (prev .k -> k .p );
9598
9699 if (!bpos_eq (expected_min , bp .v -> min_key )) {
97- bch2_topology_error ( c );
100+ ret = __bch2_topology_error ( c , & buf );
98101
99- printbuf_reset (& buf );
100102 prt_str (& buf , "end of prev node doesn't match start of next node\nin " );
101103 bch2_btree_id_level_to_text (& buf , b -> c .btree_id , b -> c .level );
102104 prt_str (& buf , " node " );
@@ -107,28 +109,25 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
107109 bch2_bkey_val_to_text (& buf , c , k );
108110
109111 log_fsck_err (trans , btree_node_topology_bad_min_key , "%s" , buf .buf );
110- goto topology_repair ;
112+ goto out ;
111113 }
112114
113115 bch2_bkey_buf_reassemble (& prev , c , k );
114116 bch2_btree_and_journal_iter_advance (& iter );
115117 }
116118
117119 if (bkey_deleted (& prev .k -> k )) {
118- bch2_topology_error ( c );
120+ ret = __bch2_topology_error ( c , & buf );
119121
120- printbuf_reset (& buf );
121122 prt_str (& buf , "empty interior node\nin " );
122123 bch2_btree_id_level_to_text (& buf , b -> c .btree_id , b -> c .level );
123124 prt_str (& buf , " node " );
124125 bch2_bkey_val_to_text (& buf , c , bkey_i_to_s_c (& b -> key ));
125126
126127 log_fsck_err (trans , btree_node_topology_empty_interior_node , "%s" , buf .buf );
127- goto topology_repair ;
128128 } else if (!bpos_eq (prev .k -> k .p , b -> key .k .p )) {
129- bch2_topology_error ( c );
129+ ret = __bch2_topology_error ( c , & buf );
130130
131- printbuf_reset (& buf );
132131 prt_str (& buf , "last child node doesn't end at end of parent node\nin " );
133132 bch2_btree_id_level_to_text (& buf , b -> c .btree_id , b -> c .level );
134133 prt_str (& buf , " node " );
@@ -137,17 +136,13 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
137136 bch2_bkey_val_to_text (& buf , c , bkey_i_to_s_c (prev .k ));
138137
139138 log_fsck_err (trans , btree_node_topology_bad_max_key , "%s" , buf .buf );
140- goto topology_repair ;
141139 }
142140out :
143141fsck_err :
144142 bch2_btree_and_journal_iter_exit (& iter );
145143 bch2_bkey_buf_exit (& prev , c );
146144 printbuf_exit (& buf );
147145 return ret ;
148- topology_repair :
149- ret = bch2_topology_error (c );
150- goto out ;
151146}
152147
153148/* Calculate ideal packed bkey format for new btree nodes: */
@@ -2007,18 +2002,22 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
20072002 }
20082003
20092004 if (!bpos_eq (bpos_successor (prev -> data -> max_key ), next -> data -> min_key )) {
2010- struct printbuf buf1 = PRINTBUF , buf2 = PRINTBUF ;
2011-
2012- bch2_bpos_to_text (& buf1 , prev -> data -> max_key );
2013- bch2_bpos_to_text (& buf2 , next -> data -> min_key );
2014- bch_err (c ,
2015- "%s(): btree topology error:\n"
2016- " prev ends at %s\n"
2017- " next starts at %s" ,
2018- __func__ , buf1 .buf , buf2 .buf );
2019- printbuf_exit (& buf1 );
2020- printbuf_exit (& buf2 );
2021- ret = bch2_topology_error (c );
2005+ struct printbuf buf = PRINTBUF ;
2006+
2007+ printbuf_indent_add_nextline (& buf , 2 );
2008+ prt_printf (& buf , "%s(): " , __func__ );
2009+ ret = __bch2_topology_error (c , & buf );
2010+ prt_newline (& buf );
2011+
2012+ prt_printf (& buf , "prev ends at " );
2013+ bch2_bpos_to_text (& buf , prev -> data -> max_key );
2014+ prt_newline (& buf );
2015+
2016+ prt_printf (& buf , "next starts at " );
2017+ bch2_bpos_to_text (& buf , next -> data -> min_key );
2018+
2019+ bch_err (c , "%s" , buf .buf );
2020+ printbuf_exit (& buf );
20222021 goto err ;
20232022 }
20242023
0 commit comments