Skip to content

Commit 6447544

Browse files
author
Kent Overstreet
committed
bcachefs: Improve error printing in btree_node_check_topology()
We had a bug report where the errors from btree_node_check_topology() don't seem to be getting printed; log_fsck_err() does some fancy ratelimiting-type stuff that we don't want here. Instead, just use bch2_count_fsck_err(); this is simpler, and modelled after how we're currently handling bucket ref update errors in buckets.c. Signed-off-by: Kent Overstreet <[email protected]>
1 parent f402d97 commit 6447544

File tree

1 file changed

+35
-36
lines changed

1 file changed

+35
-36
lines changed

fs/bcachefs/btree_update_interior.c

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
5757
struct bkey_buf prev;
5858
int ret = 0;
5959

60-
printbuf_indent_add_nextline(&buf, 2);
61-
6260
BUG_ON(b->key.k.type == KEY_TYPE_btree_ptr_v2 &&
6361
!bpos_eq(bkey_i_to_btree_ptr_v2(&b->key)->v.min_key,
6462
b->data->min_key));
@@ -69,20 +67,23 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
6967

7068
if (b == btree_node_root(c, b)) {
7169
if (!bpos_eq(b->data->min_key, POS_MIN)) {
72-
ret = __bch2_topology_error(c, &buf);
73-
70+
bch2_log_msg_start(c, &buf);
71+
prt_printf(&buf, "btree root with incorrect min_key: ");
7472
bch2_bpos_to_text(&buf, b->data->min_key);
75-
log_fsck_err(trans, btree_root_bad_min_key,
76-
"btree root with incorrect min_key: %s", buf.buf);
77-
goto out;
73+
prt_newline(&buf);
74+
75+
bch2_count_fsck_err(c, btree_root_bad_min_key, &buf);
76+
goto err;
7877
}
7978

8079
if (!bpos_eq(b->data->max_key, SPOS_MAX)) {
81-
ret = __bch2_topology_error(c, &buf);
80+
bch2_log_msg_start(c, &buf);
81+
prt_printf(&buf, "btree root with incorrect max_key: ");
8282
bch2_bpos_to_text(&buf, b->data->max_key);
83-
log_fsck_err(trans, btree_root_bad_max_key,
84-
"btree root with incorrect max_key: %s", buf.buf);
85-
goto out;
83+
prt_newline(&buf);
84+
85+
bch2_count_fsck_err(c, btree_root_bad_max_key, &buf);
86+
goto err;
8687
}
8788
}
8889

@@ -100,52 +101,50 @@ int bch2_btree_node_check_topology(struct btree_trans *trans, struct btree *b)
100101
: bpos_successor(prev.k->k.p);
101102

102103
if (!bpos_eq(expected_min, bp.v->min_key)) {
103-
ret = __bch2_topology_error(c, &buf);
104-
105-
prt_str(&buf, "end of prev node doesn't match start of next node\nin ");
106-
bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
107-
prt_str(&buf, " node ");
108-
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
104+
prt_str(&buf, "end of prev node doesn't match start of next node");
109105
prt_str(&buf, "\nprev ");
110106
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(prev.k));
111107
prt_str(&buf, "\nnext ");
112108
bch2_bkey_val_to_text(&buf, c, k);
109+
prt_newline(&buf);
113110

114-
log_fsck_err(trans, btree_node_topology_bad_min_key, "%s", buf.buf);
115-
goto out;
111+
bch2_count_fsck_err(c, btree_node_topology_bad_min_key, &buf);
112+
goto err;
116113
}
117114

118115
bch2_bkey_buf_reassemble(&prev, c, k);
119116
bch2_btree_and_journal_iter_advance(&iter);
120117
}
121118

122119
if (bkey_deleted(&prev.k->k)) {
123-
ret = __bch2_topology_error(c, &buf);
124-
125-
prt_str(&buf, "empty interior node\nin ");
126-
bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
127-
prt_str(&buf, " node ");
128-
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
129-
130-
log_fsck_err(trans, btree_node_topology_empty_interior_node, "%s", buf.buf);
131-
} else if (!bpos_eq(prev.k->k.p, b->key.k.p)) {
132-
ret = __bch2_topology_error(c, &buf);
120+
prt_printf(&buf, "empty interior node\n");
121+
bch2_count_fsck_err(c, btree_node_topology_empty_interior_node, &buf);
122+
goto err;
123+
}
133124

134-
prt_str(&buf, "last child node doesn't end at end of parent node\nin ");
135-
bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
136-
prt_str(&buf, " node ");
137-
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
138-
prt_str(&buf, "\nlast key ");
125+
if (!bpos_eq(prev.k->k.p, b->key.k.p)) {
126+
prt_str(&buf, "last child node doesn't end at end of parent node\nchild: ");
139127
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(prev.k));
128+
prt_newline(&buf);
140129

141-
log_fsck_err(trans, btree_node_topology_bad_max_key, "%s", buf.buf);
130+
bch2_count_fsck_err(c, btree_node_topology_bad_max_key, &buf);
131+
goto err;
142132
}
143133
out:
144-
fsck_err:
145134
bch2_btree_and_journal_iter_exit(&iter);
146135
bch2_bkey_buf_exit(&prev, c);
147136
printbuf_exit(&buf);
148137
return ret;
138+
err:
139+
bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
140+
prt_char(&buf, ' ');
141+
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
142+
prt_newline(&buf);
143+
144+
ret = __bch2_topology_error(c, &buf);
145+
bch2_print_str(c, KERN_ERR, buf.buf);
146+
BUG_ON(!ret);
147+
goto out;
149148
}
150149

151150
/* Calculate ideal packed bkey format for new btree nodes: */

0 commit comments

Comments
 (0)