@@ -2357,6 +2357,12 @@ struct bkey_s_c bch2_btree_iter_peek_max(struct btree_iter *iter, struct bpos en
23572357 bch2_btree_iter_verify_entry_exit (iter );
23582358 EBUG_ON ((iter -> flags & BTREE_ITER_filter_snapshots ) && bkey_eq (end , POS_MAX ));
23592359
2360+ ret = trans_maybe_inject_restart (trans , _RET_IP_ );
2361+ if (unlikely (ret )) {
2362+ k = bkey_s_c_err (ret );
2363+ goto out_no_locked ;
2364+ }
2365+
23602366 if (iter -> update_path ) {
23612367 bch2_path_put_nokeep (trans , iter -> update_path ,
23622368 iter -> flags & BTREE_ITER_intent );
@@ -2622,6 +2628,12 @@ struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_iter *iter, struct bp
26222628 bch2_btree_iter_verify_entry_exit (iter );
26232629 EBUG_ON ((iter -> flags & BTREE_ITER_filter_snapshots ) && bpos_eq (end , POS_MIN ));
26242630
2631+ int ret = trans_maybe_inject_restart (trans , _RET_IP_ );
2632+ if (unlikely (ret )) {
2633+ k = bkey_s_c_err (ret );
2634+ goto out_no_locked ;
2635+ }
2636+
26252637 while (1 ) {
26262638 k = __bch2_btree_iter_peek_prev (iter , search_key );
26272639 if (unlikely (!k .k ))
@@ -2749,6 +2761,12 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
27492761 bch2_btree_iter_verify_entry_exit (iter );
27502762 EBUG_ON (btree_iter_path (trans , iter )-> level && (iter -> flags & BTREE_ITER_with_key_cache ));
27512763
2764+ ret = trans_maybe_inject_restart (trans , _RET_IP_ );
2765+ if (unlikely (ret )) {
2766+ k = bkey_s_c_err (ret );
2767+ goto out_no_locked ;
2768+ }
2769+
27522770 /* extents can't span inode numbers: */
27532771 if ((iter -> flags & BTREE_ITER_is_extents ) &&
27542772 unlikely (iter -> pos .offset == KEY_OFFSET_MAX )) {
@@ -3106,6 +3124,10 @@ void *__bch2_trans_kmalloc(struct btree_trans *trans, size_t size)
31063124
31073125 WARN_ON_ONCE (new_bytes > BTREE_TRANS_MEM_MAX );
31083126
3127+ ret = trans_maybe_inject_restart (trans , _RET_IP_ );
3128+ if (ret )
3129+ return ERR_PTR (ret );
3130+
31093131 struct btree_transaction_stats * s = btree_trans_stats (trans );
31103132 s -> max_mem = max (s -> max_mem , new_bytes );
31113133
@@ -3163,7 +3185,8 @@ void *__bch2_trans_kmalloc(struct btree_trans *trans, size_t size)
31633185
31643186 if (old_bytes ) {
31653187 trace_and_count (c , trans_restart_mem_realloced , trans , _RET_IP_ , new_bytes );
3166- return ERR_PTR (btree_trans_restart (trans , BCH_ERR_transaction_restart_mem_realloced ));
3188+ return ERR_PTR (btree_trans_restart_ip (trans ,
3189+ BCH_ERR_transaction_restart_mem_realloced , _RET_IP_ ));
31673190 }
31683191out_change_top :
31693192 p = trans -> mem + trans -> mem_top ;
@@ -3271,6 +3294,14 @@ u32 bch2_trans_begin(struct btree_trans *trans)
32713294
32723295 trans -> last_begin_ip = _RET_IP_ ;
32733296
3297+ #ifdef CONFIG_BCACHEFS_INJECT_TRANSACTION_RESTARTS
3298+ if (trans -> restarted ) {
3299+ trans -> restart_count_this_trans ++ ;
3300+ } else {
3301+ trans -> restart_count_this_trans = 0 ;
3302+ }
3303+ #endif
3304+
32743305 trans_set_locked (trans , false);
32753306
32763307 if (trans -> restarted ) {
0 commit comments