]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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 c7b2579a8e73c1905ef29d79c573b74edfe4a9bd..d32152fc8a6c56bae799c8999e1862210659cd0b 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 895c232d63b7dcfd9c2c9ec56ed3230b45090a1a..3306fc42cfad40b004bce74114deb2eae4164620 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 596a02b8efdc04c15a9e31d1f62a6577d68bde0b..9b5287a0e8ba9ca357db482066fd8328feaeb9ae 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 56d374675fd54424fe7c0c409247c6d6c8eb8427..b4d8c318be3cef2c8c7750942f87883b4d5a00ba 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 58a037bfac2251404e92d740776e626bd0aa0b00..0ad025e7f3cf512b66cdf3c16a0c8ec4b17b6a76 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 */