mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
xfs: factor out a xfs_rtalloc_sumlevel helper
xfs_rtallocate_extent_size has two loops with nearly identical logic in them. Split that logic into a separate xfs_rtalloc_sumlevel helper. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
This commit is contained in:
parent
3c97c9f78d
commit
8ceee72fdb
@ -538,6 +538,52 @@ xfs_rtallocate_extent_near(
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
static int
|
||||
xfs_rtalloc_sumlevel(
|
||||
struct xfs_rtalloc_args *args,
|
||||
int l, /* level number */
|
||||
xfs_rtxlen_t minlen, /* minimum length to allocate */
|
||||
xfs_rtxlen_t maxlen, /* maximum length to allocate */
|
||||
xfs_rtxlen_t prod, /* extent product factor */
|
||||
xfs_rtxlen_t *len, /* out: actual length allocated */
|
||||
xfs_rtxnum_t *rtx) /* out: start rtext allocated */
|
||||
{
|
||||
xfs_fileoff_t i; /* bitmap block number */
|
||||
|
||||
for (i = 0; i < args->mp->m_sb.sb_rbmblocks; i++) {
|
||||
xfs_suminfo_t sum; /* summary information for extents */
|
||||
xfs_rtxnum_t n; /* next rtext to be tried */
|
||||
int error;
|
||||
|
||||
error = xfs_rtget_summary(args, l, i, &sum);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* Nothing there, on to the next block.
|
||||
*/
|
||||
if (!sum)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Try allocating the extent.
|
||||
*/
|
||||
error = xfs_rtallocate_extent_block(args, i, minlen, maxlen,
|
||||
len, &n, prod, rtx);
|
||||
if (error != -ENOSPC)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* If the "next block to try" returned from the allocator is
|
||||
* beyond the next bitmap block, skip to that bitmap block.
|
||||
*/
|
||||
if (xfs_rtx_to_rbmblock(args->mp, n) > i + 1)
|
||||
i = xfs_rtx_to_rbmblock(args->mp, n) - 1;
|
||||
}
|
||||
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate an extent of length minlen<=len<=maxlen, with no position
|
||||
* specified. If we don't get maxlen then use prod to trim
|
||||
@ -552,12 +598,8 @@ xfs_rtallocate_extent_size(
|
||||
xfs_rtxlen_t prod, /* extent product factor */
|
||||
xfs_rtxnum_t *rtx) /* out: start rtext allocated */
|
||||
{
|
||||
struct xfs_mount *mp = args->mp;
|
||||
int error;
|
||||
xfs_fileoff_t i; /* bitmap block number */
|
||||
int l; /* level number (loop control) */
|
||||
xfs_rtxnum_t n; /* next rtext to be tried */
|
||||
xfs_suminfo_t sum; /* summary information for extents */
|
||||
|
||||
ASSERT(minlen % prod == 0);
|
||||
ASSERT(maxlen % prod == 0);
|
||||
@ -565,46 +607,23 @@ xfs_rtallocate_extent_size(
|
||||
|
||||
/*
|
||||
* Loop over all the levels starting with maxlen.
|
||||
* At each level, look at all the bitmap blocks, to see if there
|
||||
* are extents starting there that are long enough (>= maxlen).
|
||||
* Note, only on the initial level can the allocation fail if
|
||||
* the summary says there's an extent.
|
||||
*
|
||||
* At each level, look at all the bitmap blocks, to see if there are
|
||||
* extents starting there that are long enough (>= maxlen).
|
||||
*
|
||||
* Note, only on the initial level can the allocation fail if the
|
||||
* summary says there's an extent.
|
||||
*/
|
||||
for (l = xfs_highbit32(maxlen); l < mp->m_rsumlevels; l++) {
|
||||
/*
|
||||
* Loop over all the bitmap blocks.
|
||||
*/
|
||||
for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) {
|
||||
/*
|
||||
* Get the summary for this level/block.
|
||||
*/
|
||||
error = xfs_rtget_summary(args, l, i, &sum);
|
||||
if (error)
|
||||
return error;
|
||||
/*
|
||||
* Nothing there, on to the next block.
|
||||
*/
|
||||
if (!sum)
|
||||
continue;
|
||||
/*
|
||||
* Try allocating the extent.
|
||||
*/
|
||||
error = xfs_rtallocate_extent_block(args, i, maxlen,
|
||||
maxlen, len, &n, prod, rtx);
|
||||
if (error != -ENOSPC)
|
||||
return error;
|
||||
/*
|
||||
* If the "next block to try" returned from the
|
||||
* allocator is beyond the next bitmap block,
|
||||
* skip to that bitmap block.
|
||||
*/
|
||||
if (xfs_rtx_to_rbmblock(mp, n) > i + 1)
|
||||
i = xfs_rtx_to_rbmblock(mp, n) - 1;
|
||||
}
|
||||
for (l = xfs_highbit32(maxlen); l < args->mp->m_rsumlevels; l++) {
|
||||
error = xfs_rtalloc_sumlevel(args, l, minlen, maxlen, prod, len,
|
||||
rtx);
|
||||
if (error != -ENOSPC)
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Didn't find any maxlen blocks. Try smaller ones, unless
|
||||
* we're asking for a fixed size extent.
|
||||
* Didn't find any maxlen blocks. Try smaller ones, unless we are
|
||||
* looking for a fixed size extent.
|
||||
*/
|
||||
if (minlen > --maxlen)
|
||||
return -ENOSPC;
|
||||
@ -613,51 +632,19 @@ xfs_rtallocate_extent_size(
|
||||
|
||||
/*
|
||||
* Loop over sizes, from maxlen down to minlen.
|
||||
* This time, when we do the allocations, allow smaller ones
|
||||
* to succeed.
|
||||
*
|
||||
* This time, when we do the allocations, allow smaller ones to succeed,
|
||||
* but make sure the specified minlen/maxlen are in the possible range
|
||||
* for this summary level.
|
||||
*/
|
||||
for (l = xfs_highbit32(maxlen); l >= xfs_highbit32(minlen); l--) {
|
||||
/*
|
||||
* Loop over all the bitmap blocks, try an allocation
|
||||
* starting in that block.
|
||||
*/
|
||||
for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) {
|
||||
/*
|
||||
* Get the summary information for this level/block.
|
||||
*/
|
||||
error = xfs_rtget_summary(args, l, i, &sum);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* If nothing there, go on to next.
|
||||
*/
|
||||
if (!sum)
|
||||
continue;
|
||||
/*
|
||||
* Try the allocation. Make sure the specified
|
||||
* minlen/maxlen are in the possible range for
|
||||
* this summary level.
|
||||
*/
|
||||
error = xfs_rtallocate_extent_block(args, i,
|
||||
XFS_RTMAX(minlen, 1 << l),
|
||||
XFS_RTMIN(maxlen, (1 << (l + 1)) - 1),
|
||||
len, &n, prod, rtx);
|
||||
if (error != -ENOSPC)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* If the "next block to try" returned from the
|
||||
* allocator is beyond the next bitmap block,
|
||||
* skip to that bitmap block.
|
||||
*/
|
||||
if (xfs_rtx_to_rbmblock(mp, n) > i + 1)
|
||||
i = xfs_rtx_to_rbmblock(mp, n) - 1;
|
||||
}
|
||||
error = xfs_rtalloc_sumlevel(args, l, XFS_RTMAX(minlen, 1 << l),
|
||||
XFS_RTMIN(maxlen, (1 << (l + 1)) - 1), prod,
|
||||
len, rtx);
|
||||
if (error != -ENOSPC)
|
||||
return error;
|
||||
}
|
||||
/*
|
||||
* Got nothing, return failure.
|
||||
*/
|
||||
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user