From: Darrick J. Wong Date: Thu, 27 Feb 2020 19:22:19 +0000 (-0500) Subject: xfs_repair: refactor attr root block pointer check X-Git-Tag: v5.5.0-rc1~48 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=97282ffbacc11629b872927c4efe094991185d3b;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: refactor attr root block pointer check In process_longform_attr, replace the agcount check with a call to the fsblock verification function in libxfs. Now we can also catch blocks that point to static FS metadata. Signed-off-by: Darrick J. Wong Reviewed-by: Allison Collins [sandeen: update error message] Reviewed-by: Christoph Hellwig Signed-off-by: Eric Sandeen --- diff --git a/repair/attr_repair.c b/repair/attr_repair.c index 9a44f6104..c038a5a34 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -980,21 +980,21 @@ process_longform_attr( *repair = 0; bno = blkmap_get(blkmap, 0); - - if ( bno == NULLFSBLOCK ) { + if (bno == NULLFSBLOCK) { if (dip->di_aformat == XFS_DINODE_FMT_EXTENTS && be16_to_cpu(dip->di_anextents) == 0) return(0); /* the kernel can handle this state */ do_warn( _("block 0 of inode %" PRIu64 " attribute fork is missing\n"), ino); - return(1); + return 1; } + /* FIX FOR bug 653709 -- EKN */ - if (mp->m_sb.sb_agcount < XFS_FSB_TO_AGNO(mp, bno)) { + if (!xfs_verify_fsbno(mp, bno)) { do_warn( - _("agno of attribute fork of inode %" PRIu64 " out of regular partition\n"), ino); - return(1); + _("block in attribute fork of inode %" PRIu64 " is not valid\n"), ino); + return 1; } bp = libxfs_readbuf(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno),