]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: Introduce xfs_iext_max_nextents() helper
authorChandan Babu R <chandan.babu@oracle.com>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 22 Jun 2022 19:28:52 +0000 (14:28 -0500)
Source kernel commit: 9feb8f19665c8ba051c6a81aa7897149e7748e1e

xfs_iext_max_nextents() returns the maximum number of extents possible for one
of data, cow or attribute fork. This helper will be extended further in a
future commit when maximum extent counts associated with data/attribute forks
are increased.

Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_bmap.c
libxfs/xfs_inode_buf.c
libxfs/xfs_inode_fork.c
libxfs/xfs_inode_fork.h
repair/dinode.c

index e4386f04d451fd3272f63a75b56fea1ea01218de..3891de8e86a27822d7452ae304f9fd9487017f8d 100644 (file)
@@ -67,13 +67,12 @@ xfs_bmap_compute_maxlevels(
         * 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_nextents(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];
index 28662aa71a3d33427b9ae61ffd8d262bf6499a40..12c117c902cc74c0f7be90c7a6469aff1fa1221a 100644 (file)
@@ -334,6 +334,7 @@ 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:
@@ -355,12 +356,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_nextents(whichfork);
+               if (di_nextents > max_extents)
                        return __this_address;
-               }
                break;
        default:
                return __this_address;
index d6ac13eea764ac0a3e824a97abc5b205f6637383..625d81733f30bcd93fca1a1b50a5fa6b1dbd1d7e 100644 (file)
@@ -742,7 +742,7 @@ xfs_iext_count_may_overflow(
        if (whichfork == XFS_COW_FORK)
                return 0;
 
-       max_exts = (whichfork == XFS_ATTR_FORK) ? MAXAEXTNUM : MAXEXTNUM;
+       max_exts = xfs_iext_max_nextents(whichfork);
 
        if (XFS_TEST_ERROR(false, ip->i_mount, XFS_ERRTAG_REDUCE_MAX_IEXTENTS))
                max_exts = 10;
index 3d64a3acb0edc07ed7ce3503af74bef0e168f977..2605f7ff8fc119a161c7f8465816f7ca6a0261dc 100644 (file)
@@ -133,6 +133,14 @@ static inline int8_t xfs_ifork_format(struct xfs_ifork *ifp)
        return ifp->if_format;
 }
 
+static inline xfs_extnum_t xfs_iext_max_nextents(int whichfork)
+{
+       if (whichfork == XFS_DATA_FORK || whichfork == XFS_COW_FORK)
+               return MAXEXTNUM;
+
+       return MAXAEXTNUM;
+}
+
 struct xfs_ifork *xfs_ifork_alloc(enum xfs_dinode_fmt format,
                                xfs_extnum_t nextents);
 struct xfs_ifork *xfs_iext_state_to_fork(struct xfs_inode *ip, int state);
index 8ea919698d149d236c15f326f207a0fbf0af8bec..7cb80af2dc3ce895b75de87bc821d4ec6f4fe1d0 100644 (file)
@@ -1806,7 +1806,7 @@ _("bad nblocks %llu for inode %" PRIu64 ", would reset to %" PRIu64 "\n"),
                }
        }
 
-       if (nextents > MAXEXTNUM)  {
+       if (nextents > xfs_iext_max_nextents(XFS_DATA_FORK))  {
                do_warn(
 _("too many data fork extents (%" PRIu64 ") in inode %" PRIu64 "\n"),
                        nextents, lino);
@@ -1829,7 +1829,7 @@ _("bad nextents %d for inode %" PRIu64 ", would reset to %" PRIu64 "\n"),
                }
        }
 
-       if (anextents > MAXAEXTNUM)  {
+       if (anextents > xfs_iext_max_nextents(XFS_ATTR_FORK))  {
                do_warn(
 _("too many attr fork extents (%" PRIu64 ") in inode %" PRIu64 "\n"),
                        anextents, lino);