mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 09:30:52 +07:00
xfs: precalculate cluster alignment in inodes and blocks
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>
This commit is contained in:
parent
83dcdb4469
commit
c1b4a321ed
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user