Re: [PATCH v2] ext4: fix fast commit may miss tracking range for FALLOC_FL_ZERO_RANGE

From: harshad shirwadkar
Date: Wed Dec 22 2021 - 21:41:28 EST


Looks good, thanks!

Reviewed-by: Harshad Shirwadkar <harshadshirwadkar@xxxxxxxxx>

On Mon, Dec 20, 2021 at 6:28 PM Xin Yin <yinxin.x@xxxxxxxxxxxxx> wrote:
>
> when call falloc with FALLOC_FL_ZERO_RANGE, to set an range to unwritten,
> which has been already initialized. If the range is align to blocksize,
> fast commit will not track range for this change.
>
> Also track range for unwritten range in ext4_map_blocks().
>
> Signed-off-by: Xin Yin <yinxin.x@xxxxxxxxxxxxx>
> ---
> v2: change to track unwritten range in ext4_map_blocks()
> ---
> fs/ext4/extents.c | 2 --
> fs/ext4/inode.c | 7 ++++---
> 2 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
> index 9229ab1f99c5..6bce319f3bcd 100644
> --- a/fs/ext4/extents.c
> +++ b/fs/ext4/extents.c
> @@ -4599,8 +4599,6 @@ static long ext4_zero_range(struct file *file, loff_t offset,
> ret = ext4_mark_inode_dirty(handle, inode);
> if (unlikely(ret))
> goto out_handle;
> - ext4_fc_track_range(handle, inode, offset >> inode->i_sb->s_blocksize_bits,
> - (offset + len - 1) >> inode->i_sb->s_blocksize_bits);
> /* Zero out partial block at the edges of the range */
> ret = ext4_zero_partial_blocks(handle, inode, offset, len);
> if (ret >= 0)
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index 0afab6d5c65b..47ad4b8cb503 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -741,10 +741,11 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
> if (ret)
> return ret;
> }
> - ext4_fc_track_range(handle, inode, map->m_lblk,
> - map->m_lblk + map->m_len - 1);
> }
> -
> + if (retval > 0 && (map->m_flags & EXT4_MAP_UNWRITTEN ||
> + map->m_flags & EXT4_MAP_MAPPED))
> + ext4_fc_track_range(handle, inode, map->m_lblk,
> + map->m_lblk + map->m_len - 1);
> if (retval < 0)
> ext_debug(inode, "failed with err %d\n", retval);
> return retval;
> --
> 2.20.1
>