]> www.infradead.org Git - linux.git/commitdiff
bcachefs: bch2_extent_ptr_to_bp() no longer depends on device
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 18 Nov 2024 04:58:21 +0000 (23:58 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 29 Dec 2024 18:30:39 +0000 (13:30 -0500)
bch_backpointer no longer contains the bucket_offset field, it's just a
direct LBA mapping (with low bits to account for compressed extent
splitting), so we don't need to refer to the device to construct it
anymore.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/backpointers.c
fs/bcachefs/backpointers.h
fs/bcachefs/buckets.c

index b19719b02df8f8f6cefe1b27806cdd027b4a4f37..98d89133fc7545e90d54d53ac5ea8d8638c41a07 100644 (file)
@@ -73,26 +73,14 @@ static bool extent_matches_bp(struct bch_fs *c,
        const union bch_extent_entry *entry;
        struct extent_ptr_decoded p;
 
-       rcu_read_lock();
        bkey_for_each_ptr_decode(k.k, ptrs, p, entry) {
-               struct bpos bucket2;
                struct bkey_i_backpointer bp2;
+               bch2_extent_ptr_to_bp(c, btree_id, level, k, p, entry, &bp2);
 
-               if (p.ptr.cached)
-                       continue;
-
-               struct bch_dev *ca = bch2_dev_rcu(c, p.ptr.dev);
-               if (!ca)
-                       continue;
-
-               bch2_extent_ptr_to_bp(c, ca, btree_id, level, k, p, entry, &bucket2, &bp2);
                if (bpos_eq(bp.k->p, bp2.k.p) &&
-                   !memcmp(bp.v, &bp2.v, sizeof(bp2.v))) {
-                       rcu_read_unlock();
+                   !memcmp(bp.v, &bp2.v, sizeof(bp2.v)))
                        return true;
-               }
        }
-       rcu_read_unlock();
 
        return false;
 }
@@ -586,21 +574,15 @@ static int check_extent_to_backpointers(struct btree_trans *trans,
 
        ptrs = bch2_bkey_ptrs_c(k);
        bkey_for_each_ptr_decode(k.k, ptrs, p, entry) {
-               struct bpos bucket_pos;
                struct bkey_i_backpointer bp;
 
                if (p.ptr.cached)
                        continue;
 
-               rcu_read_lock();
-               struct bch_dev *ca = bch2_dev_rcu_noerror(c, p.ptr.dev);
-               if (ca)
-                       bch2_extent_ptr_to_bp(c, ca, btree, level, k, p, entry, &bucket_pos, &bp);
-               rcu_read_unlock();
-
-               if (!ca)
+               if (p.ptr.dev == BCH_SB_MEMBER_INVALID)
                        continue;
 
+               bch2_extent_ptr_to_bp(c, btree, level, k, p, entry, &bp);
                ret = check_bp_exists(trans, s, &bp, k);
                if (ret)
                        return ret;
index caffc68407abb0fa8f3de676c574756b120335d3..d126d40dda9953743251f2453aceaca5fbf6a807 100644 (file)
@@ -140,20 +140,15 @@ static inline enum bch_data_type bch2_bkey_ptr_data_type(struct bkey_s_c k,
        }
 }
 
-static inline void __bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
+static inline void __bch2_extent_ptr_to_bp(
                           enum btree_id btree_id, unsigned level,
                           struct bkey_s_c k, struct extent_ptr_decoded p,
                           const union bch_extent_entry *entry,
-                          struct bpos *bucket, struct bkey_i_backpointer *bp,
+                          struct bkey_i_backpointer *bp,
                           u64 sectors)
 {
-       u32 bucket_offset;
-       *bucket = PTR_BUCKET_POS_OFFSET(ca, &p.ptr, &bucket_offset);
-
-       u64 bp_bucket_offset = ((u64) bucket_offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) + p.crc.offset;
-
        bkey_backpointer_init(&bp->k_i);
-       bp->k.p = bucket_pos_to_bp(ca, *bucket, bp_bucket_offset);
+       bp->k.p = POS(p.ptr.dev, ((u64) p.ptr.offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) + p.crc.offset);
        bp->v   = (struct bch_backpointer) {
                .btree_id       = btree_id,
                .level          = level,
@@ -164,15 +159,15 @@ static inline void __bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
        };
 }
 
-static inline void bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
+static inline void bch2_extent_ptr_to_bp(struct bch_fs *c,
                           enum btree_id btree_id, unsigned level,
                           struct bkey_s_c k, struct extent_ptr_decoded p,
                           const union bch_extent_entry *entry,
-                          struct bpos *bucket_pos, struct bkey_i_backpointer *bp)
+                          struct bkey_i_backpointer *bp)
 {
        u64 sectors = ptr_disk_sectors(level ? btree_sectors(c) : k.k->size, p);
 
-       __bch2_extent_ptr_to_bp(c, ca, btree_id, level, k, p, entry, bucket_pos, bp, sectors);
+       __bch2_extent_ptr_to_bp(btree_id, level, k, p, entry, bp, sectors);
 }
 
 struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *, struct bkey_s_c_backpointer,
index bbd37b1ed5d227adc4333bd51f09ba2ebf6b9766..30b983cf9780e5f9c680710d101a8c3f5182c904 100644 (file)
@@ -572,6 +572,9 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
        u64 abs_sectors = ptr_disk_sectors(level ? btree_sectors(c) : k.k->size, p);
        *sectors = insert ? abs_sectors : -abs_sectors;
 
+       struct bkey_i_backpointer bp;
+       __bch2_extent_ptr_to_bp(btree_id, level, k, p, entry, &bp, abs_sectors);
+
        struct bch_dev *ca = bch2_dev_tryget(c, p.ptr.dev);
        if (unlikely(!ca)) {
                if (insert && p.ptr.dev != BCH_SB_MEMBER_INVALID)
@@ -579,9 +582,7 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
                goto err;
        }
 
-       struct bpos bucket;
-       struct bkey_i_backpointer bp;
-       __bch2_extent_ptr_to_bp(trans->c, ca, btree_id, level, k, p, entry, &bucket, &bp, abs_sectors);
+       struct bpos bucket = PTR_BUCKET_POS(ca, &p.ptr);
 
        if (flags & BTREE_TRIGGER_transactional) {
                struct bkey_i_alloc_v4 *a = bch2_trans_start_alloc_update(trans, bucket, 0);