summaryrefslogtreecommitdiff
path: root/libbcachefs/move.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-03-31 15:52:24 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-03-31 18:02:57 -0400
commit7f102ee83d83fd918783ca542fac1574f9b2c623 (patch)
treeda560f908d970d3dbad5749c1407ed30b6965c4c /libbcachefs/move.c
parentd22c79d2fff10dd782caf5668fd019387914a5bb (diff)
Update bcachefs sources to 8fd009dd76 bcachefs: Rip out code for storing backpointers in alloc keysv0.28
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/move.c')
-rw-r--r--libbcachefs/move.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/libbcachefs/move.c b/libbcachefs/move.c
index 6f5851ea..d7bcdc88 100644
--- a/libbcachefs/move.c
+++ b/libbcachefs/move.c
@@ -627,9 +627,12 @@ void bch2_verify_bucket_evacuated(struct btree_trans *trans, struct bpos bucket,
struct bkey_s_c k;
struct printbuf buf = PRINTBUF;
struct bch_backpointer bp;
- u64 bp_offset = 0;
+ struct bpos bp_pos = POS_MIN;
+ unsigned nr_bps = 0;
int ret;
+ bch2_trans_begin(trans);
+
bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
bucket, BTREE_ITER_CACHED);
again:
@@ -650,6 +653,7 @@ again:
}
}
+ set_btree_iter_dontneed(&iter);
bch2_trans_iter_exit(trans, &iter);
return;
failed_to_evacuate:
@@ -665,17 +669,16 @@ failed_to_evacuate:
bch2_trans_begin(trans);
ret = bch2_get_next_backpointer(trans, bucket, gen,
- &bp_offset, &bp,
+ &bp_pos, &bp,
BTREE_ITER_CACHED);
if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
continue;
if (ret)
break;
- if (bp_offset == U64_MAX)
+ if (bkey_eq(bp_pos, POS_MAX))
break;
- k = bch2_backpointer_get_key(trans, &iter,
- bucket, bp_offset, bp);
+ k = bch2_backpointer_get_key(trans, &iter, bp_pos, bp, 0);
ret = bkey_err(k);
if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
continue;
@@ -686,6 +689,10 @@ failed_to_evacuate:
prt_newline(&buf);
bch2_bkey_val_to_text(&buf, c, k);
bch2_trans_iter_exit(trans, &iter);
+
+ if (++nr_bps > 10)
+ break;
+ bp_pos = bpos_nosnap_successor(bp_pos);
}
bch2_print_string_as_lines(KERN_ERR, buf.buf);
@@ -709,11 +716,17 @@ int __bch2_evacuate_bucket(struct btree_trans *trans,
struct data_update_opts data_opts;
unsigned dirty_sectors, bucket_size;
u64 fragmentation;
- u64 bp_offset = 0, cur_inum = U64_MAX;
+ u64 cur_inum = U64_MAX;
+ struct bpos bp_pos = POS_MIN;
int ret = 0;
bch2_bkey_buf_init(&sk);
+ /*
+ * We're not run in a context that handles transaction restarts:
+ */
+ bch2_trans_begin(trans);
+
bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
bucket, BTREE_ITER_CACHED);
ret = lockrestart_do(trans,
@@ -740,13 +753,13 @@ int __bch2_evacuate_bucket(struct btree_trans *trans,
bch2_trans_begin(trans);
ret = bch2_get_next_backpointer(trans, bucket, gen,
- &bp_offset, &bp,
+ &bp_pos, &bp,
BTREE_ITER_CACHED);
if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
continue;
if (ret)
goto err;
- if (bp_offset == U64_MAX)
+ if (bkey_eq(bp_pos, POS_MAX))
break;
if (!bp.level) {
@@ -754,8 +767,7 @@ int __bch2_evacuate_bucket(struct btree_trans *trans,
struct bkey_s_c k;
unsigned i = 0;
- k = bch2_backpointer_get_key(trans, &iter,
- bucket, bp_offset, bp);
+ k = bch2_backpointer_get_key(trans, &iter, bp_pos, bp, 0);
ret = bkey_err(k);
if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
continue;
@@ -810,8 +822,7 @@ int __bch2_evacuate_bucket(struct btree_trans *trans,
} else {
struct btree *b;
- b = bch2_backpointer_get_node(trans, &iter,
- bucket, bp_offset, bp);
+ b = bch2_backpointer_get_node(trans, &iter, bp_pos, bp);
ret = PTR_ERR_OR_ZERO(b);
if (ret == -BCH_ERR_backpointer_to_overwritten_btree_node)
continue;
@@ -839,7 +850,7 @@ int __bch2_evacuate_bucket(struct btree_trans *trans,
}
}
next:
- bp_offset++;
+ bp_pos = bpos_nosnap_successor(bp_pos);
}
trace_evacuate_bucket(c, &bucket, dirty_sectors, bucket_size, fragmentation, ret);