X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Frecovery.h;h=852d30567da9c4079c2f42a71b00e2d5de2c03e0;hb=326d7c1b3b8ff8e0bd1dda46ad83a5bf27080e21;hp=c61b55f5406ca90104fdc590f3ff18304f07fcc4;hpb=b485aae1bac95e3b5be235116e2bc43da85906c5;p=bcachefs-tools-debian diff --git a/libbcachefs/recovery.h b/libbcachefs/recovery.h index c61b55f..852d305 100644 --- a/libbcachefs/recovery.h +++ b/libbcachefs/recovery.h @@ -1,21 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #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); + + 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; + } +} + +u64 bch2_fsck_recovery_passes(void); int bch2_fs_recovery(struct bch_fs *); int bch2_fs_initialize(struct bch_fs *);