xfs: Introduce xfs_iext_max_nextents() helper
authorChandan Babu R <chandan.babu@oracle.com>
Thu, 27 Aug 2020 09:39:10 +0000 (15:09 +0530)
committerChandan Babu R <chandan.babu@oracle.com>
Mon, 11 Apr 2022 04:11:17 +0000 (04:11 +0000)
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>
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/libxfs/xfs_inode_fork.c
fs/xfs/libxfs/xfs_inode_fork.h

index 00b8e6e..a713bc7 100644 (file)
@@ -74,13 +74,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 87781a5..b1c37a8 100644 (file)
@@ -337,6 +337,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:
@@ -358,12 +359,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 9149f4f..e136c29 100644 (file)
@@ -744,7 +744,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 3d64a3a..2605f7f 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);