Commit 1bfd7618 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

xfs: don't create overlapping extents in xfs_bmap_add_extent_delay_real

Two cases in xfs_bmap_add_extent_delay_real currently insert a new
extent before updating the existing one that is being split.  While
this works fine with a simple extent list, a more complex tree can't
easily cope with overlapping extent.  Reshuffle the code a bit to update
the slot of the existing delalloc extent to the new real extent before
inserting the shortened delalloc extent before or after it.  This
avoids the overlapping extents while still allowing to update the
br_startblock field of the delalloc extent with the updated indirect
block reservation.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 0dca060c
......@@ -1791,7 +1791,7 @@ xfs_bmap_add_extent_delay_real(
* Filling in the first part of a previous delayed allocation.
* The left neighbor is not contiguous.
*/
xfs_iext_insert(bma->ip, bma->idx, 1, new, state);
xfs_iext_update_extent(bma->ip, state, bma->idx, new);
(*nextents)++;
if (bma->cur == NULL)
rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
......@@ -1824,7 +1824,7 @@ xfs_bmap_add_extent_delay_real(
PREV.br_startoff = new_endoff;
PREV.br_blockcount = temp;
PREV.br_startblock = nullstartblock(da_new);
xfs_iext_update_extent(bma->ip, state, bma->idx + 1, &PREV);
xfs_iext_insert(bma->ip, bma->idx + 1, 1, &PREV, state);
break;
case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG:
......@@ -1867,7 +1867,7 @@ xfs_bmap_add_extent_delay_real(
* Filling in the last part of a previous delayed allocation.
* The right neighbor is not contiguous.
*/
xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state);
xfs_iext_update_extent(bma->ip, state, bma->idx, new);
(*nextents)++;
if (bma->cur == NULL)
rval = XFS_ILOG_CORE | XFS_ILOG_DEXT;
......@@ -1899,7 +1899,7 @@ xfs_bmap_add_extent_delay_real(
PREV.br_startblock = nullstartblock(da_new);
PREV.br_blockcount = temp;
xfs_iext_update_extent(bma->ip, state, bma->idx, &PREV);
xfs_iext_insert(bma->ip, bma->idx, 1, &PREV, state);
bma->idx++;
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment