[XFS] Fix a problem in aligning inode allocations to stripe unit
boundaries. SGI-PV: 951862 SGI-Modid: xfs-linux-melb:xfs-kern:25726a Signed-off-by: Nathan Scott <nathans@sgi.com>
This commit is contained in:
parent
8c0b5113a5
commit
019ff2d57b
|
@ -158,9 +158,10 @@ xfs_ialloc_ag_alloc(
|
||||||
*/
|
*/
|
||||||
agi = XFS_BUF_TO_AGI(agbp);
|
agi = XFS_BUF_TO_AGI(agbp);
|
||||||
newino = be32_to_cpu(agi->agi_newino);
|
newino = be32_to_cpu(agi->agi_newino);
|
||||||
if(likely(newino != NULLAGINO)) {
|
args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) +
|
||||||
args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) +
|
XFS_IALLOC_BLOCKS(args.mp);
|
||||||
XFS_IALLOC_BLOCKS(args.mp);
|
if (likely(newino != NULLAGINO &&
|
||||||
|
(args.agbno < be32_to_cpu(agi->agi_length)))) {
|
||||||
args.fsbno = XFS_AGB_TO_FSB(args.mp,
|
args.fsbno = XFS_AGB_TO_FSB(args.mp,
|
||||||
be32_to_cpu(agi->agi_seqno), args.agbno);
|
be32_to_cpu(agi->agi_seqno), args.agbno);
|
||||||
args.type = XFS_ALLOCTYPE_THIS_BNO;
|
args.type = XFS_ALLOCTYPE_THIS_BNO;
|
||||||
|
@ -182,8 +183,8 @@ xfs_ialloc_ag_alloc(
|
||||||
* Set the alignment for the allocation.
|
* Set the alignment for the allocation.
|
||||||
* If stripe alignment is turned on then align at stripe unit
|
* If stripe alignment is turned on then align at stripe unit
|
||||||
* boundary.
|
* boundary.
|
||||||
* If the cluster size is smaller than a filesystem block
|
* If the cluster size is smaller than a filesystem block
|
||||||
* then we're doing I/O for inodes in filesystem block size
|
* then we're doing I/O for inodes in filesystem block size
|
||||||
* pieces, so don't need alignment anyway.
|
* pieces, so don't need alignment anyway.
|
||||||
*/
|
*/
|
||||||
isaligned = 0;
|
isaligned = 0;
|
||||||
|
@ -192,7 +193,7 @@ xfs_ialloc_ag_alloc(
|
||||||
args.alignment = args.mp->m_dalign;
|
args.alignment = args.mp->m_dalign;
|
||||||
isaligned = 1;
|
isaligned = 1;
|
||||||
} else if (XFS_SB_VERSION_HASALIGN(&args.mp->m_sb) &&
|
} else if (XFS_SB_VERSION_HASALIGN(&args.mp->m_sb) &&
|
||||||
args.mp->m_sb.sb_inoalignmt >=
|
args.mp->m_sb.sb_inoalignmt >=
|
||||||
XFS_B_TO_FSBT(args.mp,
|
XFS_B_TO_FSBT(args.mp,
|
||||||
XFS_INODE_CLUSTER_SIZE(args.mp)))
|
XFS_INODE_CLUSTER_SIZE(args.mp)))
|
||||||
args.alignment = args.mp->m_sb.sb_inoalignmt;
|
args.alignment = args.mp->m_sb.sb_inoalignmt;
|
||||||
|
@ -220,7 +221,7 @@ xfs_ialloc_ag_alloc(
|
||||||
if ((error = xfs_alloc_vextent(&args)))
|
if ((error = xfs_alloc_vextent(&args)))
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If stripe alignment is turned on, then try again with cluster
|
* If stripe alignment is turned on, then try again with cluster
|
||||||
* alignment.
|
* alignment.
|
||||||
|
|
Loading…
Reference in New Issue