From: Christoph Hellwig Date: Fri, 17 Nov 2017 04:11:34 +0000 (-0600) Subject: xfs: treat idx as a cursor in xfs_bmap_add_extent_delay_real X-Git-Tag: v4.15.0-rc1~143^2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12ebbfe1db25babb5400c79f82fdd01bfc32dc70;p=thirdparty%2Fxfsprogs-dev.git xfs: treat idx as a cursor in xfs_bmap_add_extent_delay_real Source kernel commit: 0d045540ed57e68b9ddcf5c325279a7e5ede7bbf 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 Reviewed-by: Brian Foster Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong Signed-off-by: Eric Sandeen --- diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 84d5f21f8..6999bdb87 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1639,12 +1639,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 { @@ -1672,13 +1673,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 { @@ -1700,9 +1701,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 { @@ -1754,12 +1758,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; @@ -1774,7 +1780,6 @@ xfs_bmap_add_extent_delay_real( goto done; } - bma->idx--; break; case BMAP_LEFT_FILLING: @@ -1827,7 +1832,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; @@ -1848,9 +1852,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: