diff options
author | Christoph Hellwig <hch@lst.de> | 2017-11-03 10:34:39 -0700 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2017-11-06 11:53:38 -0800 |
commit | 0d045540ed57e68b9ddcf5c325279a7e5ede7bbf (patch) | |
tree | 291a03f2d2642d4f215a5e568a029f154b10df24 /fs | |
parent | bf99971c8200fcb3e16d880194f5d559aca09576 (diff) |
xfs: treat idx as a cursor in xfs_bmap_add_extent_delay_real
Stop poking before and after the index and just increment or decrement
it while doing our operations on it to prepare for a new extent list
implementation.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/libxfs/xfs_bmap.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index e1d61face277..c0216e9e2af8 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -1648,12 +1648,13 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The left and right neighbors are both contiguous with new. */ - bma->idx--; LEFT.br_blockcount += PREV.br_blockcount + RIGHT.br_blockcount; - xfs_iext_update_extent(bma->ip, state, bma->idx, &LEFT); - xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); + xfs_iext_remove(bma->ip, bma->idx, 2, state); + bma->idx--; + xfs_iext_update_extent(bma->ip, state, bma->idx, &LEFT); (*nextents)--; + if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -1681,13 +1682,13 @@ xfs_bmap_add_extent_delay_real( * Filling in all of a previously delayed allocation extent. * The left neighbor is contiguous, the right is not. */ - bma->idx--; - old = LEFT; LEFT.br_blockcount += PREV.br_blockcount; + + xfs_iext_remove(bma->ip, bma->idx, 1, state); + bma->idx--; xfs_iext_update_extent(bma->ip, state, bma->idx, &LEFT); - xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); if (bma->cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -1709,9 +1710,12 @@ xfs_bmap_add_extent_delay_real( */ PREV.br_startblock = new->br_startblock; PREV.br_blockcount += RIGHT.br_blockcount; + + bma->idx++; + xfs_iext_remove(bma->ip, bma->idx, 1, state); + bma->idx--; xfs_iext_update_extent(bma->ip, state, bma->idx, &PREV); - xfs_iext_remove(bma->ip, bma->idx + 1, 1, state); if (bma->cur == NULL) rval = XFS_ILOG_DEXT; else { @@ -1763,12 +1767,14 @@ xfs_bmap_add_extent_delay_real( startblockval(PREV.br_startblock)); LEFT.br_blockcount += new->br_blockcount; - xfs_iext_update_extent(bma->ip, state, bma->idx - 1, &LEFT); PREV.br_blockcount = temp; PREV.br_startoff += new->br_blockcount; PREV.br_startblock = nullstartblock(da_new); + xfs_iext_update_extent(bma->ip, state, bma->idx, &PREV); + bma->idx--; + xfs_iext_update_extent(bma->ip, state, bma->idx, &LEFT); if (bma->cur == NULL) rval = XFS_ILOG_DEXT; @@ -1783,7 +1789,6 @@ xfs_bmap_add_extent_delay_real( goto done; } - bma->idx--; break; case BMAP_LEFT_FILLING: @@ -1836,7 +1841,6 @@ xfs_bmap_add_extent_delay_real( RIGHT.br_startoff = new->br_startoff; RIGHT.br_startblock = new->br_startblock; RIGHT.br_blockcount += new->br_blockcount; - xfs_iext_update_extent(bma->ip, state, bma->idx + 1, &RIGHT); if (bma->cur == NULL) rval = XFS_ILOG_DEXT; @@ -1857,9 +1861,10 @@ xfs_bmap_add_extent_delay_real( PREV.br_blockcount = temp; PREV.br_startblock = nullstartblock(da_new); - xfs_iext_update_extent(bma->ip, state, bma->idx, &PREV); + xfs_iext_update_extent(bma->ip, state, bma->idx, &PREV); bma->idx++; + xfs_iext_update_extent(bma->ip, state, bma->idx, &RIGHT); break; case BMAP_RIGHT_FILLING: |