aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_iomap.c
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2013-03-18 10:51:44 -0400
committerBen Myers <bpm@sgi.com>2013-03-22 17:05:00 -0400
commitc9bdbdc0741d90908f492415c890b630f43f17f8 (patch)
treecf8bf3498ad3b724adcd3b609947e8d88cfed0f7 /fs/xfs/xfs_iomap.c
parent3c58b5f809eda8ae8d891b7a87d0a235ab0f9bf5 (diff)
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: Brian Foster <bfoster@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_iomap.c')
-rw-r--r--fs/xfs/xfs_iomap.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 344557eef928..9072794e3a42 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -389,8 +389,15 @@ xfs_iomap_prealloc_size(
389 if (!alloc_blocks) 389 if (!alloc_blocks)
390 goto check_writeio; 390 goto check_writeio;
391 391
392 alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, 392 /*
393 rounddown_pow_of_two(alloc_blocks)); 393 * MAXEXTLEN is not a power of two value but we round the prealloc down
394 * to the nearest power of two value after throttling. To prevent the
395 * round down from unconditionally reducing the maximum supported prealloc
396 * size, we round up first, apply appropriate throttling, round down and
397 * cap the value to MAXEXTLEN.
398 */
399 alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN),
400 alloc_blocks);
394 401
395 xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); 402 xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT);
396 freesp = mp->m_sb.sb_fdblocks; 403 freesp = mp->m_sb.sb_fdblocks;
@@ -407,6 +414,14 @@ xfs_iomap_prealloc_size(
407 } 414 }
408 if (shift) 415 if (shift)
409 alloc_blocks >>= shift; 416 alloc_blocks >>= shift;
417 /*
418 * rounddown_pow_of_two() returns an undefined result if we pass in
419 * alloc_blocks = 0.
420 */
421 if (alloc_blocks)
422 alloc_blocks = rounddown_pow_of_two(alloc_blocks);
423 if (alloc_blocks > MAXEXTLEN)
424 alloc_blocks = MAXEXTLEN;
410 425
411 /* 426 /*
412 * If we are still trying to allocate more space than is 427 * If we are still trying to allocate more space than is