@@ -635,13 +635,27 @@ static int bch2_gc_mark_key(struct btree_trans *trans, enum btree_id btree_id,
635635static int bch2_gc_btree (struct btree_trans * trans , enum btree_id btree , bool initial )
636636{
637637 struct bch_fs * c = trans -> c ;
638- int level = 0 , target_depth = btree_node_type_needs_gc (__btree_node_type (0 , btree )) ? 0 : 1 ;
638+ unsigned target_depth = btree_node_type_needs_gc (__btree_node_type (0 , btree )) ? 0 : 1 ;
639639 int ret = 0 ;
640640
641641 /* We need to make sure every leaf node is readable before going RW */
642642 if (initial )
643643 target_depth = 0 ;
644644
645+ for (unsigned level = target_depth ; level < BTREE_MAX_DEPTH ; level ++ ) {
646+ struct btree * prev = NULL ;
647+ struct btree_iter iter ;
648+ bch2_trans_node_iter_init (trans , & iter , btree , POS_MIN , 0 , level ,
649+ BTREE_ITER_prefetch );
650+
651+ ret = for_each_btree_key_continue (trans , iter , 0 , k , ({
652+ gc_pos_set (c , gc_pos_btree (btree , level , k .k -> p ));
653+ bch2_gc_mark_key (trans , btree , level , & prev , & iter , k , initial );
654+ }));
655+ if (ret )
656+ goto err ;
657+ }
658+
645659 /* root */
646660 do {
647661retry_root :
@@ -663,28 +677,11 @@ static int bch2_gc_btree(struct btree_trans *trans, enum btree_id btree, bool in
663677 gc_pos_set (c , gc_pos_btree (btree , b -> c .level + 1 , SPOS_MAX ));
664678 struct bkey_s_c k = bkey_i_to_s_c (& b -> key );
665679 ret = bch2_gc_mark_key (trans , btree , b -> c .level + 1 , NULL , NULL , k , initial );
666- level = b -> c .level ;
667680err_root :
668681 bch2_trans_iter_exit (trans , & iter );
669682 } while (bch2_err_matches (ret , BCH_ERR_transaction_restart ));
670-
671- if (ret )
672- return ret ;
673-
674- for (; level >= target_depth ; -- level ) {
675- struct btree * prev = NULL ;
676- struct btree_iter iter ;
677- bch2_trans_node_iter_init (trans , & iter , btree , POS_MIN , 0 , level ,
678- BTREE_ITER_prefetch );
679-
680- ret = for_each_btree_key_continue (trans , iter , 0 , k , ({
681- gc_pos_set (c , gc_pos_btree (btree , level , k .k -> p ));
682- bch2_gc_mark_key (trans , btree , level , & prev , & iter , k , initial );
683- }));
684- if (ret )
685- break ;
686- }
687-
683+ err :
684+ bch_err_fn (c , ret );
688685 return ret ;
689686}
690687
0 commit comments