summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_journal_iter.h
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/btree_journal_iter.h')
-rw-r--r--fs/bcachefs/btree_journal_iter.h35
1 files changed, 27 insertions, 8 deletions
diff --git a/fs/bcachefs/btree_journal_iter.h b/fs/bcachefs/btree_journal_iter.h
index 2a3082919b8d..8dc8e778be6c 100644
--- a/fs/bcachefs/btree_journal_iter.h
+++ b/fs/bcachefs/btree_journal_iter.h
@@ -29,6 +29,22 @@ struct btree_and_journal_iter {
bool fail_if_too_many_whiteouts;
};
+static inline u32 journal_entry_radix_idx(struct bch_fs *c, u64 seq)
+{
+ return (seq - c->journal_entries_base_seq) & (~0U >> 1);
+}
+
+static inline struct bkey_i *journal_key_k(struct bch_fs *c,
+ const struct journal_key *k)
+{
+ if (k->allocated)
+ return k->allocated_k;
+
+ struct journal_replay *i = *genradix_ptr(&c->journal_entries, k->journal_seq_offset);
+
+ return (struct bkey_i *) (i->j._data + k->journal_offset);
+}
+
static inline int __journal_key_btree_cmp(enum btree_id l_btree_id,
unsigned l_level,
const struct journal_key *r)
@@ -37,25 +53,28 @@ static inline int __journal_key_btree_cmp(enum btree_id l_btree_id,
cmp_int(l_btree_id, r->btree_id);
}
-static inline int __journal_key_cmp(enum btree_id l_btree_id,
+static inline int __journal_key_cmp(struct bch_fs *c,
+ enum btree_id l_btree_id,
unsigned l_level,
struct bpos l_pos,
const struct journal_key *r)
{
return __journal_key_btree_cmp(l_btree_id, l_level, r) ?:
- bpos_cmp(l_pos, r->k->k.p);
+ bpos_cmp(l_pos, journal_key_k(c, r)->k.p);
}
-static inline int journal_key_cmp(const struct journal_key *l, const struct journal_key *r)
+static inline int journal_key_cmp(struct bch_fs *c,
+ const struct journal_key *l, const struct journal_key *r)
{
- return __journal_key_cmp(l->btree_id, l->level, l->k->k.p, r);
+ return __journal_key_cmp(c, l->btree_id, l->level,
+ journal_key_k(c, l)->k.p, r);
}
-struct bkey_i *bch2_journal_keys_peek_max(struct bch_fs *, enum btree_id,
+const struct bkey_i *bch2_journal_keys_peek_max(struct bch_fs *, enum btree_id,
unsigned, struct bpos, struct bpos, size_t *);
-struct bkey_i *bch2_journal_keys_peek_prev_min(struct bch_fs *, enum btree_id,
+const struct bkey_i *bch2_journal_keys_peek_prev_min(struct bch_fs *, enum btree_id,
unsigned, struct bpos, struct bpos, size_t *);
-struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *, enum btree_id,
+const struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *, enum btree_id,
unsigned, struct bpos);
int bch2_btree_and_journal_iter_prefetch(struct btree_trans *, struct btree_path *,
@@ -71,7 +90,7 @@ bool bch2_key_deleted_in_journal(struct btree_trans *, enum btree_id, unsigned,
void bch2_journal_key_overwritten(struct bch_fs *, enum btree_id, unsigned, struct bpos);
void bch2_btree_and_journal_iter_advance(struct btree_and_journal_iter *);
-struct bkey_s_c bch2_btree_and_journal_iter_peek(struct btree_and_journal_iter *);
+struct bkey_s_c bch2_btree_and_journal_iter_peek(struct bch_fs *, struct btree_and_journal_iter *);
void bch2_btree_and_journal_iter_exit(struct btree_and_journal_iter *);
void __bch2_btree_and_journal_iter_init_node_iter(struct btree_trans *,