From 6f19e0430eb393d22905131ef8f2fc12e6b2c96d Mon Sep 17 00:00:00 2001 From: Brian Foster Date: Mon, 18 Mar 2013 10:51:44 -0400 Subject: [PATCH] --- yaml --- r: 371045 b: refs/heads/master c: c9bdbdc0741d90908f492415c890b630f43f17f8 h: refs/heads/master i: 371043: a9a5fe2ba049e02cd79d60d077988a928d88dac2 v: v3 --- [refs] | 2 +- trunk/fs/xfs/xfs_iomap.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index eb7c61fe379c..980137e57451 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3c58b5f809eda8ae8d891b7a87d0a235ab0f9bf5 +refs/heads/master: c9bdbdc0741d90908f492415c890b630f43f17f8 diff --git a/trunk/fs/xfs/xfs_iomap.c b/trunk/fs/xfs/xfs_iomap.c index 344557eef928..9072794e3a42 100644 --- a/trunk/fs/xfs/xfs_iomap.c +++ b/trunk/fs/xfs/xfs_iomap.c @@ -389,8 +389,15 @@ xfs_iomap_prealloc_size( if (!alloc_blocks) 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); freesp = mp->m_sb.sb_fdblocks; @@ -407,6 +414,14 @@ xfs_iomap_prealloc_size( } if (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