summaryrefslogtreecommitdiff
path: root/libbcachefs/backpointers.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/backpointers.c')
-rw-r--r--libbcachefs/backpointers.c28
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);