1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_BACKPOINTERS_BACKGROUND_H
3 #define _BCACHEFS_BACKPOINTERS_BACKGROUND_H
8 int bch2_backpointer_invalid(const struct bch_fs *, struct bkey_s_c k,
9 unsigned, struct printbuf *);
10 void bch2_backpointer_to_text(struct printbuf *, const struct bch_backpointer *);
11 void bch2_backpointer_k_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
12 void bch2_backpointer_swab(struct bkey_s);
14 #define bch2_bkey_ops_backpointer ((struct bkey_ops) { \
15 .key_invalid = bch2_backpointer_invalid, \
16 .val_to_text = bch2_backpointer_k_to_text, \
17 .swab = bch2_backpointer_swab, \
20 #define MAX_EXTENT_COMPRESS_RATIO_SHIFT 10
22 static inline void bch2_extent_ptr_to_bp(struct bch_fs *c,
23 enum btree_id btree_id, unsigned level,
24 struct bkey_s_c k, struct extent_ptr_decoded p,
25 struct bpos *bucket_pos, struct bch_backpointer *bp)
27 enum bch_data_type data_type = level ? BCH_DATA_btree : BCH_DATA_user;
28 s64 sectors = level ? btree_sectors(c) : k.k->size;
31 *bucket_pos = PTR_BUCKET_POS_OFFSET(c, &p.ptr, &bucket_offset);
32 *bp = (struct bch_backpointer) {
35 .data_type = data_type,
36 .bucket_offset = ((u64) bucket_offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) +
38 .bucket_len = ptr_disk_sectors(sectors, p),
43 int bch2_bucket_backpointer_del(struct btree_trans *, struct bkey_i_alloc_v4 *,
44 struct bch_backpointer, struct bkey_s_c);
45 int bch2_bucket_backpointer_add(struct btree_trans *, struct bkey_i_alloc_v4 *,
46 struct bch_backpointer, struct bkey_s_c);
47 int bch2_get_next_backpointer(struct btree_trans *, struct bpos, int,
48 u64 *, struct bch_backpointer *, unsigned);
49 struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *, struct btree_iter *,
50 struct bpos, u64, struct bch_backpointer);
51 struct btree *bch2_backpointer_get_node(struct btree_trans *, struct btree_iter *,
52 struct bpos, u64, struct bch_backpointer);
54 int bch2_check_btree_backpointers(struct bch_fs *);
55 int bch2_check_extents_to_backpointers(struct bch_fs *);
56 int bch2_check_backpointers_to_extents(struct bch_fs *);
58 #endif /* _BCACHEFS_BACKPOINTERS_BACKGROUND_H */