1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _BCACHEFS_RECOVERY_PASSES_TYPES_H
3  #define _BCACHEFS_RECOVERY_PASSES_TYPES_H
4  
5  #define PASS_SILENT		BIT(0)
6  #define PASS_FSCK		BIT(1)
7  #define PASS_UNCLEAN		BIT(2)
8  #define PASS_ALWAYS		BIT(3)
9  #define PASS_ONLINE		BIT(4)
10  
11  /*
12   * Passes may be reordered, but the second field is a persistent identifier and
13   * must never change:
14   */
15  #define BCH_RECOVERY_PASSES()							\
16  	x(recovery_pass_empty,			41, PASS_SILENT)		\
17  	x(scan_for_btree_nodes,			37, 0)				\
18  	x(check_topology,			 4, 0)				\
19  	x(accounting_read,			39, PASS_ALWAYS)		\
20  	x(alloc_read,				 0, PASS_ALWAYS)		\
21  	x(stripes_read,				 1, PASS_ALWAYS)		\
22  	x(initialize_subvolumes,		 2, 0)				\
23  	x(snapshots_read,			 3, PASS_ALWAYS)		\
24  	x(check_allocations,			 5, PASS_FSCK)			\
25  	x(trans_mark_dev_sbs,			 6, PASS_ALWAYS|PASS_SILENT)	\
26  	x(fs_journal_alloc,			 7, PASS_ALWAYS|PASS_SILENT)	\
27  	x(set_may_go_rw,			 8, PASS_ALWAYS|PASS_SILENT)	\
28  	x(journal_replay,			 9, PASS_ALWAYS)		\
29  	x(check_alloc_info,			10, PASS_ONLINE|PASS_FSCK)	\
30  	x(check_lrus,				11, PASS_ONLINE|PASS_FSCK)	\
31  	x(check_btree_backpointers,		12, PASS_ONLINE|PASS_FSCK)	\
32  	x(check_backpointers_to_extents,	13, PASS_ONLINE|PASS_FSCK)	\
33  	x(check_extents_to_backpointers,	14, PASS_ONLINE|PASS_FSCK)	\
34  	x(check_alloc_to_lru_refs,		15, PASS_ONLINE|PASS_FSCK)	\
35  	x(fs_freespace_init,			16, PASS_ALWAYS|PASS_SILENT)	\
36  	x(bucket_gens_init,			17, 0)				\
37  	x(reconstruct_snapshots,		38, 0)				\
38  	x(check_snapshot_trees,			18, PASS_ONLINE|PASS_FSCK)	\
39  	x(check_snapshots,			19, PASS_ONLINE|PASS_FSCK)	\
40  	x(check_subvols,			20, PASS_ONLINE|PASS_FSCK)	\
41  	x(check_subvol_children,		35, PASS_ONLINE|PASS_FSCK)	\
42  	x(delete_dead_snapshots,		21, PASS_ONLINE|PASS_FSCK)	\
43  	x(fs_upgrade_for_subvolumes,		22, 0)				\
44  	x(check_inodes,				24, PASS_FSCK)			\
45  	x(check_extents,			25, PASS_FSCK)			\
46  	x(check_indirect_extents,		26, PASS_FSCK)			\
47  	x(check_dirents,			27, PASS_FSCK)			\
48  	x(check_xattrs,				28, PASS_FSCK)			\
49  	x(check_root,				29, PASS_ONLINE|PASS_FSCK)	\
50  	x(check_unreachable_inodes,		40, PASS_ONLINE|PASS_FSCK)	\
51  	x(check_subvolume_structure,		36, PASS_ONLINE|PASS_FSCK)	\
52  	x(check_directory_structure,		30, PASS_ONLINE|PASS_FSCK)	\
53  	x(check_nlinks,				31, PASS_FSCK)			\
54  	x(resume_logged_ops,			23, PASS_ALWAYS)		\
55  	x(delete_dead_inodes,			32, PASS_ALWAYS)		\
56  	x(fix_reflink_p,			33, 0)				\
57  	x(set_fs_needs_rebalance,		34, 0)				\
58  
59  /* We normally enumerate recovery passes in the order we run them: */
60  enum bch_recovery_pass {
61  #define x(n, id, when)	BCH_RECOVERY_PASS_##n,
62  	BCH_RECOVERY_PASSES()
63  #undef x
64  	BCH_RECOVERY_PASS_NR
65  };
66  
67  /* But we also need stable identifiers that can be used in the superblock */
68  enum bch_recovery_pass_stable {
69  #define x(n, id, when)	BCH_RECOVERY_PASS_STABLE_##n = id,
70  	BCH_RECOVERY_PASSES()
71  #undef x
72  };
73  
74  #endif /* _BCACHEFS_RECOVERY_PASSES_TYPES_H */
75