Skip to content

Commit

Permalink
xfs: Check for extent overflow when punching a hole
Browse files Browse the repository at this point in the history
The extent mapping the file offset at which a hole has to be
inserted will be split into two extents causing extent count to
increase by 1.

Reviewed-by: Darrick J. Wong <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Allison Henderson <[email protected]>
Signed-off-by: Chandan Babu R <[email protected]>
Signed-off-by: Darrick J. Wong <[email protected]>
  • Loading branch information
chandanr authored and Darrick J. Wong committed Jan 23, 2021
1 parent 727e1ac commit 85ef08b
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 6 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 @@ -40,6 +40,13 @@ struct xfs_ifork {
*/
#define XFS_IEXT_ADD_NOSPLIT_CNT (1)

/*
* Punching out an extent from the middle of an existing extent can cause the
* extent count to increase by 1.
* i.e. | Old extent | Hole | Old extent |
*/
#define XFS_IEXT_PUNCH_HOLE_CNT (1)

/*
* Fork handling.
*/
Expand Down
15 changes: 9 additions & 6 deletions fs/xfs/xfs_bmap_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ xfs_bui_item_recover(
xfs_exntst_t state;
unsigned int bui_type;
int whichfork;
int iext_delta;
int error = 0;

if (!xfs_bui_validate(mp, buip)) {
Expand Down Expand Up @@ -508,12 +509,14 @@ xfs_bui_item_recover(
xfs_ilock(ip, XFS_ILOCK_EXCL);
xfs_trans_ijoin(tp, ip, 0);

if (bui_type == XFS_BMAP_MAP) {
error = xfs_iext_count_may_overflow(ip, whichfork,
XFS_IEXT_ADD_NOSPLIT_CNT);
if (error)
goto err_cancel;
}
if (bui_type == XFS_BMAP_MAP)
iext_delta = XFS_IEXT_ADD_NOSPLIT_CNT;
else
iext_delta = XFS_IEXT_PUNCH_HOLE_CNT;

error = xfs_iext_count_may_overflow(ip, whichfork, iext_delta);
if (error)
goto err_cancel;

count = bmap->me_len;
error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip,
Expand Down
10 changes: 10 additions & 0 deletions fs/xfs/xfs_bmap_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -891,6 +891,11 @@ xfs_unmap_extent(

xfs_trans_ijoin(tp, ip, 0);

error = xfs_iext_count_may_overflow(ip, XFS_DATA_FORK,
XFS_IEXT_PUNCH_HOLE_CNT);
if (error)
goto out_trans_cancel;

error = xfs_bunmapi(tp, ip, startoffset_fsb, len_fsb, 0, 2, done);
if (error)
goto out_trans_cancel;
Expand Down Expand Up @@ -1168,6 +1173,11 @@ xfs_insert_file_space(
xfs_ilock(ip, XFS_ILOCK_EXCL);
xfs_trans_ijoin(tp, ip, 0);

error = xfs_iext_count_may_overflow(ip, XFS_DATA_FORK,
XFS_IEXT_PUNCH_HOLE_CNT);
if (error)
goto out_trans_cancel;

/*
* The extent shifting code works on extent granularity. So, if stop_fsb
* is not the starting block of extent, we need to split the extent at
Expand Down

0 comments on commit 85ef08b

Please sign in to comment.