X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Frecovery.h;h=852d30567da9c4079c2f42a71b00e2d5de2c03e0;hb=15b24c732749339e3f65f030e7e68624b1b4bfbd;hp=479ea46f8dcb5954acc13d732646aff733b890c0;hpb=08021fd5502873d22ccf51d8590a83c0bb95a8e2;p=bcachefs-tools-debian diff --git a/libbcachefs/recovery.h b/libbcachefs/recovery.h index 479ea46..852d305 100644 --- a/libbcachefs/recovery.h +++ b/libbcachefs/recovery.h @@ -2,32 +2,30 @@ #ifndef _BCACHEFS_RECOVERY_H #define _BCACHEFS_RECOVERY_H -struct journal_keys { - struct journal_key { - enum btree_id btree_id:8; - unsigned allocated:1; - struct bpos pos; - struct bkey_i *k; - u32 journal_seq; - u32 journal_offset; - } *d; - size_t nr; - u64 journal_seq_base; -}; +extern const char * const bch2_recovery_passes[]; -#define for_each_journal_key(keys, i) \ - for (i = (keys).d; i < (keys).d + (keys).nr; (i)++) +/* + * For when we need to rewind recovery passes and run a pass we skipped: + */ +static inline int bch2_run_explicit_recovery_pass(struct bch_fs *c, + enum bch_recovery_pass pass) +{ + 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); -struct journal_iter { - struct journal_keys *keys; - struct journal_key *k; - enum btree_id btree_id; -}; + c->recovery_passes_explicit |= BIT_ULL(pass); -struct journal_iter bch2_journal_iter_init(struct journal_keys *, - enum btree_id); -struct bkey_s_c bch2_journal_iter_peek(struct journal_iter *); -struct bkey_s_c bch2_journal_iter_next(struct journal_iter *); + 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; + } +} + +u64 bch2_fsck_recovery_passes(void); int bch2_fs_recovery(struct bch_fs *); int bch2_fs_initialize(struct bch_fs *);