diff options
Diffstat (limited to 'libbcachefs/backpointers.c')
-rw-r--r-- | libbcachefs/backpointers.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/libbcachefs/backpointers.c b/libbcachefs/backpointers.c index 955f3ee9..7e8b1301 100644 --- a/libbcachefs/backpointers.c +++ b/libbcachefs/backpointers.c @@ -29,10 +29,15 @@ static inline struct bpos bucket_pos_to_bp(const struct bch_fs *c, u64 bucket_offset) { struct bch_dev *ca = bch_dev_bkey_exists(c, bucket.inode); + struct bpos ret; - return POS(bucket.inode, - (bucket_to_sector(ca, bucket.offset) << - MAX_EXTENT_COMPRESS_RATIO_SHIFT) + bucket_offset); + ret = POS(bucket.inode, + (bucket_to_sector(ca, bucket.offset) << + MAX_EXTENT_COMPRESS_RATIO_SHIFT) + bucket_offset); + + BUG_ON(bpos_cmp(bucket, bp_pos_to_bucket(c, ret))); + + return ret; } void bch2_extent_ptr_to_bp(struct bch_fs *c, @@ -409,17 +414,20 @@ int bch2_get_next_backpointer(struct btree_trans *trans, struct bch_backpointer *dst) { struct bch_fs *c = trans->c; - struct bpos bp_pos = - bucket_pos_to_bp(c, bucket, - max(*bp_offset, BACKPOINTER_OFFSET_MAX) - BACKPOINTER_OFFSET_MAX); - struct bpos bp_end_pos = - bucket_pos_to_bp(c, bpos_nosnap_successor(bucket), 0); + struct bpos bp_pos, bp_end_pos; struct btree_iter alloc_iter, bp_iter = { NULL }; struct bkey_s_c k; struct bkey_s_c_alloc_v4 a; size_t i; int ret; + if (*bp_offset == U64_MAX) + return 0; + + bp_pos = bucket_pos_to_bp(c, bucket, + max(*bp_offset, BACKPOINTER_OFFSET_MAX) - BACKPOINTER_OFFSET_MAX); + bp_end_pos = bucket_pos_to_bp(c, bpos_nosnap_successor(bucket), 0); + bch2_trans_iter_init(trans, &alloc_iter, BTREE_ID_alloc, bucket, BTREE_ITER_CACHED); k = bch2_btree_iter_peek_slot(&alloc_iter); @@ -803,8 +811,10 @@ int bch2_check_extents_to_backpointers(struct bch_fs *c) bch2_trans_init(&trans, c, 0, 0); for (btree_id = 0; btree_id < BTREE_ID_NR; btree_id++) { + unsigned depth = btree_type_has_ptrs(btree_id) ? 0 : 1; + bch2_trans_node_iter_init(&trans, &iter, btree_id, POS_MIN, 0, - 0, + depth, BTREE_ITER_ALL_LEVELS| BTREE_ITER_PREFETCH); |