Loading fs/bcachefs/btree_journal_iter.c +1 −1 Original line number Diff line number Diff line Loading @@ -512,7 +512,7 @@ int bch2_journal_keys_sort(struct bch_fs *c) genradix_for_each(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; cond_resched(); Loading fs/bcachefs/journal.c +2 −2 Original line number Diff line number Diff line Loading @@ -1204,7 +1204,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq) genradix_for_each_reverse(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; last_seq = le64_to_cpu(i->j.last_seq); Loading Loading @@ -1237,7 +1237,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq) genradix_for_each(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; seq = le64_to_cpu(i->j.seq); Loading fs/bcachefs/journal_io.c +19 −14 Original line number Diff line number Diff line Loading @@ -86,9 +86,12 @@ static void __journal_replay_free(struct bch_fs *c, kvfree(i); } static void journal_replay_free(struct bch_fs *c, struct journal_replay *i) static void journal_replay_free(struct bch_fs *c, struct journal_replay *i, bool blacklisted) { i->ignore = true; if (blacklisted) i->ignore_blacklisted = true; else i->ignore_not_dirty = true; if (!c->opts.read_entire_journal) __journal_replay_free(c, i); Loading Loading @@ -138,12 +141,13 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca, journal_entry_radix_idx(c, jlist->last_seq)) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; if (le64_to_cpu(i->j.seq) >= last_seq) break; journal_replay_free(c, i); journal_replay_free(c, i, false); } } Loading Loading @@ -200,7 +204,8 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca, darray_init(&i->ptrs); i->csum_good = entry_ptr.csum_good; i->ignore = false; i->ignore_blacklisted = false; i->ignore_not_dirty = false; unsafe_memcpy(&i->j, j, bytes, "embedded variable length struct"); if (dup) { Loading Loading @@ -1255,20 +1260,20 @@ int bch2_journal_read(struct bch_fs *c, i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; if (!*start_seq) *blacklist_seq = *start_seq = le64_to_cpu(i->j.seq) + 1; if (JSET_NO_FLUSH(&i->j)) { i->ignore = true; i->ignore_blacklisted = true; continue; } if (!last_write_torn && !i->csum_good) { last_write_torn = true; i->ignore = true; i->ignore_blacklisted = true; continue; } Loading Loading @@ -1307,12 +1312,12 @@ int bch2_journal_read(struct bch_fs *c, genradix_for_each(&c->journal_entries, radix_iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; seq = le64_to_cpu(i->j.seq); if (seq < *last_seq) { journal_replay_free(c, i); journal_replay_free(c, i, false); continue; } Loading @@ -1320,7 +1325,7 @@ int bch2_journal_read(struct bch_fs *c, fsck_err_on(!JSET_NO_FLUSH(&i->j), c, jset_seq_blacklisted, "found blacklisted journal entry %llu", seq); i->ignore = true; i->ignore_blacklisted = true; } } Loading @@ -1329,7 +1334,7 @@ int bch2_journal_read(struct bch_fs *c, genradix_for_each(&c->journal_entries, radix_iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; BUG_ON(seq > le64_to_cpu(i->j.seq)); Loading Loading @@ -1382,7 +1387,7 @@ int bch2_journal_read(struct bch_fs *c, }; i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; darray_for_each(i->ptrs, ptr) { Loading fs/bcachefs/journal_io.h +7 −1 Original line number Diff line number Diff line Loading @@ -20,11 +20,17 @@ struct journal_replay { DARRAY_PREALLOCATED(struct journal_ptr, 8) ptrs; bool csum_good; bool ignore; bool ignore_blacklisted; bool ignore_not_dirty; /* must be last: */ struct jset j; }; static inline bool journal_replay_ignore(struct journal_replay *i) { return !i || i->ignore_blacklisted || i->ignore_not_dirty; } static inline struct jset_entry *__jset_entry_type_next(struct jset *jset, struct jset_entry *entry, unsigned type) { Loading fs/bcachefs/recovery.c +4 −3 Original line number Diff line number Diff line Loading @@ -366,7 +366,7 @@ static int journal_replay_early(struct bch_fs *c, genradix_for_each(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; vstruct_for_each(&i->j, entry) { Loading Loading @@ -868,7 +868,7 @@ int bch2_fs_recovery(struct bch_fs *c) goto out; genradix_for_each_reverse(&c->journal_entries, iter, i) if (*i && !(*i)->ignore) { if (!journal_replay_ignore(*i)) { last_journal_entry = &(*i)->j; break; } Loading @@ -893,7 +893,8 @@ int bch2_fs_recovery(struct bch_fs *c) genradix_for_each_reverse(&c->journal_entries, iter, i) if (*i) { last_journal_entry = &(*i)->j; (*i)->ignore = false; (*i)->ignore_blacklisted = false; (*i)->ignore_not_dirty= false; /* * This was probably a NO_FLUSH entry, * so last_seq was garbage - but we know Loading Loading
fs/bcachefs/btree_journal_iter.c +1 −1 Original line number Diff line number Diff line Loading @@ -512,7 +512,7 @@ int bch2_journal_keys_sort(struct bch_fs *c) genradix_for_each(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; cond_resched(); Loading
fs/bcachefs/journal.c +2 −2 Original line number Diff line number Diff line Loading @@ -1204,7 +1204,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq) genradix_for_each_reverse(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; last_seq = le64_to_cpu(i->j.last_seq); Loading Loading @@ -1237,7 +1237,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq) genradix_for_each(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; seq = le64_to_cpu(i->j.seq); Loading
fs/bcachefs/journal_io.c +19 −14 Original line number Diff line number Diff line Loading @@ -86,9 +86,12 @@ static void __journal_replay_free(struct bch_fs *c, kvfree(i); } static void journal_replay_free(struct bch_fs *c, struct journal_replay *i) static void journal_replay_free(struct bch_fs *c, struct journal_replay *i, bool blacklisted) { i->ignore = true; if (blacklisted) i->ignore_blacklisted = true; else i->ignore_not_dirty = true; if (!c->opts.read_entire_journal) __journal_replay_free(c, i); Loading Loading @@ -138,12 +141,13 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca, journal_entry_radix_idx(c, jlist->last_seq)) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; if (le64_to_cpu(i->j.seq) >= last_seq) break; journal_replay_free(c, i); journal_replay_free(c, i, false); } } Loading Loading @@ -200,7 +204,8 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca, darray_init(&i->ptrs); i->csum_good = entry_ptr.csum_good; i->ignore = false; i->ignore_blacklisted = false; i->ignore_not_dirty = false; unsafe_memcpy(&i->j, j, bytes, "embedded variable length struct"); if (dup) { Loading Loading @@ -1255,20 +1260,20 @@ int bch2_journal_read(struct bch_fs *c, i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; if (!*start_seq) *blacklist_seq = *start_seq = le64_to_cpu(i->j.seq) + 1; if (JSET_NO_FLUSH(&i->j)) { i->ignore = true; i->ignore_blacklisted = true; continue; } if (!last_write_torn && !i->csum_good) { last_write_torn = true; i->ignore = true; i->ignore_blacklisted = true; continue; } Loading Loading @@ -1307,12 +1312,12 @@ int bch2_journal_read(struct bch_fs *c, genradix_for_each(&c->journal_entries, radix_iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; seq = le64_to_cpu(i->j.seq); if (seq < *last_seq) { journal_replay_free(c, i); journal_replay_free(c, i, false); continue; } Loading @@ -1320,7 +1325,7 @@ int bch2_journal_read(struct bch_fs *c, fsck_err_on(!JSET_NO_FLUSH(&i->j), c, jset_seq_blacklisted, "found blacklisted journal entry %llu", seq); i->ignore = true; i->ignore_blacklisted = true; } } Loading @@ -1329,7 +1334,7 @@ int bch2_journal_read(struct bch_fs *c, genradix_for_each(&c->journal_entries, radix_iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; BUG_ON(seq > le64_to_cpu(i->j.seq)); Loading Loading @@ -1382,7 +1387,7 @@ int bch2_journal_read(struct bch_fs *c, }; i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; darray_for_each(i->ptrs, ptr) { Loading
fs/bcachefs/journal_io.h +7 −1 Original line number Diff line number Diff line Loading @@ -20,11 +20,17 @@ struct journal_replay { DARRAY_PREALLOCATED(struct journal_ptr, 8) ptrs; bool csum_good; bool ignore; bool ignore_blacklisted; bool ignore_not_dirty; /* must be last: */ struct jset j; }; static inline bool journal_replay_ignore(struct journal_replay *i) { return !i || i->ignore_blacklisted || i->ignore_not_dirty; } static inline struct jset_entry *__jset_entry_type_next(struct jset *jset, struct jset_entry *entry, unsigned type) { Loading
fs/bcachefs/recovery.c +4 −3 Original line number Diff line number Diff line Loading @@ -366,7 +366,7 @@ static int journal_replay_early(struct bch_fs *c, genradix_for_each(&c->journal_entries, iter, _i) { i = *_i; if (!i || i->ignore) if (journal_replay_ignore(i)) continue; vstruct_for_each(&i->j, entry) { Loading Loading @@ -868,7 +868,7 @@ int bch2_fs_recovery(struct bch_fs *c) goto out; genradix_for_each_reverse(&c->journal_entries, iter, i) if (*i && !(*i)->ignore) { if (!journal_replay_ignore(*i)) { last_journal_entry = &(*i)->j; break; } Loading @@ -893,7 +893,8 @@ int bch2_fs_recovery(struct bch_fs *c) genradix_for_each_reverse(&c->journal_entries, iter, i) if (*i) { last_journal_entry = &(*i)->j; (*i)->ignore = false; (*i)->ignore_blacklisted = false; (*i)->ignore_not_dirty= false; /* * This was probably a NO_FLUSH entry, * so last_seq was garbage - but we know Loading