bcachefs: bch2_extent_merge() -> bch2_dev_rcu()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 1 May 2024 00:49:22 +0000 (20:49 -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 6376440f6f30f5d71a79bc4b097526ad8ba348f4..46f8164b1a49df1c21c3b049b3407961a390c9c7 100644 (file)
@@ -252,7 +252,6 @@ bool bch2_extent_merge(struct bch_fs *c, struct bkey_s l, struct bkey_s_c r)
        const union bch_extent_entry *en_r;
        struct extent_ptr_decoded lp, rp;
        bool use_right_ptr;
-       struct bch_dev *ca;
 
        en_l = l_ptrs.start;
        en_r = r_ptrs.start;
@@ -283,8 +282,12 @@ bool bch2_extent_merge(struct bch_fs *c, struct bkey_s l, struct bkey_s_c r)
                        return false;
 
                /* Extents may not straddle buckets: */
-               ca = bch2_dev_bkey_exists(c, lp.ptr.dev);
-               if (PTR_BUCKET_NR(ca, &lp.ptr) != PTR_BUCKET_NR(ca, &rp.ptr))
+               rcu_read_lock();
+               struct bch_dev *ca = bch2_dev_rcu(c, lp.ptr.dev);
+               bool same_bucket = ca && PTR_BUCKET_NR(ca, &lp.ptr) == PTR_BUCKET_NR(ca, &rp.ptr);
+               rcu_read_unlock();
+
+               if (!same_bucket)
                        return false;
 
                if (lp.has_ec                   != rp.has_ec ||