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@xxxxxxxxxx> --- fs/xfs/xfs_iomap.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index bd7c060..d381326 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -329,13 +329,11 @@ xfs_iomap_prealloc_size( goto check_writeio; /* - * rounddown_pow_of_two() returns an undefined result - * if we pass in alloc_blocks = 0. Hence the "+ 1" to - * ensure we always pass in a non-zero value. + * MAXEXTLEN is 21 bits, add one to protect against the rounddown + * further down. */ - alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1; - alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN, - rounddown_pow_of_two(alloc_blocks)); + alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN + 1, + XFS_B_TO_FSB(mp, XFS_ISIZE(ip))); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); freesp = mp->m_sb.sb_fdblocks; @@ -352,6 +350,8 @@ xfs_iomap_prealloc_size( } if (shift) alloc_blocks >>= shift; + if (alloc_blocks) + alloc_blocks = rounddown_pow_of_two(alloc_blocks); check_writeio: if (alloc_blocks < mp->m_writeio_blocks) -- 1.7.7.6 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs