From: Darrick J. Wong Date: Thu, 28 Jun 2018 20:11:58 +0000 (-0500) Subject: xfs: don't assert when on-disk btree pointers are garbage X-Git-Tag: v4.18.0-rc0~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cf9f8168b6f87d9ea3c559a00ed2cff88a4d40a;p=thirdparty%2Fxfsprogs-dev.git xfs: don't assert when on-disk btree pointers are garbage Source kernel commit: 85ae01098c1a6a8e3ce908f8808f2d8f8effdbe3 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 Reviewed-by: Dave Chinner Signed-off-by: Eric Sandeen --- diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 9829bc88c..4c15a21ad 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -128,6 +128,10 @@ enum ce { CE_DEBUG, CE_CONT, CE_NOTE, CE_WARN, CE_ALERT, CE_PANIC }; #define xfs_notice(mp,fmt,args...) cmn_err(CE_NOTE,fmt, ## args) #define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_err(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_alert_tag(mp,tag,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) + #define xfs_hex_dump(d,n) ((void) 0) #define xfs_force_shutdown(d,n) ((void) 0) @@ -424,10 +428,6 @@ roundup_64(uint64_t x, uint32_t y) }) #define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ -#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) -#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) -#define xfs_alert_tag(mp,tag,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) - #define xfs_sort qsort #define xfs_ilock(ip,mode) ((void) 0) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index b2fac9c8c..5f899f772 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -242,16 +242,25 @@ xfs_btree_check_ptr( int level) { if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, - xfs_btree_check_lptr(cur, - be64_to_cpu((&ptr->l)[index]), level)); + if (xfs_btree_check_lptr(cur, 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 { - XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, - xfs_btree_check_sptr(cur, - be32_to_cpu((&ptr->s)[index]), level)); + if (xfs_btree_check_sptr(cur, 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