xfs: speculative delayed allocation uses rounddown_power_of_2 badly
rounddown_power_of_2() returns an undefined result when passed a value of zero. The specualtive delayed allocation code is doing this when the inode is zero length. Hence occasionally the preallocation is much, much larger than is necessary (e.g. 8GB for a 270 _byte_ file). Ensure we don't even pass a zero value to this function so the result of preallocation is always the desired size. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Alex Elder <aelder@sgi.com>
This commit is contained in:
Родитель
e34a314c5e
Коммит
b8fc82630a
|
@ -337,7 +337,12 @@ xfs_iomap_prealloc_size(
|
||||||
int shift = 0;
|
int shift = 0;
|
||||||
int64_t freesp;
|
int64_t freesp;
|
||||||
|
|
||||||
alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size);
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
alloc_blocks = XFS_B_TO_FSB(mp, ip->i_size) + 1;
|
||||||
alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN,
|
alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN,
|
||||||
rounddown_pow_of_two(alloc_blocks));
|
rounddown_pow_of_two(alloc_blocks));
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче