xfs: precalculate cluster alignment in inodes and blocks
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 12 Dec 2018 16:46:25 +0000 (08:46 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 12 Dec 2018 16:47:17 +0000 (08:47 -0800)
Store the inode cluster alignment information in units of inodes and
blocks in the mount data so that we don't have to keep recalculating
them.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_types.c
fs/xfs/scrub/ialloc.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.h

index c7b2579..d32152f 100644 (file)
@@ -690,7 +690,7 @@ xfs_ialloc_ag_alloc(
                 * but not to use them in the actual exact allocation.
                 */
                args.alignment = 1;
-               args.minalignslop = xfs_ialloc_cluster_alignment(args.mp) - 1;
+               args.minalignslop = args.mp->m_cluster_align - 1;
 
                /* Allow space for the inode btree to split. */
                args.minleft = args.mp->m_in_maxlevels - 1;
@@ -725,7 +725,7 @@ xfs_ialloc_ag_alloc(
                        args.alignment = args.mp->m_dalign;
                        isaligned = 1;
                } else
-                       args.alignment = xfs_ialloc_cluster_alignment(args.mp);
+                       args.alignment = args.mp->m_cluster_align;
                /*
                 * Need to figure out where to allocate the inode blocks.
                 * Ideally they should be spaced out through the a.g.
@@ -754,7 +754,7 @@ xfs_ialloc_ag_alloc(
                args.type = XFS_ALLOCTYPE_NEAR_BNO;
                args.agbno = be32_to_cpu(agi->agi_root);
                args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno);
-               args.alignment = xfs_ialloc_cluster_alignment(args.mp);
+               args.alignment = args.mp->m_cluster_align;
                if ((error = xfs_alloc_vextent(&args)))
                        return error;
        }
@@ -1017,7 +1017,7 @@ xfs_ialloc_ag_select(
                 */
                ineed = mp->m_ialloc_min_blks;
                if (flags && ineed > 1)
-                       ineed += xfs_ialloc_cluster_alignment(mp);
+                       ineed += mp->m_cluster_align;
                longest = pag->pagf_longest;
                if (!longest)
                        longest = pag->pagf_flcount > 0;
index 895c232..3306fc4 100644 (file)
@@ -87,15 +87,14 @@ xfs_agino_range(
         * Calculate the first inode, which will be in the first
         * cluster-aligned block after the AGFL.
         */
-       bno = round_up(XFS_AGFL_BLOCK(mp) + 1,
-                       xfs_ialloc_cluster_alignment(mp));
+       bno = round_up(XFS_AGFL_BLOCK(mp) + 1, mp->m_cluster_align);
        *first = XFS_AGB_TO_AGINO(mp, bno);
 
        /*
         * Calculate the last inode, which will be at the end of the
         * last (aligned) cluster that can be allocated in the AG.
         */
-       bno = round_down(eoag, xfs_ialloc_cluster_alignment(mp));
+       bno = round_down(eoag, mp->m_cluster_align);
        *last = XFS_AGB_TO_AGINO(mp, bno) - 1;
 }
 
index 596a02b..9b5287a 100644 (file)
@@ -300,7 +300,7 @@ xchk_iallocbt_rec(
 
        /* Make sure this record is aligned to cluster and inoalignmnt size. */
        agbno = XFS_AGINO_TO_AGBNO(mp, irec.ir_startino);
-       if ((agbno & (xfs_ialloc_cluster_alignment(mp) - 1)) ||
+       if ((agbno & (mp->m_cluster_align - 1)) ||
            (agbno & (mp->m_blocks_per_cluster - 1)))
                xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
 
index 56d3746..b4d8c31 100644 (file)
@@ -800,6 +800,8 @@ xfs_mountfs(
        }
        mp->m_blocks_per_cluster = xfs_icluster_size_fsb(mp);
        mp->m_inodes_per_cluster = XFS_FSB_TO_INO(mp, mp->m_blocks_per_cluster);
+       mp->m_cluster_align = xfs_ialloc_cluster_alignment(mp);
+       mp->m_cluster_align_inodes = XFS_FSB_TO_INO(mp, mp->m_cluster_align);
 
        /*
         * If enabled, sparse inode chunk alignment is expected to match the
index 58a037b..0ad025e 100644 (file)
@@ -103,6 +103,8 @@ typedef struct xfs_mount {
        uint                    m_inode_cluster_size;/* min inode buf size */
        unsigned int            m_inodes_per_cluster;
        unsigned int            m_blocks_per_cluster;
+       unsigned int            m_cluster_align;
+       unsigned int            m_cluster_align_inodes;
        uint                    m_blockmask;    /* sb_blocksize-1 */
        uint                    m_blockwsize;   /* sb_blocksize in words */
        uint                    m_blockwmask;   /* blockwsize-1 */