Commit c9bdbdc0 authored by Brian Foster's avatar Brian Foster Committed by Ben Myers

xfs: push rounddown_pow_of_two() to after prealloc throttle

The round down occurs towards the beginning of the function. Push
it down after throttling has occurred. This is to support adding
further transformations to 'alloc_blocks' that might not preserve
power-of-two alignment (and thus could lead to rounding down
multiple times).
Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarBen Myers <bpm@sgi.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent 3c58b5f8
...@@ -389,8 +389,15 @@ xfs_iomap_prealloc_size( ...@@ -389,8 +389,15 @@ xfs_iomap_prealloc_size(
if (!alloc_blocks) if (!alloc_blocks)
goto check_writeio; goto check_writeio;
alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, /*
rounddown_pow_of_two(alloc_blocks)); * MAXEXTLEN is not a power of two value but we round the prealloc down
* to the nearest power of two value after throttling. To prevent the
* round down from unconditionally reducing the maximum supported prealloc
* size, we round up first, apply appropriate throttling, round down and
* cap the value to MAXEXTLEN.
*/
alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN),
alloc_blocks);
xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT);
freesp = mp->m_sb.sb_fdblocks; freesp = mp->m_sb.sb_fdblocks;
...@@ -407,6 +414,14 @@ xfs_iomap_prealloc_size( ...@@ -407,6 +414,14 @@ xfs_iomap_prealloc_size(
} }
if (shift) if (shift)
alloc_blocks >>= shift; alloc_blocks >>= shift;
/*
* rounddown_pow_of_two() returns an undefined result if we pass in
* alloc_blocks = 0.
*/
if (alloc_blocks)
alloc_blocks = rounddown_pow_of_two(alloc_blocks);
if (alloc_blocks > MAXEXTLEN)
alloc_blocks = MAXEXTLEN;
/* /*
* If we are still trying to allocate more space than is * If we are still trying to allocate more space than is
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment