ext4: set goal start correctly in ext4_mb_normalize_request
[ Upstream commit b07ffe6927c75d99af534d685282ea188d9f71a6 ] We need to set ac_g_ex to notify the goal start used in ext4_mb_find_by_goal. Set ac_g_ex instead of ac_f_ex in ext4_mb_normalize_request. Besides we should assure goal start is in range [first_data_block, blocks_count) as ext4_mb_initialize_context does. [ Added a check to make sure size is less than ar->pright; otherwise we could end up passing an underflowed value of ar->pright - size to ext4_get_group_no_and_offset(), which will trigger a BUG_ON later on. - TYT ] Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> Link: https://lore.kernel.org/r/20230303172120.3800725-2-shikemeng@huaweicloud.com Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
7739981b9c
commit
c6bee89700
@ -4018,6 +4018,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
|
||||
struct ext4_allocation_request *ar)
|
||||
{
|
||||
struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
|
||||
struct ext4_super_block *es = sbi->s_es;
|
||||
int bsbits, max;
|
||||
ext4_lblk_t end;
|
||||
loff_t size, start_off;
|
||||
@ -4213,18 +4214,21 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
|
||||
ac->ac_g_ex.fe_len = EXT4_NUM_B2C(sbi, size);
|
||||
|
||||
/* define goal start in order to merge */
|
||||
if (ar->pright && (ar->lright == (start + size))) {
|
||||
if (ar->pright && (ar->lright == (start + size)) &&
|
||||
ar->pright >= size &&
|
||||
ar->pright - size >= le32_to_cpu(es->s_first_data_block)) {
|
||||
/* merge to the right */
|
||||
ext4_get_group_no_and_offset(ac->ac_sb, ar->pright - size,
|
||||
&ac->ac_f_ex.fe_group,
|
||||
&ac->ac_f_ex.fe_start);
|
||||
&ac->ac_g_ex.fe_group,
|
||||
&ac->ac_g_ex.fe_start);
|
||||
ac->ac_flags |= EXT4_MB_HINT_TRY_GOAL;
|
||||
}
|
||||
if (ar->pleft && (ar->lleft + 1 == start)) {
|
||||
if (ar->pleft && (ar->lleft + 1 == start) &&
|
||||
ar->pleft + 1 < ext4_blocks_count(es)) {
|
||||
/* merge to the left */
|
||||
ext4_get_group_no_and_offset(ac->ac_sb, ar->pleft + 1,
|
||||
&ac->ac_f_ex.fe_group,
|
||||
&ac->ac_f_ex.fe_start);
|
||||
&ac->ac_g_ex.fe_group,
|
||||
&ac->ac_g_ex.fe_start);
|
||||
ac->ac_flags |= EXT4_MB_HINT_TRY_GOAL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user