The backpointers passes, check_backpointers_to_extents() and
check_extents_to_backpointers() are the most expensive fsck passes.

Now that we're running the same check and repair code when using a
backpointer at runtime (via bch2_backpointer_get_key()) that fsck does,
there's no reason fsck needs to - except to verify that the filesystem
really has no errors in debug mode.

Signed-off-by: Kent Overstreet <[email protected]>
---
 fs/bcachefs/recovery_passes_types.h | 92 +++++++++++++++--------------
 fs/bcachefs/sb-errors_format.h      |  4 +-
 2 files changed, 51 insertions(+), 45 deletions(-)

diff --git a/fs/bcachefs/recovery_passes_types.h 
b/fs/bcachefs/recovery_passes_types.h
index 94dc20ca2065..f967b23d50c8 100644
--- a/fs/bcachefs/recovery_passes_types.h
+++ b/fs/bcachefs/recovery_passes_types.h
@@ -8,53 +8,59 @@
 #define PASS_ALWAYS            BIT(3)
 #define PASS_ONLINE            BIT(4)
 
+#ifdef CONFIG_BCACHEFS_DEBUG
+#define PASS_FSCK_DEBUG                BIT(1)
+#else
+#define PASS_FSCK_DEBUG                0
+#endif
+
 /*
  * Passes may be reordered, but the second field is a persistent identifier and
  * must never change:
  */
-#define BCH_RECOVERY_PASSES()                                                  
\
-       x(recovery_pass_empty,                  41, PASS_SILENT)                
\
-       x(scan_for_btree_nodes,                 37, 0)                          
\
-       x(check_topology,                        4, 0)                          
\
-       x(accounting_read,                      39, PASS_ALWAYS)                
\
-       x(alloc_read,                            0, PASS_ALWAYS)                
\
-       x(stripes_read,                          1, PASS_ALWAYS)                
\
-       x(initialize_subvolumes,                 2, 0)                          
\
-       x(snapshots_read,                        3, PASS_ALWAYS)                
\
-       x(check_allocations,                     5, PASS_FSCK)                  
\
-       x(trans_mark_dev_sbs,                    6, PASS_ALWAYS|PASS_SILENT)    
\
-       x(fs_journal_alloc,                      7, PASS_ALWAYS|PASS_SILENT)    
\
-       x(set_may_go_rw,                         8, PASS_ALWAYS|PASS_SILENT)    
\
-       x(journal_replay,                        9, PASS_ALWAYS)                
\
-       x(check_alloc_info,                     10, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_lrus,                           11, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_btree_backpointers,             12, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_backpointers_to_extents,        13, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_extents_to_backpointers,        14, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_alloc_to_lru_refs,              15, PASS_ONLINE|PASS_FSCK)      
\
-       x(fs_freespace_init,                    16, PASS_ALWAYS|PASS_SILENT)    
\
-       x(bucket_gens_init,                     17, 0)                          
\
-       x(reconstruct_snapshots,                38, 0)                          
\
-       x(check_snapshot_trees,                 18, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_snapshots,                      19, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_subvols,                        20, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_subvol_children,                35, PASS_ONLINE|PASS_FSCK)      
\
-       x(delete_dead_snapshots,                21, PASS_ONLINE|PASS_FSCK)      
\
-       x(fs_upgrade_for_subvolumes,            22, 0)                          
\
-       x(check_inodes,                         24, PASS_FSCK)                  
\
-       x(check_extents,                        25, PASS_FSCK)                  
\
-       x(check_indirect_extents,               26, PASS_FSCK)                  
\
-       x(check_dirents,                        27, PASS_FSCK)                  
\
-       x(check_xattrs,                         28, PASS_FSCK)                  
\
-       x(check_root,                           29, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_unreachable_inodes,             40, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_subvolume_structure,            36, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_directory_structure,            30, PASS_ONLINE|PASS_FSCK)      
\
-       x(check_nlinks,                         31, PASS_FSCK)                  
\
-       x(resume_logged_ops,                    23, PASS_ALWAYS)                
\
-       x(delete_dead_inodes,                   32, PASS_ALWAYS)                
\
-       x(fix_reflink_p,                        33, 0)                          
\
-       x(set_fs_needs_rebalance,               34, 0)                          
\
+#define BCH_RECOVERY_PASSES()                                                  
        \
