aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-06-03 19:10:12 -0400
committerDarrick J. Wong <darrick.wong@oracle.com>2018-06-04 21:25:05 -0400
commit85ae01098c1a6a8e3ce908f8808f2d8f8effdbe3 (patch)
tree9a5fdf57b2af55ce2025110963db9432ac4f11c7
parente63a1008ee08334ea6a9c9edb59b1d2763f5b231 (diff)
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>
-rw-r--r--fs/xfs/libxfs/xfs_btree.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c
index 3fcddfeaa662..4f83d7949a21 100644
--- a/fs/xfs/libxfs/xfs_btree.c
+++ b/fs/xfs/libxfs/xfs_btree.c
@@ -246,16 +246,25 @@ xfs_btree_check_ptr(
246 int level) 246 int level)
247{ 247{
248 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { 248 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
249 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, 249 if (xfs_btree_check_lptr(cur, be64_to_cpu((&ptr->l)[index]),
250 xfs_btree_check_lptr(cur, 250 level))
251 be64_to_cpu((&ptr->l)[index]), level)); 251 return 0;
252 xfs_err(cur->bc_mp,
253"Inode %llu fork %d: Corrupt btree %d pointer at level %d index %d.",
254 cur->bc_private.b.ip->i_ino,
255 cur->bc_private.b.whichfork, cur->bc_btnum,
256 level, index);
252 } else { 257 } else {
253 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, 258 if (xfs_btree_check_sptr(cur, be32_to_cpu((&ptr->s)[index]),
254 xfs_btree_check_sptr(cur, 259 level))
255 be32_to_cpu((&ptr->s)[index]), level)); 260 return 0;
261 xfs_err(cur->bc_mp,
262"AG %u: Corrupt btree %d pointer at level %d index %d.",
263 cur->bc_private.a.agno, cur->bc_btnum,
264 level, index);
256 } 265 }
257 266
258 return 0; 267 return -EFSCORRUPTED;
259} 268}
260 269
261#ifdef DEBUG 270#ifdef DEBUG