xfs: don't assert when on-disk btree pointers are garbage

Don't ASSERT when we encounter bad on-disk btree pointers in the debug
check functions.  Log the error to leave breadcrumbs and let the upper
layers deal with it.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
Darrick J. Wong 2018-06-03 16:10:12 -07:00
parent e63a1008ee
commit 85ae01098c
1 changed files with 16 additions and 7 deletions

View File

@ -246,16 +246,25 @@ xfs_btree_check_ptr(
int level) int level)
{ {
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, if (xfs_btree_check_lptr(cur, be64_to_cpu((&ptr->l)[index]),
xfs_btree_check_lptr(cur, level))
be64_to_cpu((&ptr->l)[index]), level)); return 0;
xfs_err(cur->bc_mp,
"Inode %llu fork %d: Corrupt btree %d pointer at level %d index %d.",
cur->bc_private.b.ip->i_ino,
cur->bc_private.b.whichfork, cur->bc_btnum,
level, index);
} else { } else {
XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, if (xfs_btree_check_sptr(cur, be32_to_cpu((&ptr->s)[index]),
xfs_btree_check_sptr(cur, level))
be32_to_cpu((&ptr->s)[index]), level)); return 0;
xfs_err(cur->bc_mp,
"AG %u: Corrupt btree %d pointer at level %d index %d.",
cur->bc_private.a.agno, cur->bc_btnum,
level, index);
} }
return 0; return -EFSCORRUPTED;
} }
#ifdef DEBUG #ifdef DEBUG