+       x(recovery_pass_empty,                  41, PASS_SILENT)                
        \
+       x(scan_for_btree_nodes,                 37, 0)                          
        \
+       x(check_topology,                        4, 0)                          
        \
+       x(accounting_read,                      39, PASS_ALWAYS)                
        \
+       x(alloc_read,                            0, PASS_ALWAYS)                
        \
+       x(stripes_read,                          1, PASS_ALWAYS)                
        \
+       x(initialize_subvolumes,                 2, 0)                          
        \
+       x(snapshots_read,                        3, PASS_ALWAYS)                
        \
+       x(check_allocations,                     5, PASS_FSCK)                  
        \
+       x(trans_mark_dev_sbs,                    6, PASS_ALWAYS|PASS_SILENT)    
        \
+       x(fs_journal_alloc,                      7, PASS_ALWAYS|PASS_SILENT)    
        \
+       x(set_may_go_rw,                         8, PASS_ALWAYS|PASS_SILENT)    
        \
+       x(journal_replay,                        9, PASS_ALWAYS)                
        \
+       x(check_alloc_info,                     10, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_lrus,                           11, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_btree_backpointers,             12, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_backpointers_to_extents,        13, 
PASS_ONLINE|PASS_FSCK_DEBUG)        \
+       x(check_extents_to_backpointers,        14, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_alloc_to_lru_refs,              15, PASS_ONLINE|PASS_FSCK)      
        \
+       x(fs_freespace_init,                    16, PASS_ALWAYS|PASS_SILENT)    
        \
+       x(bucket_gens_init,                     17, 0)                          
        \
+       x(reconstruct_snapshots,                38, 0)                          
        \
+       x(check_snapshot_trees,                 18, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_snapshots,                      19, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_subvols,                        20, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_subvol_children,                35, PASS_ONLINE|PASS_FSCK)      
        \
+       x(delete_dead_snapshots,                21, PASS_ONLINE|PASS_FSCK)      
        \
+       x(fs_upgrade_for_subvolumes,            22, 0)                          
        \
+       x(check_inodes,                         24, PASS_FSCK)                  
        \
+       x(check_extents,                        25, PASS_FSCK)                  
        \
+       x(check_indirect_extents,               26, PASS_FSCK)                  
        \
+       x(check_dirents,                        27, PASS_FSCK)                  
        \
+       x(check_xattrs,                         28, PASS_FSCK)                  
        \
+       x(check_root,                           29, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_unreachable_inodes,             40, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_subvolume_structure,            36, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_directory_structure,            30, PASS_ONLINE|PASS_FSCK)      
        \
+       x(check_nlinks,                         31, PASS_FSCK)                  
        \
+       x(resume_logged_ops,                    23, PASS_ALWAYS)                
        \
+       x(delete_dead_inodes,                   32, PASS_ALWAYS)                
        \
+       x(fix_reflink_p,                        33, 0)                          
        \
+       x(set_fs_needs_rebalance,               34, 0)
 
 /* We normally enumerate recovery passes in the order we run them: */
 enum bch_recovery_pass {
diff --git a/fs/bcachefs/sb-errors_format.h b/fs/bcachefs/sb-errors_format.h
index 3bbda181f314..4248ff3c894a 100644
--- a/fs/bcachefs/sb-errors_format.h
+++ b/fs/bcachefs/sb-errors_format.h
@@ -140,8 +140,8 @@ enum bch_fsck_flags {
        x(backpointer_bucket_offset_wrong,                      125,    0)      
        \
        x(backpointer_level_bad,                                294,    0)      
        \
        x(backpointer_dev_bad,                                  297,    0)      
        \
-       x(backpointer_to_missing_device,                        126,    0)      
        \
-       x(backpointer_to_missing_alloc,                         127,    0)      
        \
+       x(backpointer_to_missing_device,                        126,    
FSCK_AUTOFIX)   \
+       x(backpointer_to_missing_alloc,                         127,    
FSCK_AUTOFIX)   \
        x(backpointer_to_missing_ptr,                           128,    
FSCK_AUTOFIX)   \
        x(lru_entry_at_time_0,                                  129,    
FSCK_AUTOFIX)   \
        x(lru_entry_to_invalid_bucket,                          130,    
FSCK_AUTOFIX)   \
-- 
2.45.2


Reply via email to