diff options
-rw-r--r-- | fs/bcachefs/btree_journal_iter.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/journal_io.c | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_journal_iter.h b/fs/bcachefs/btree_journal_iter.h index 8dc8e778be6c..85d6969fa9b1 100644 --- a/fs/bcachefs/btree_journal_iter.h +++ b/fs/bcachefs/btree_journal_iter.h @@ -31,7 +31,7 @@ struct btree_and_journal_iter { static inline u32 journal_entry_radix_idx(struct bch_fs *c, u64 seq) { - return (seq - c->journal_entries_base_seq) & (~0U >> 1); + return seq - c->journal_entries_base_seq; } static inline struct bkey_i *journal_key_k(struct bch_fs *c, diff --git a/fs/bcachefs/journal_io.c b/fs/bcachefs/journal_io.c index 9196b23e5537..a1feab88cc5e 100644 --- a/fs/bcachefs/journal_io.c +++ b/fs/bcachefs/journal_io.c @@ -214,6 +214,12 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca, nocompact: jlist->last_seq = max(jlist->last_seq, last_seq); + if (seq < c->journal_entries_base_seq || + seq >= c->journal_entries_base_seq + U32_MAX) { + bch_err(c, "journal entry sequence numbers span too large a range: cannot reply, contact developers"); + return bch_err_throw(c, ENOMEM_journal_entry_add); + } + _i = genradix_ptr_alloc(&c->journal_entries, journal_entry_radix_idx(c, seq), GFP_KERNEL); if (!_i) return bch_err_throw(c, ENOMEM_journal_entry_add); |