@@ -48,17 +48,19 @@ void bch2_backpointer_to_text(struct printbuf *out, struct bch_fs *c, struct bke
4848{
4949 struct bkey_s_c_backpointer bp = bkey_s_c_to_backpointer (k );
5050
51- rcu_read_lock ();
52- struct bch_dev * ca = bch2_dev_rcu_noerror (c , bp .k -> p .inode );
53- if (ca ) {
54- u32 bucket_offset ;
55- struct bpos bucket = bp_pos_to_bucket_and_offset (ca , bp .k -> p , & bucket_offset );
56- rcu_read_unlock ();
51+ struct bch_dev * ca ;
52+ u32 bucket_offset ;
53+ struct bpos bucket ;
54+ scoped_guard (rcu ) {
55+ ca = bch2_dev_rcu_noerror (c , bp .k -> p .inode );
56+ if (ca )
57+ bucket = bp_pos_to_bucket_and_offset (ca , bp .k -> p , & bucket_offset );
58+ }
59+
60+ if (ca )
5761 prt_printf (out , "bucket=%llu:%llu:%u " , bucket .inode , bucket .offset , bucket_offset );
58- } else {
59- rcu_read_unlock ();
62+ else
6063 prt_printf (out , "sector=%llu:%llu " , bp .k -> p .inode , bp .k -> p .offset >> MAX_EXTENT_COMPRESS_RATIO_SHIFT );
61- }
6264
6365 bch2_btree_id_level_to_text (out , bp .v -> btree_id , bp .v -> level );
6466 prt_str (out , " data_type=" );
@@ -591,6 +593,7 @@ static int check_bp_exists(struct btree_trans *trans,
591593 bkey_for_each_ptr (other_extent_ptrs , ptr )
592594 if (ptr -> dev == bp -> k .p .inode &&
593595 dev_ptr_stale_rcu (ca , ptr )) {
596+ rcu_read_unlock ();
594597 ret = drop_dev_and_update (trans , other_bp .v -> btree_id ,
595598 other_extent , bp -> k .p .inode );
596599 if (ret )
@@ -679,26 +682,23 @@ static int check_extent_to_backpointers(struct btree_trans *trans,
679682 if (p .ptr .dev == BCH_SB_MEMBER_INVALID )
680683 continue ;
681684
682- rcu_read_lock ();
683- struct bch_dev * ca = bch2_dev_rcu_noerror (c , p .ptr .dev );
684- if (!ca ) {
685- rcu_read_unlock ();
686- continue ;
687- }
685+ bool empty ;
686+ {
687+ /* scoped_guard() is a loop, so it breaks continue */
688+ guard (rcu )();
689+ struct bch_dev * ca = bch2_dev_rcu_noerror (c , p .ptr .dev );
690+ if (!ca )
691+ continue ;
688692
689- if (p .ptr .cached && dev_ptr_stale_rcu (ca , & p .ptr )) {
690- rcu_read_unlock ();
691- continue ;
692- }
693+ if (p .ptr .cached && dev_ptr_stale_rcu (ca , & p .ptr ))
694+ continue ;
693695
694- u64 b = PTR_BUCKET_NR (ca , & p .ptr );
695- if (!bch2_bucket_bitmap_test (& ca -> bucket_backpointer_mismatch , b )) {
696- rcu_read_unlock ();
697- continue ;
698- }
696+ u64 b = PTR_BUCKET_NR (ca , & p .ptr );
697+ if (!bch2_bucket_bitmap_test (& ca -> bucket_backpointer_mismatch , b ))
698+ continue ;
699699
700- bool empty = bch2_bucket_bitmap_test (& ca -> bucket_backpointer_empty , b );
701- rcu_read_unlock ();
700+ empty = bch2_bucket_bitmap_test (& ca -> bucket_backpointer_empty , b );
701+ }
702702
703703 struct bkey_i_backpointer bp ;
704704 bch2_extent_ptr_to_bp (c , btree , level , k , p , entry , & bp );
@@ -981,7 +981,7 @@ static bool backpointer_node_has_missing(struct bch_fs *c, struct bkey_s_c k)
981981 case KEY_TYPE_btree_ptr_v2 : {
982982 bool ret = false;
983983
984- rcu_read_lock ();
984+ guard ( rcu ) ();
985985 struct bpos pos = bkey_s_c_to_btree_ptr_v2 (k ).v -> min_key ;
986986 while (pos .inode <= k .k -> p .inode ) {
987987 if (pos .inode >= c -> sb .nr_devices )
@@ -1009,7 +1009,6 @@ static bool backpointer_node_has_missing(struct bch_fs *c, struct bkey_s_c k)
10091009next :
10101010 pos = SPOS (pos .inode + 1 , 0 , 0 );
10111011 }
1012- rcu_read_unlock ();
10131012
10141013 return ret ;
10151014 }
0 commit comments