Re: [PATCH 3/3] ext4: Fix estimate extent index blocks in ext4_ext_index_trans_blocks()

Zhang Yi <[email protected]> Fri, 7 Aug 2026 12:46:01 +0800
Newsgroups org.kernel.vger.linux-ext4
Message-ID <[email protected]>
On 8/5/2026 11:35 PM, Jan Kara wrote:
> The estimate of the number of impacted extent tree index blocks could be
> one-too-low. If we modify say 2 extents, already two leaf index blocks
> could be impacted, not just one the current estimate counts with. Fix
> the estimate.
> 
> Signed-off-by: Jan Kara <[email protected]>

This is a good catch!

Reviewed-by: Zhang Yi <[email protected]>

> ---
>  fs/ext4/extents.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
> index 44ab246a3176..713b2c098af5 100644
> --- a/fs/ext4/extents.c
> +++ b/fs/ext4/extents.c
> @@ -2427,9 +2427,17 @@ int ext4_ext_index_trans_blocks(struct inode *inode, int extents)
>  	 */
>  	if (extents <= 1)
>  		index = (EXT4_MAX_EXTENT_DEPTH * 2) + extents;
> -	else
> -		index = (EXT4_MAX_EXTENT_DEPTH * 3) +
> -			DIV_ROUND_UP(extents, ext4_ext_space_block(inode, 0));
> +	else {
> +		int ext_max = ext4_ext_space_block(inode, 0);
> +
> +		index = EXT4_MAX_EXTENT_DEPTH * 3;
> +		/*
> +		 * Modified extents need not start at the beginning of the
> +		 * leaf. Already two extents may need two leaf block
> +		 * modifications...
> +		 */
> +		index += DIV_ROUND_UP(extents + ext_max - 1, ext_max);
> +	}
>  
>  	return index;
>  }