Skip to content

Commit

Permalink
xfs: Check for extent overflow when swapping extents
Browse files Browse the repository at this point in the history
Removing an initial range of source/donor file's extent and adding a new
extent (from donor/source file) in its place will cause extent count to
increase by 1.

Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
  • Loading branch information
Chandan Babu R authored and Darrick J. Wong committed Jan 23, 2021
1 parent ee898d7 commit bcc561f
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
7 changes: 7 additions & 0 deletions fs/xfs/libxfs/xfs_inode_fork.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,13 @@ struct xfs_ifork {
*/
#define XFS_IEXT_REFLINK_END_COW_CNT (2)

/*
* Removing an initial range of source/donor file's extent and adding a new
* extent (from donor/source file) in its place will cause extent count to
* increase by 1.
*/
#define XFS_IEXT_SWAP_RMAP_CNT (1)

/*
* Fork handling.
*/
Expand Down
16 changes: 16 additions & 0 deletions fs/xfs/xfs_bmap_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1399,6 +1399,22 @@ xfs_swap_extent_rmap(
irec.br_blockcount);
trace_xfs_swap_extent_rmap_remap_piece(tip, &uirec);

if (xfs_bmap_is_real_extent(&uirec)) {
error = xfs_iext_count_may_overflow(ip,
XFS_DATA_FORK,
XFS_IEXT_SWAP_RMAP_CNT);
if (error)
goto out;
}

if (xfs_bmap_is_real_extent(&irec)) {
error = xfs_iext_count_may_overflow(tip,
XFS_DATA_FORK,
XFS_IEXT_SWAP_RMAP_CNT);
if (error)
goto out;
}

/* Remove the mapping from the donor file. */
xfs_bmap_unmap_extent(tp, tip, &uirec);

Expand Down

0 comments on commit bcc561f

Please sign in to comment.