diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2018-06-03 19:10:12 -0400 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2018-06-04 21:25:05 -0400 |
commit | 85ae01098c1a6a8e3ce908f8808f2d8f8effdbe3 (patch) | |
tree | 9a5fdf57b2af55ce2025110963db9432ac4f11c7 | |
parent | e63a1008ee08334ea6a9c9edb59b1d2763f5b231 (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.c | 23 |
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 |