X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Frecovery.h;h=175a21a0bf26dfdfc759b1cbbb907ea4a47626fe;hb=e962ffb76959b40016b8b26e366bcb30f4a40bdb;hp=fa1f2818817d4b10cfd305275c554a773fa92c42;hpb=8bcd38555cb224b7da722bcdeca5c2d15f3ef284;p=bcachefs-tools-debian diff --git a/libbcachefs/recovery.h b/libbcachefs/recovery.h index fa1f281..175a21a 100644 --- a/libbcachefs/recovery.h +++ b/libbcachefs/recovery.h @@ -2,59 +2,34 @@ #ifndef _BCACHEFS_RECOVERY_H #define _BCACHEFS_RECOVERY_H -struct journal_keys { - struct journal_key { - enum btree_id btree_id:8; - unsigned level:8; - struct bkey_i *k; - u32 journal_seq; - u32 journal_offset; - } *d; - size_t nr; - u64 journal_seq_base; -}; - -#define for_each_journal_key(keys, i) \ - for (i = (keys).d; i < (keys).d + (keys).nr; (i)++) - -struct journal_iter { - enum btree_id btree_id; - unsigned level; - struct journal_keys *keys; - struct journal_key *k; -}; +extern const char * const bch2_recovery_passes[]; /* - * Iterate over keys in the btree, with keys from the journal overlaid on top: + * For when we need to rewind recovery passes and run a pass we skipped: */ - -struct btree_and_journal_iter { - struct btree_iter *btree; - - struct btree *b; - struct btree_node_iter node_iter; - struct bkey unpacked; - - struct journal_iter journal; - - enum last_key_returned { - none, - btree, - journal, - } last; -}; - -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_next(struct btree_and_journal_iter *); - -void bch2_btree_and_journal_iter_init(struct btree_and_journal_iter *, - struct btree_trans *, - struct journal_keys *, - enum btree_id, struct bpos); -void bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter *, - struct journal_keys *, - struct btree *); +static inline int bch2_run_explicit_recovery_pass(struct bch_fs *c, + enum bch_recovery_pass pass) +{ + if (c->recovery_passes_explicit & BIT_ULL(pass)) + return 0; + + bch_info(c, "running explicit recovery pass %s (%u), currently at %s (%u)", + bch2_recovery_passes[pass], pass, + bch2_recovery_passes[c->curr_recovery_pass], c->curr_recovery_pass); + + c->recovery_passes_explicit |= BIT_ULL(pass); + + if (c->curr_recovery_pass >= pass) { + c->curr_recovery_pass = pass; + c->recovery_passes_complete &= (1ULL << pass) >> 1; + return -BCH_ERR_restart_recovery; + } else { + return 0; + } +} + +int bch2_run_online_recovery_passes(struct bch_fs *); +u64 bch2_fsck_recovery_passes(void); int bch2_fs_recovery(struct bch_fs *); int bch2_fs_initialize(struct bch_fs *);