@@ -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
13931393bch2_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
14311436static 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
15801589static 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