@@ -479,9 +479,8 @@ int bch2_check_fix_ptrs(struct btree_trans *trans,
479
479
480
480
percpu_down_read (& c -> mark_lock );
481
481
482
- rcu_read_lock ();
483
482
bkey_for_each_ptr_decode (k .k , ptrs_c , p , entry_c ) {
484
- struct bch_dev * ca = bch2_dev_rcu (c , p .ptr .dev );
483
+ struct bch_dev * ca = bch2_dev_tryget (c , p .ptr .dev );
485
484
if (!ca ) {
486
485
if (fsck_err (c , ptr_to_invalid_device ,
487
486
"pointer to missing device %u\n"
@@ -558,7 +557,7 @@ int bch2_check_fix_ptrs(struct btree_trans *trans,
558
557
do_update = true;
559
558
560
559
if (data_type != BCH_DATA_btree && p .ptr .gen != g -> gen )
561
- continue ;
560
+ goto next ;
562
561
563
562
if (fsck_err_on (bucket_data_type_mismatch (g -> data_type , data_type ),
564
563
c , ptr_bucket_data_type_mismatch ,
@@ -601,8 +600,9 @@ int bch2_check_fix_ptrs(struct btree_trans *trans,
601
600
bch2_bkey_val_to_text (& buf , c , k ), buf .buf )))
602
601
do_update = true;
603
602
}
603
+ next :
604
+ bch2_dev_put (ca );
604
605
}
605
- rcu_read_unlock ();
606
606
607
607
if (do_update ) {
608
608
if (flags & BTREE_TRIGGER_is_root ) {
@@ -638,9 +638,10 @@ int bch2_check_fix_ptrs(struct btree_trans *trans,
638
638
} else {
639
639
struct bkey_ptrs ptrs ;
640
640
union bch_extent_entry * entry ;
641
+
642
+ rcu_read_lock ();
641
643
restart_drop_ptrs :
642
644
ptrs = bch2_bkey_ptrs (bkey_i_to_s (new ));
643
- rcu_read_lock ();
644
645
bkey_for_each_ptr_decode (bkey_i_to_s (new ).k , ptrs , p , entry ) {
645
646
struct bch_dev * ca = bch2_dev_rcu (c , p .ptr .dev );
646
647
struct bucket * g = PTR_GC_BUCKET (ca , & p .ptr );
0 commit comments