Skip to content

Commit dbe4674

Browse files
author
Kent Overstreet
committed
bcachefs: Topology error after insert is now an ERO
A user hit this, and this will naturally be easier to debug if we don't panic. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent 9a4a858 commit dbe4674

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

fs/bcachefs/btree_update_interior.c

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,7 +1389,7 @@ static void bch2_insert_fixup_btree_ptr(struct btree_update *as,
13891389
printbuf_exit(&buf);
13901390
}
13911391

1392-
static void
1392+
static int
13931393
bch2_btree_insert_keys_interior(struct btree_update *as,
13941394
struct btree_trans *trans,
13951395
struct btree_path *path,
@@ -1411,7 +1411,8 @@ bch2_btree_insert_keys_interior(struct btree_update *as,
14111411
insert = bkey_next(insert))
14121412
bch2_insert_fixup_btree_ptr(as, trans, path, b, &node_iter, insert);
14131413

1414-
if (bch2_btree_node_check_topology(trans, b)) {
1414+
int ret = bch2_btree_node_check_topology(trans, b);
1415+
if (ret) {
14151416
struct printbuf buf = PRINTBUF;
14161417

14171418
for (struct bkey_i *k = keys->keys;
@@ -1421,11 +1422,15 @@ bch2_btree_insert_keys_interior(struct btree_update *as,
14211422
prt_newline(&buf);
14221423
}
14231424

1424-
panic("%s(): check_topology error: inserted keys\n%s", __func__, buf.buf);
1425+
bch2_fs_fatal_error(as->c, "%ps -> %s(): check_topology error %s: inserted keys\n%s",
1426+
(void *) _RET_IP_, __func__, bch2_err_str(ret), buf.buf);
1427+
dump_stack();
1428+
return ret;
14251429
}
14261430

14271431
memmove_u64s_down(keys->keys, insert, keys->top_p - insert->_data);
14281432
keys->top_p -= insert->_data - keys->keys_p;
1433+
return 0;
14291434
}
14301435

14311436
static bool key_deleted_in_insert(struct keylist *insert_keys, struct bpos pos)
@@ -1559,11 +1564,11 @@ static void __btree_split_node(struct btree_update *as,
15591564
* nodes that were coalesced, and thus in the middle of a child node post
15601565
* coalescing:
15611566
*/
1562-
static void btree_split_insert_keys(struct btree_update *as,
1563-
struct btree_trans *trans,
1564-
btree_path_idx_t path_idx,
1565-
struct btree *b,
1566-
struct keylist *keys)
1567+
static int btree_split_insert_keys(struct btree_update *as,
1568+
struct btree_trans *trans,
1569+
btree_path_idx_t path_idx,
1570+
struct btree *b,
1571+
struct keylist *keys)
15671572
{
15681573
struct btree_path *path = trans->paths + path_idx;
15691574

@@ -1573,8 +1578,12 @@ static void btree_split_insert_keys(struct btree_update *as,
15731578

15741579
bch2_btree_node_iter_init(&node_iter, b, &bch2_keylist_front(keys)->k.p);
15751580

1576-
bch2_btree_insert_keys_interior(as, trans, path, b, node_iter, keys);
1581+
int ret = bch2_btree_insert_keys_interior(as, trans, path, b, node_iter, keys);
1582+
if (ret)
1583+
return ret;
15771584
}
1585+
1586+
return 0;
15781587
}
15791588

15801589
static int btree_split(struct btree_update *as, struct btree_trans *trans,
@@ -1607,8 +1616,10 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
16071616
__btree_split_node(as, trans, b, n, keys);
16081617

16091618
if (keys) {
1610-
btree_split_insert_keys(as, trans, path, n1, keys);
1611-
btree_split_insert_keys(as, trans, path, n2, keys);
1619+
ret = btree_split_insert_keys(as, trans, path, n1, keys) ?:
1620+
btree_split_insert_keys(as, trans, path, n2, keys);
1621+
if (ret)
1622+
goto err;
16121623
BUG_ON(!bch2_keylist_empty(keys));
16131624
}
16141625

@@ -1654,15 +1665,19 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
16541665
n3->sib_u64s[0] = U16_MAX;
16551666
n3->sib_u64s[1] = U16_MAX;
16561667

1657-
btree_split_insert_keys(as, trans, path, n3, &as->parent_keys);
1668+
ret = btree_split_insert_keys(as, trans, path, n3, &as->parent_keys);
1669+
if (ret)
1670+
goto err;
16581671
}
16591672
} else {
16601673
trace_and_count(c, btree_node_compact, trans, b);
16611674

16621675
n1 = bch2_btree_node_alloc_replacement(as, trans, b);
16631676

16641677
if (keys) {
1665-
btree_split_insert_keys(as, trans, path, n1, keys);
1678+
ret = btree_split_insert_keys(as, trans, path, n1, keys);
1679+
if (ret)
1680+
goto err;
16661681
BUG_ON(!bch2_keylist_empty(keys));
16671682
}
16681683

@@ -1809,15 +1824,15 @@ static int bch2_btree_insert_node(struct btree_update *as, struct btree_trans *t
18091824
goto split;
18101825
}
18111826

1812-
ret = bch2_btree_node_check_topology(trans, b);
1827+
1828+
ret = bch2_btree_node_check_topology(trans, b) ?:
1829+
bch2_btree_insert_keys_interior(as, trans, path, b,
1830+
path->l[b->c.level].iter, keys);
18131831
if (ret) {
18141832
bch2_btree_node_unlock_write(trans, path, b);
18151833
return ret;
18161834
}
18171835

1818-
bch2_btree_insert_keys_interior(as, trans, path, b,
1819-
path->l[b->c.level].iter, keys);
1820-
18211836
trans_for_each_path_with_node(trans, b, linked, i)
18221837
bch2_btree_node_iter_peek(&linked->l[b->c.level].iter, b);
18231838

0 commit comments

Comments
 (0)