xfs_iext_max() returns the maximum number of extents possible for either data fork or attribute fork. This helper will be extended further in a future commit when maximum extent counts associated with data/attribute forks are increased. No functional changes have been made. Signed-off-by: Chandan Babu R <chandanrlinux@xxxxxxxxx> --- libxfs/xfs_bmap.c | 9 ++++----- libxfs/xfs_inode_buf.c | 9 ++++----- libxfs/xfs_inode_fork.h | 10 ++++++++++ repair/dinode.c | 23 ++++++++++++++--------- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 11f3f5f9..dae4d339 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -67,13 +67,12 @@ xfs_bmap_compute_maxlevels( * for both ATTR1 and ATTR2 we have to assume the worst case scenario * of a minimum size available. */ - if (whichfork == XFS_DATA_FORK) { - maxleafents = MAXEXTNUM; + maxleafents = xfs_iext_max(&mp->m_sb, whichfork); + if (whichfork == XFS_DATA_FORK) sz = XFS_BMDR_SPACE_CALC(MINDBTPTRS); - } else { - maxleafents = MAXAEXTNUM; + else sz = XFS_BMDR_SPACE_CALC(MINABTPTRS); - } + maxrootrecs = xfs_bmdr_maxrecs(sz, 0); minleafrecs = mp->m_bmap_dmnr[0]; minnoderecs = mp->m_bmap_dmnr[1]; diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index b65cd0b1..ae71a19e 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -363,6 +363,8 @@ xfs_dinode_verify_fork( int whichfork) { uint32_t di_nextents = XFS_DFORK_NEXTENTS(dip, whichfork); + xfs_extnum_t max_extents; + switch (XFS_DFORK_FORMAT(dip, whichfork)) { case XFS_DINODE_FMT_LOCAL: @@ -384,12 +386,9 @@ xfs_dinode_verify_fork( return __this_address; break; case XFS_DINODE_FMT_BTREE: - if (whichfork == XFS_ATTR_FORK) { - if (di_nextents > MAXAEXTNUM) - return __this_address; - } else if (di_nextents > MAXEXTNUM) { + max_extents = xfs_iext_max(&mp->m_sb, whichfork); + if (di_nextents > max_extents) return __this_address; - } break; default: return __this_address; diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index 668ee942..e318dfdd 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -86,6 +86,16 @@ struct xfs_ifork { (XFS_IFORK_FORMAT((ip), (w)) == XFS_DINODE_FMT_EXTENTS || \ XFS_IFORK_FORMAT((ip), (w)) == XFS_DINODE_FMT_BTREE) +static inline xfs_extnum_t xfs_iext_max(struct xfs_sb *sbp, int whichfork) +{ + ASSERT(whichfork == XFS_DATA_FORK || whichfork == XFS_ATTR_FORK); + + if (whichfork == XFS_DATA_FORK) + return MAXEXTNUM; + else + return MAXAEXTNUM; +} + struct xfs_ifork *xfs_iext_state_to_fork(struct xfs_inode *ip, int state); int xfs_iformat_fork(struct xfs_inode *, struct xfs_dinode *); diff --git a/repair/dinode.c b/repair/dinode.c index 526ecde3..de9a3286 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1727,13 +1727,16 @@ _("bad attr fork offset %d in inode %" PRIu64 ", max=%zu\n"), */ static int process_inode_blocks_and_extents( - xfs_dinode_t *dino, - xfs_rfsblock_t nblocks, - uint64_t nextents, - uint64_t anextents, - xfs_ino_t lino, - int *dirty) + struct xfs_mount *mp, + xfs_dinode_t *dino, + xfs_rfsblock_t nblocks, + uint64_t nextents, + uint64_t anextents, + xfs_ino_t lino, + int *dirty) { + xfs_extnum_t max_extents; + if (nblocks != be64_to_cpu(dino->di_nblocks)) { if (!no_modify) { do_warn( @@ -1750,7 +1753,8 @@ _("bad nblocks %llu for inode %" PRIu64 ", would reset to %" PRIu64 "\n"), } } - if (nextents > MAXEXTNUM) { + max_extents = xfs_iext_max(&mp->m_sb, XFS_DATA_FORK); + if (nextents > max_extents) { do_warn( _("too many data fork extents (%" PRIu64 ") in inode %" PRIu64 "\n"), nextents, lino); @@ -1773,7 +1777,8 @@ _("bad nextents %d for inode %" PRIu64 ", would reset to %" PRIu64 "\n"), } } - if (anextents > MAXAEXTNUM) { + max_extents = xfs_iext_max(&mp->m_sb, XFS_ATTR_FORK); + if (anextents > max_extents) { do_warn( _("too many attr fork extents (%" PRIu64 ") in inode %" PRIu64 "\n"), anextents, lino); @@ -2712,7 +2717,7 @@ _("Bad CoW extent size %u on inode %" PRIu64 ", "), /* * correct space counters if required */ - if (process_inode_blocks_and_extents(dino, totblocks + atotblocks, + if (process_inode_blocks_and_extents(mp, dino, totblocks + atotblocks, nextents, anextents, lino, dirty) != 0) goto clear_bad_out; -- 2.28.0