mirror of
https://github.com/torvalds/linux.git
synced 2024-12-02 09:01:34 +00:00
xfs: create helpers for rtsummary block/wordcount computations
Create helper functions that compute the number of blocks or words necessary to store the rt summary file. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
97e993830a
commit
bd85af280d
@ -1146,3 +1146,32 @@ xfs_rtbitmap_wordcount(
|
||||
blocks = xfs_rtbitmap_blockcount(mp, rtextents);
|
||||
return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
|
||||
}
|
||||
|
||||
/* Compute the number of rtsummary blocks needed to track the given rt space. */
|
||||
xfs_filblks_t
|
||||
xfs_rtsummary_blockcount(
|
||||
struct xfs_mount *mp,
|
||||
unsigned int rsumlevels,
|
||||
xfs_extlen_t rbmblocks)
|
||||
{
|
||||
unsigned long long rsumwords;
|
||||
|
||||
rsumwords = (unsigned long long)rsumlevels * rbmblocks;
|
||||
return XFS_B_TO_FSB(mp, rsumwords << XFS_WORDLOG);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the number of rtsummary info words needed to populate every block of
|
||||
* a summary file that is large enough to track the given rt space.
|
||||
*/
|
||||
unsigned long long
|
||||
xfs_rtsummary_wordcount(
|
||||
struct xfs_mount *mp,
|
||||
unsigned int rsumlevels,
|
||||
xfs_extlen_t rbmblocks)
|
||||
{
|
||||
xfs_filblks_t blocks;
|
||||
|
||||
blocks = xfs_rtsummary_blockcount(mp, rsumlevels, rbmblocks);
|
||||
return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
|
||||
}
|
||||
|
@ -308,6 +308,11 @@ xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t
|
||||
rtextents);
|
||||
unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp,
|
||||
xfs_rtbxlen_t rtextents);
|
||||
|
||||
xfs_filblks_t xfs_rtsummary_blockcount(struct xfs_mount *mp,
|
||||
unsigned int rsumlevels, xfs_extlen_t rbmblocks);
|
||||
unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp,
|
||||
unsigned int rsumlevels, xfs_extlen_t rbmblocks);
|
||||
#else /* CONFIG_XFS_RT */
|
||||
# define xfs_rtfree_extent(t,b,l) (-ENOSYS)
|
||||
# define xfs_rtfree_blocks(t,rb,rl) (-ENOSYS)
|
||||
@ -322,6 +327,8 @@ xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents)
|
||||
return 0;
|
||||
}
|
||||
# define xfs_rtbitmap_wordcount(mp, r) (0)
|
||||
# define xfs_rtsummary_blockcount(mp, l, b) (0)
|
||||
# define xfs_rtsummary_wordcount(mp, l, b) (0)
|
||||
#endif /* CONFIG_XFS_RT */
|
||||
|
||||
#endif /* __XFS_RTBITMAP_H__ */
|
||||
|
@ -1001,8 +1001,7 @@ xfs_growfs_rt(
|
||||
nrbmblocks = xfs_rtbitmap_blockcount(mp, nrextents);
|
||||
nrextslog = xfs_highbit32(nrextents);
|
||||
nrsumlevels = nrextslog + 1;
|
||||
nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks;
|
||||
nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize);
|
||||
nrsumblocks = xfs_rtsummary_blockcount(mp, nrsumlevels, nrbmblocks);
|
||||
nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks);
|
||||
/*
|
||||
* New summary size can't be more than half the size of
|
||||
@ -1063,10 +1062,8 @@ xfs_growfs_rt(
|
||||
ASSERT(nsbp->sb_rextents != 0);
|
||||
nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);
|
||||
nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;
|
||||
nrsumsize =
|
||||
(uint)sizeof(xfs_suminfo_t) * nrsumlevels *
|
||||
nsbp->sb_rbmblocks;
|
||||
nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize);
|
||||
nrsumblocks = xfs_rtsummary_blockcount(mp, nrsumlevels,
|
||||
nsbp->sb_rbmblocks);
|
||||
nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks);
|
||||
/*
|
||||
* Start a transaction, get the log reservation.
|
||||
@ -1272,6 +1269,7 @@ xfs_rtmount_init(
|
||||
struct xfs_buf *bp; /* buffer for last block of subvolume */
|
||||
struct xfs_sb *sbp; /* filesystem superblock copy in mount */
|
||||
xfs_daddr_t d; /* address of last block of subvolume */
|
||||
unsigned int rsumblocks;
|
||||
int error;
|
||||
|
||||
sbp = &mp->m_sb;
|
||||
@ -1283,10 +1281,9 @@ xfs_rtmount_init(
|
||||
return -ENODEV;
|
||||
}
|
||||
mp->m_rsumlevels = sbp->sb_rextslog + 1;
|
||||
mp->m_rsumsize =
|
||||
(uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels *
|
||||
sbp->sb_rbmblocks;
|
||||
mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize);
|
||||
rsumblocks = xfs_rtsummary_blockcount(mp, mp->m_rsumlevels,
|
||||
mp->m_sb.sb_rbmblocks);
|
||||
mp->m_rsumsize = XFS_FSB_TO_B(mp, rsumblocks);
|
||||
mp->m_rbmip = mp->m_rsumip = NULL;
|
||||
/*
|
||||
* Check that the realtime section is an ok size.
|
||||
|
Loading…
Reference in New Issue
Block a user