diff options
author | Brian Foster <bfoster@redhat.com> | 2013-03-18 10:51:44 -0400 |
---|---|---|
committer | Ben Myers <bpm@sgi.com> | 2013-03-22 17:05:00 -0400 |
commit | c9bdbdc0741d90908f492415c890b630f43f17f8 (patch) | |
tree | cf8bf3498ad3b724adcd3b609947e8d88cfed0f7 /fs/xfs/xfs_iomap.c | |
parent | 3c58b5f809eda8ae8d891b7a87d0a235ab0f9bf5 (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.c | 19 |
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 |