bcachefs: bch2_bkey_has_target() -> bch2_dev_rcu()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 1 May 2024 01:12:31 +0000 (21:12 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:23 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/extents.c

index 5f5038f0ca7cf42c8e8252514e1f268dbeb00fad..52e79b87b4853e407fc6923fda3e2da5165ad256 100644 (file)
@@ -870,14 +870,21 @@ const struct bch_extent_ptr *bch2_bkey_has_device_c(struct bkey_s_c k, unsigned
 bool bch2_bkey_has_target(struct bch_fs *c, struct bkey_s_c k, unsigned target)
 {
        struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k);
+       struct bch_dev *ca;
+       bool ret = false;
 
+       rcu_read_lock();
        bkey_for_each_ptr(ptrs, ptr)
                if (bch2_dev_in_target(c, ptr->dev, target) &&
+                   (ca = bch2_dev_rcu(c, ptr->dev)) &&
                    (!ptr->cached ||
-                    !dev_ptr_stale(bch2_dev_bkey_exists(c, ptr->dev), ptr)))
-                       return true;
+                    !dev_ptr_stale_rcu(ca, ptr))) {
+                       ret = true;
+                       break;
+               }
+       rcu_read_unlock();
 
-       return false;
+       return ret;
 }
 
 bool bch2_bkey_matches_ptr(struct bch_fs *c, struct bkey_s_c k,