return 0;
 }
 
+/*
+ * Check that this AGF/AGI header's sequence number and length matches the AG
+ * number and size in fsblocks.
+ */
+xfs_failaddr_t
+xfs_validate_ag_length(
+       struct xfs_buf          *bp,
+       uint32_t                seqno,
+       uint32_t                length)
+{
+       struct xfs_mount        *mp = bp->b_mount;
+       /*
+        * During growfs operations, the perag is not fully initialised,
+        * so we can't use it for any useful checking. growfs ensures we can't
+        * use it by using uncached buffers that don't have the perag attached
+        * so we can detect and avoid this problem.
+        */
+       if (bp->b_pag && seqno != bp->b_pag->pag_agno)
+               return __this_address;
+
+       /*
+        * Only the last AG in the filesystem is allowed to be shorter
+        * than the AG size recorded in the superblock.
+        */
+       if (length != mp->m_sb.sb_agblocks) {
+               /*
+                * During growfs, the new last AG can get here before we
+                * have updated the superblock. Give it a pass on the seqno
+                * check.
+                */
+               if (bp->b_pag && seqno != mp->m_sb.sb_agcount - 1)
+                       return __this_address;
+               if (length < XFS_MIN_AG_BLOCKS)
+                       return __this_address;
+               if (length > mp->m_sb.sb_agblocks)
+                       return __this_address;
+       }
+
+       return NULL;
+}
+
 /*
  * Verify the AGF is consistent.
  *
 {
        struct xfs_mount        *mp = bp->b_mount;
        struct xfs_agf          *agf = bp->b_addr;
+       xfs_failaddr_t          fa;
+       uint32_t                agf_seqno = be32_to_cpu(agf->agf_seqno);
        uint32_t                agf_length = be32_to_cpu(agf->agf_length);
 
        if (xfs_has_crc(mp)) {
        /*
         * Both agf_seqno and agf_length need to validated before anything else
         * block number related in the AGF or AGFL can be checked.
-        *
-        * During growfs operations, the perag is not fully initialised,
-        * so we can't use it for any useful checking. growfs ensures we can't
-        * use it by using uncached buffers that don't have the perag attached
-        * so we can detect and avoid this problem.
-        */
-       if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno)
-               return __this_address;
-
-       /*
-        * Only the last AGF in the filesytsem is allowed to be shorter
-        * than the AG size recorded in the superblock.
         */
-       if (agf_length != mp->m_sb.sb_agblocks) {
-               /*
-                * During growfs, the new last AGF can get here before we
-                * have updated the superblock. Give it a pass on the seqno
-                * check.
-                */
-               if (bp->b_pag &&
-                   be32_to_cpu(agf->agf_seqno) != mp->m_sb.sb_agcount - 1)
-                       return __this_address;
-               if (agf_length < XFS_MIN_AG_BLOCKS)
-                       return __this_address;
-               if (agf_length > mp->m_sb.sb_agblocks)
-                       return __this_address;
-       }
+       fa = xfs_validate_ag_length(bp, agf_seqno, agf_length);
+       if (fa)
+               return fa;
 
        if (be32_to_cpu(agf->agf_flfirst) >= xfs_agfl_size(mp))
                return __this_address;
 
 
 static xfs_failaddr_t
 xfs_agi_verify(
-       struct xfs_buf  *bp)
+       struct xfs_buf          *bp)
 {
-       struct xfs_mount *mp = bp->b_mount;
-       struct xfs_agi  *agi = bp->b_addr;
-       int             i;
+       struct xfs_mount        *mp = bp->b_mount;
+       struct xfs_agi          *agi = bp->b_addr;
+       xfs_failaddr_t          fa;
+       uint32_t                agi_seqno = be32_to_cpu(agi->agi_seqno);
+       uint32_t                agi_length = be32_to_cpu(agi->agi_length);
+       int                     i;
 
        if (xfs_has_crc(mp)) {
                if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid))
        if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)))
                return __this_address;
 
+       fa = xfs_validate_ag_length(bp, agi_seqno, agi_length);
+       if (fa)
+               return fa;
+
        if (be32_to_cpu(agi->agi_level) < 1 ||
            be32_to_cpu(agi->agi_level) > M_IGEO(mp)->inobt_maxlevels)
                return __this_address;
             be32_to_cpu(agi->agi_free_level) > M_IGEO(mp)->inobt_maxlevels))
                return __this_address;
 
-       /*
-        * during growfs operations, the perag is not fully initialised,
-        * so we can't use it for any useful checking. growfs ensures we can't
-        * use it by using uncached buffers that don't have the perag attached
-        * so we can detect and avoid this problem.
-        */
-       if (bp->b_pag && be32_to_cpu(agi->agi_seqno) != bp->b_pag->pag_agno)
-               return __this_address;
-
        for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) {
                if (agi->agi_unlinked[i] == cpu_to_be32(NULLAGINO))
                        continue;