]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/recovery.h
Update bcachefs sources to 2a6125decb43 bcachefs: bch_sb_field_downgrade
[bcachefs-tools-debian] / libbcachefs / recovery.h
index e5565e4f335a535d27e960ab35571b21ca07171d..4e9d24719b2e85c356fa88a0bd3923c3a2ff30cc 100644 (file)
@@ -2,55 +2,37 @@
 #ifndef _BCACHEFS_RECOVERY_H
 #define _BCACHEFS_RECOVERY_H
 
-#define for_each_journal_key(keys, i)                          \
-       for (i = (keys).d; i < (keys).d + (keys).nr; (i)++)
+extern const char * const bch2_recovery_passes[];
 
-struct journal_iter {
-       struct list_head        list;
-       enum btree_id           btree_id;
-       unsigned                level;
-       size_t                  idx;
-       struct journal_keys     *keys;
-};
+u64 bch2_recovery_passes_to_stable(u64 v);
+u64 bch2_recovery_passes_from_stable(u64 v);
 
 /*
- * 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            *b;
-       struct btree_node_iter  node_iter;
-       struct bkey             unpacked;
-
-       struct journal_iter     journal;
-
-       enum last_key_returned {
-               none,
-               btree,
-               journal,
-       }                       last;
-};
-
-int bch2_journal_key_insert(struct bch_fs *, enum btree_id,
-                           unsigned, struct bkey_i *);
-int bch2_journal_key_delete(struct bch_fs *, enum btree_id,
-                           unsigned, struct bpos);
-
-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_exit(struct btree_and_journal_iter *);
-void bch2_btree_and_journal_iter_init_node_iter(struct btree_and_journal_iter *,
-                                               struct bch_fs *,
-                                               struct btree *);
-
-typedef int (*btree_walk_key_fn)(struct bch_fs *c, struct bkey_s_c k);
-
-int bch2_btree_and_journal_walk(struct bch_fs *, enum btree_id, btree_walk_key_fn);
-
-void bch2_journal_keys_free(struct journal_keys *);
-void bch2_journal_entries_free(struct list_head *);
+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 *);