@@ -1389,7 +1389,7 @@ static void bch2_insert_fixup_btree_ptr(struct btree_update *as,
1389
1389
printbuf_exit (& buf );
1390
1390
}
1391
1391
1392
- static void
1392
+ static int
1393
1393
bch2_btree_insert_keys_interior (struct btree_update * as ,
1394
1394
struct btree_trans * trans ,
1395
1395
struct btree_path * path ,
@@ -1411,7 +1411,8 @@ bch2_btree_insert_keys_interior(struct btree_update *as,
1411
1411
insert = bkey_next (insert ))
1412
1412
bch2_insert_fixup_btree_ptr (as , trans , path , b , & node_iter , insert );
1413
1413
1414
- if (bch2_btree_node_check_topology (trans , b )) {
1414
+ int ret = bch2_btree_node_check_topology (trans , b );
1415
+ if (ret ) {
1415
1416
struct printbuf buf = PRINTBUF ;
1416
1417
1417
1418
for (struct bkey_i * k = keys -> keys ;
@@ -1421,11 +1422,15 @@ bch2_btree_insert_keys_interior(struct btree_update *as,
1421
1422
prt_newline (& buf );
1422
1423
}
1423
1424
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 ;
1425
1429
}
1426
1430
1427
1431
memmove_u64s_down (keys -> keys , insert , keys -> top_p - insert -> _data );
1428
1432
keys -> top_p -= insert -> _data - keys -> keys_p ;
1433
+ return 0 ;
1429
1434
}
1430
1435
1431
1436
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,
1559
1564
* nodes that were coalesced, and thus in the middle of a child node post
1560
1565
* coalescing:
1561
1566
*/
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 )
1567
1572
{
1568
1573
struct btree_path * path = trans -> paths + path_idx ;
1569
1574
@@ -1573,8 +1578,12 @@ static void btree_split_insert_keys(struct btree_update *as,
1573
1578
1574
1579
bch2_btree_node_iter_init (& node_iter , b , & bch2_keylist_front (keys )-> k .p );
1575
1580
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 ;
1577
1584
}
1585
+
1586
+ return 0 ;
1578
1587
}
1579
1588
1580
1589
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,
1607
1616
__btree_split_node (as , trans , b , n , keys );
1608
1617
1609
1618
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 ;
1612
1623
BUG_ON (!bch2_keylist_empty (keys ));
1613
1624
}
1614
1625
@@ -1654,15 +1665,19 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
1654
1665
n3 -> sib_u64s [0 ] = U16_MAX ;
1655
1666
n3 -> sib_u64s [1 ] = U16_MAX ;
1656
1667
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 ;
1658
1671
}
1659
1672
} else {
1660
1673
trace_and_count (c , btree_node_compact , trans , b );
1661
1674
1662
1675
n1 = bch2_btree_node_alloc_replacement (as , trans , b );
1663
1676
1664
1677
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 ;
1666
1681
BUG_ON (!bch2_keylist_empty (keys ));
1667
1682
}
1668
1683
@@ -1809,15 +1824,15 @@ static int bch2_btree_insert_node(struct btree_update *as, struct btree_trans *t
1809
1824
goto split ;
1810
1825
}
1811
1826
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 );
1813
1831
if (ret ) {
1814
1832
bch2_btree_node_unlock_write (trans , path , b );
1815
1833
return ret ;
1816
1834
}
1817
1835
1818
- bch2_btree_insert_keys_interior (as , trans , path , b ,
1819
- path -> l [b -> c .level ].iter , keys );
1820
-
1821
1836
trans_for_each_path_with_node (trans , b , linked , i )
1822
1837
bch2_btree_node_iter_peek (& linked -> l [b -> c .level ].iter , b );
1823
1838
0 commit comments