-#define BACKPOINTER_OFFSET_MAX ((1ULL << 40) - 1)
-
-static inline int backpointer_cmp(struct bch_backpointer l, struct bch_backpointer r)
-{
- return cmp_int(l.bucket_offset, r.bucket_offset);
-}
-
-static int bch2_backpointer_del_by_offset(struct btree_trans *trans,
- struct bpos bucket,
- u64 bp_offset,
- struct bch_backpointer bp)
-{
- struct bch_fs *c = trans->c;
- struct btree_iter iter;
- struct bkey_s_c k;
- int ret;
-
- if (bp_offset < BACKPOINTER_OFFSET_MAX) {
- struct bch_backpointer *bps;
- struct bkey_i_alloc_v4 *a;
- unsigned i, nr;
-
- bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
- bucket,
- BTREE_ITER_INTENT|
- BTREE_ITER_SLOTS|
- BTREE_ITER_WITH_UPDATES);
- k = bch2_btree_iter_peek_slot(&iter);
- ret = bkey_err(k);
- if (ret)
- goto err;
-
- if (k.k->type != KEY_TYPE_alloc_v4) {
- ret = -ENOENT;
- goto err;
- }
-
- a = bch2_alloc_to_v4_mut(trans, k);
- ret = PTR_ERR_OR_ZERO(a);
- if (ret)
- goto err;
- bps = alloc_v4_backpointers(&a->v);
- nr = BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v);
-
- for (i = 0; i < nr; i++) {
- if (bps[i].bucket_offset == bp_offset)
- goto found;
- if (bps[i].bucket_offset > bp_offset)
- break;
- }
-
- ret = -ENOENT;
- goto err;
-found:
- if (memcmp(&bps[i], &bp, sizeof(bp))) {
- ret = -ENOENT;
- goto err;
- }
- array_remove_item(bps, nr, i);
- SET_BCH_ALLOC_V4_NR_BACKPOINTERS(&a->v, nr);
- set_alloc_v4_u64s(a);
- ret = bch2_trans_update(trans, &iter, &a->k_i, 0);
- } else {
- bp_offset -= BACKPOINTER_OFFSET_MAX;
-
- bch2_trans_iter_init(trans, &iter, BTREE_ID_backpointers,
- bucket_pos_to_bp(c, bucket, bp_offset),
- BTREE_ITER_INTENT|
- BTREE_ITER_SLOTS|
- BTREE_ITER_WITH_UPDATES);
- k = bch2_btree_iter_peek_slot(&iter);
- ret = bkey_err(k);
- if (ret)
- goto err;
-
- if (k.k->type != KEY_TYPE_backpointer ||
- memcmp(bkey_s_c_to_backpointer(k).v, &bp, sizeof(bp))) {
- ret = -ENOENT;
- goto err;
- }
-
- ret = bch2_btree_delete_at(trans, &iter, 0);
- }
-err:
- bch2_trans_iter_exit(trans, &iter);
- return ret;
-}
-
-int bch2_bucket_backpointer_del(struct btree_trans *trans,
- struct bkey_i_alloc_v4 *a,
- struct bch_backpointer bp,
- struct bkey_s_c orig_k)