xfs_repair: don't error out on dirs with a single leafn block
PATCH 1/1 xfs_repair: don't error out on dirs with a single leafn block
From: Darrick J. Wong <[email protected]>
In process_node_dir2, we need to distinguish between a directory with a single leafn block (yes, they exist) having no interior da nodes, and a directory with a da tree that incorrectly points to dablk 0. If we happened to fill out any part of the da cursor then we have a da btree with garbage in it; otherwise, we have a single leafn block.
This was found by repair repeatedly rebuilding a directory containing a single leafn block.
--- repair/dir2.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
repair/dir2.c +14 -3
@@ -1247,11 +1247,22 @@ process_node_dir2(return 1 ;/* -* Directories with a root marked XFS_DIR2_LEAFN_MAGIC are corrupt +* Skip directories with a root marked XFS_DIR2_LEAFN_MAGIC. +* +* Be careful here: If any level of the da cursor was filled out then +* the directory has a da btree containing an invalid before pointer to +* dblock 0, and we should move on to rebuilding the directory. If no +* levels in the da cursor got filled out, then we just have a single +* leafn block and we're done. */ if (bno ==0 ) { -err_release_da_cursor (mp, &da_cursor,0 ); -return 1 ; +if (da_cursor.active >0 ) { +err_release_da_cursor (mp, &da_cursor,0 ); +return 1 ; + }else { +release_da_cursor (mp, &da_cursor,0 ); +return 0 ; + } }else {/* * Now pass cursor and bno into leaf-block processing routine.
Quoted 8 lines · Darrick J. Wong
From: Darrick J. Wong <[email protected]>
In
process_node_dir2, we need to distinguish between a directory with a single leafn block (yes, they exist) having no interior da nodes, and a directory with a da tree that incorrectly points to dablk 0. If we happened to fill out any part of the da cursor then we have a da btree with garbage in it; otherwise, we have a single leafn block.
Quoted 6 lines
This was found by repair repeatedly rebuilding a directory containing a single leafn block.
Fixes 67a79e2cc932 ("xfs_repair: treat zero da btree pointers as corruption")Reported-by Dave Chinner <[email protected]>Signed-off-by Darrick J. Wong <[email protected]>
I'm inclined to apply Dave's revert for 4.19, and after review, add this fix for 4.20 for more soak. Thoughts?
Quoted 35 lines
--- repair/dir2.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)repair/dir2.c +14
-3@@ -1247,11 +1247,22 @@ process_node_dir2(return 1 ;/* -* Directories with a root marked XFS_DIR2_LEAFN_MAGIC are corrupt +* Skip directories with a root marked XFS_DIR2_LEAFN_MAGIC. +* +* Be careful here: If any level of the da cursor was filled out then +* the directory has a da btree containing an invalid before pointer to +* dblock 0, and we should move on to rebuilding the directory. If no +* levels in the da cursor got filled out, then we just have a single +* leafn block and we're done. */ if (bno ==0 ) { -err_release_da_cursor (mp, &da_cursor,0 ); -return 1 ; +if (da_cursor.active >0 ) { +err_release_da_cursor (mp, &da_cursor,0 ); +return 1 ; + }else { +release_da_cursor (mp, &da_cursor,0 ); +return 0 ; + } }else {/* * Now pass cursor and bno into leaf-block processing routine.