Re: [PATCH V7 07/14] xfs: Check for extent overflow when moving extent from cow to data fork

Allison Henderson
2020-10-24T20:19:09Z

On 10/18/20 11:40 PM, Chandan Babu R wrote:
> Moving an extent to data fork can cause a sub-interval of an existing
> extent to be unmapped. This will increase extent count by 1. Mapping in
> the new extent can increase the extent count by 1 again i.e.
> | Old extent | New extent | Old extent |
> Hence number of extents increases by 2.
>
Looks ok to me
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
> ---
> fs/xfs/libxfs/xfs_inode_fork.h | 9 +++++++++
> fs/xfs/xfs_reflink.c | 5 +++++
> 2 files changed, 14 insertions(+)
>
> diff --git a/fs/xfs/libxfs/xfs_inode_fork.h b/fs/xfs/libxfs/xfs_inode_fork.h
> index afb647e1e3fa..b99e67e7b59b 100644
> --- a/fs/xfs/libxfs/xfs_inode_fork.h
> +++ b/fs/xfs/libxfs/xfs_inode_fork.h
> @@ -78,6 +78,15 @@ struct xfs_ifork {
> */
> #define XFS_IEXT_WRITE_UNWRITTEN_CNT (2)
>
> +/*
> + * Moving an extent to data fork can cause a sub-interval of an existing extent
> + * to be unmapped. This will increase extent count by 1. Mapping in the new
> + * extent can increase the extent count by 1 again i.e.
> + * | Old extent | New extent | Old extent |
> + * Hence number of extents increases by 2.
> + */
> +#define XFS_IEXT_REFLINK_END_COW_CNT (2)
> +
> /*
> * Fork handling.
> */
> diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
> index 16098dc42add..4f0198f636ad 100644
> --- a/fs/xfs/xfs_reflink.c
> +++ b/fs/xfs/xfs_reflink.c
> @@ -628,6 +628,11 @@ xfs_reflink_end_cow_extent(
> xfs_ilock(ip, XFS_ILOCK_EXCL);
> xfs_trans_ijoin(tp, ip, 0);
>
> + error = xfs_iext_count_may_overflow(ip, XFS_DATA_FORK,
> + XFS_IEXT_REFLINK_END_COW_CNT);
> + if (error)
> + goto out_cancel;
> +
> /*
> * In case of racing, overlapping AIO writes no COW extents might be
> * left by the time I/O completes for the loser of the race. In that
>