xfs: look at m_frextents in xfs_iomap_prealloc_size for RT allocations
Add a check for files on the RT subvolume and use m_frextents instead of m_fdblocks to adjust the preallocation size. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
This commit is contained in:
parent
7099bd0f24
commit
727f843163
@ -28,6 +28,7 @@
|
||||
#include "xfs_dquot.h"
|
||||
#include "xfs_reflink.h"
|
||||
#include "xfs_health.h"
|
||||
#include "xfs_rtbitmap.h"
|
||||
|
||||
#define XFS_ALLOC_ALIGN(mp, off) \
|
||||
(((off) >> mp->m_allocsize_log) << mp->m_allocsize_log)
|
||||
@ -404,6 +405,29 @@ xfs_quota_calc_throttle(
|
||||
}
|
||||
}
|
||||
|
||||
static int64_t
|
||||
xfs_iomap_freesp(
|
||||
struct percpu_counter *counter,
|
||||
uint64_t low_space[XFS_LOWSP_MAX],
|
||||
int *shift)
|
||||
{
|
||||
int64_t freesp;
|
||||
|
||||
freesp = percpu_counter_read_positive(counter);
|
||||
if (freesp < low_space[XFS_LOWSP_5_PCNT]) {
|
||||
*shift = 2;
|
||||
if (freesp < low_space[XFS_LOWSP_4_PCNT])
|
||||
(*shift)++;
|
||||
if (freesp < low_space[XFS_LOWSP_3_PCNT])
|
||||
(*shift)++;
|
||||
if (freesp < low_space[XFS_LOWSP_2_PCNT])
|
||||
(*shift)++;
|
||||
if (freesp < low_space[XFS_LOWSP_1_PCNT])
|
||||
(*shift)++;
|
||||
}
|
||||
return freesp;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we don't have a user specified preallocation size, dynamically increase
|
||||
* the preallocation size as the size of the file grows. Cap the maximum size
|
||||
@ -486,18 +510,13 @@ xfs_iomap_prealloc_size(
|
||||
alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(XFS_MAX_BMBT_EXTLEN),
|
||||
alloc_blocks);
|
||||
|
||||
freesp = percpu_counter_read_positive(&mp->m_fdblocks);
|
||||
if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) {
|
||||
shift = 2;
|
||||
if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT])
|
||||
shift++;
|
||||
if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT])
|
||||
shift++;
|
||||
if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT])
|
||||
shift++;
|
||||
if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT])
|
||||
shift++;
|
||||
}
|
||||
if (unlikely(XFS_IS_REALTIME_INODE(ip)))
|
||||
freesp = xfs_rtx_to_rtb(mp,
|
||||
xfs_iomap_freesp(&mp->m_frextents,
|
||||
mp->m_low_rtexts, &shift));
|
||||
else
|
||||
freesp = xfs_iomap_freesp(&mp->m_fdblocks, mp->m_low_space,
|
||||
&shift);
|
||||
|
||||
/*
|
||||
* Check each quota to cap the prealloc size, provide a shift value to
|
||||
|
Loading…
x
Reference in New Issue
Block a user