bcachefs: bch2_dev_btree_bitmap_marked() -> bch2_dev_rcu()
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 30 Apr 2024 20:11:15 +0000 (16:11 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:22 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/sb-members.c

index 96a49ad0525cc0bcfc87918cbf8276f03be73348..e4a9c858ca8e2a47841a19914d35ca7210280b60 100644 (file)
@@ -398,11 +398,20 @@ void bch2_dev_errors_reset(struct bch_dev *ca)
 
 bool bch2_dev_btree_bitmap_marked(struct bch_fs *c, struct bkey_s_c k)
 {
-       bkey_for_each_ptr(bch2_bkey_ptrs_c(k), ptr)
-               if (!bch2_dev_btree_bitmap_marked_sectors(bch2_dev_bkey_exists(c, ptr->dev),
-                                                         ptr->offset, btree_sectors(c)))
-                       return false;
-       return true;
+       bool ret = true;
+       rcu_read_lock();
+       bkey_for_each_ptr(bch2_bkey_ptrs_c(k), ptr) {
+               struct bch_dev *ca = bch2_dev_rcu(c, ptr->dev);
+               if (!ca)
+                       continue;
+
+               if (!bch2_dev_btree_bitmap_marked_sectors(ca, ptr->offset, btree_sectors(c))) {
+                       ret = false;
+                       break;
+               }
+       }
+       rcu_read_unlock();
+       return ret;
 }
 
 static void __bch2_dev_btree_bitmap_mark(struct bch_sb_field_members_v2 *mi, unsigned dev,
@@ -440,6 +449,10 @@ void bch2_dev_btree_bitmap_mark(struct bch_fs *c, struct bkey_s_c k)
        lockdep_assert_held(&c->sb_lock);
 
        struct bch_sb_field_members_v2 *mi = bch2_sb_field_get(c->disk_sb.sb, members_v2);
-       bkey_for_each_ptr(bch2_bkey_ptrs_c(k), ptr)
+       bkey_for_each_ptr(bch2_bkey_ptrs_c(k), ptr) {
+               if (!bch2_member_exists(c->disk_sb.sb, ptr->dev))
+                       continue;
+
                __bch2_dev_btree_bitmap_mark(mi, ptr->dev, ptr->offset, btree_sectors(c));
+       }
 }