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;
}
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;
}
}
-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,
};
}
-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,
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)
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);