Skip to content

Commit 521f958

Browse files
author
Kent Overstreet
committed
bcachefs: Ensure we don't use a blacklisted journal seq
Different versions differ on the size of the blacklist range; it is theoretically possible that we could end up with blacklisted journal sequence numbers newer than the newest seq we find in the journal, and pick a new start seq that's blacklisted. Explicitly check for this in bch2_fs_journal_start(). Signed-off-by: Kent Overstreet <[email protected]>
1 parent 9b133c0 commit 521f958

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

fs/bcachefs/journal.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ static int journal_entry_open(struct journal *j)
415415
if (atomic64_read(&j->seq) - j->seq_write_started == JOURNAL_STATE_BUF_NR)
416416
return -BCH_ERR_journal_max_open;
417417

418-
if (journal_cur_seq(j) >= JOURNAL_SEQ_MAX) {
418+
if (unlikely(journal_cur_seq(j) >= JOURNAL_SEQ_MAX)) {
419419
bch_err(c, "cannot start: journal seq overflow");
420420
if (bch2_fs_emergency_read_only_locked(c))
421421
bch_err(c, "fatal error - emergency read only");
@@ -459,6 +459,14 @@ static int journal_entry_open(struct journal *j)
459459
atomic64_inc(&j->seq);
460460
journal_pin_list_init(fifo_push_ref(&j->pin), 1);
461461

462+
if (unlikely(bch2_journal_seq_is_blacklisted(c, journal_cur_seq(j), false))) {
463+
bch_err(c, "attempting to open blacklisted journal seq %llu",
464+
journal_cur_seq(j));
465+
if (bch2_fs_emergency_read_only_locked(c))
466+
bch_err(c, "fatal error - emergency read only");
467+
return -BCH_ERR_journal_shutdown;
468+
}
469+
462470
BUG_ON(j->pin.back - 1 != atomic64_read(&j->seq));
463471

464472
BUG_ON(j->buf + (journal_cur_seq(j) & JOURNAL_BUF_MASK) != buf);
@@ -1415,6 +1423,13 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq)
14151423
bool had_entries = false;
14161424
u64 last_seq = cur_seq, nr, seq;
14171425

1426+
/*
1427+
*
1428+
* XXX pick most recent non blacklisted sequence number
1429+
*/
1430+
1431+
cur_seq = max(cur_seq, bch2_journal_last_blacklisted_seq(c));
1432+
14181433
if (cur_seq >= JOURNAL_SEQ_MAX) {
14191434
bch_err(c, "cannot start: journal seq overflow");
14201435
return -EINVAL;

fs/bcachefs/journal_seq_blacklist.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ bool bch2_journal_seq_is_blacklisted(struct bch_fs *c, u64 seq,
130130
return true;
131131
}
132132

133+
u64 bch2_journal_last_blacklisted_seq(struct bch_fs *c)
134+
{
135+
struct journal_seq_blacklist_table *t = c->journal_seq_blacklist_table;
136+
137+
if (!t || !t->nr)
138+
return 0;
139+
140+
return t->entries[eytzinger0_last(t->nr)].end - 1;
141+
}
142+
133143
int bch2_blacklist_table_initialize(struct bch_fs *c)
134144
{
135145
struct bch_sb_field_journal_seq_blacklist *bl =

fs/bcachefs/journal_seq_blacklist.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ blacklist_nr_entries(struct bch_sb_field_journal_seq_blacklist *bl)
1212
}
1313

1414
bool bch2_journal_seq_is_blacklisted(struct bch_fs *, u64, bool);
15+
u64 bch2_journal_last_blacklisted_seq(struct bch_fs *);
1516
int bch2_journal_seq_blacklist_add(struct bch_fs *c, u64, u64);
1617
int bch2_blacklist_table_initialize(struct bch_fs *);
1718

0 commit comments

Comments
 (0)