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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>



[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux