Commit 05b7c8ab authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong

xfs: move some code around inside xfs_bmap_shift_extents

For the first right move we need to look up next_fsb.  That means
our last fsb that contains next_fsb must also be the current extent,
so take advantage of that by moving the code around a bit.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent f2285c14
...@@ -6127,7 +6127,6 @@ xfs_bmap_shift_extents( ...@@ -6127,7 +6127,6 @@ xfs_bmap_shift_extents(
ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL));
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
ASSERT(direction == SHIFT_LEFT || direction == SHIFT_RIGHT); ASSERT(direction == SHIFT_LEFT || direction == SHIFT_RIGHT);
ASSERT(*next_fsb != NULLFSBLOCK || direction == SHIFT_RIGHT);
ifp = XFS_IFORK_PTR(ip, whichfork); ifp = XFS_IFORK_PTR(ip, whichfork);
if (!(ifp->if_flags & XFS_IFEXTENTS)) { if (!(ifp->if_flags & XFS_IFEXTENTS)) {
...@@ -6159,43 +6158,48 @@ xfs_bmap_shift_extents( ...@@ -6159,43 +6158,48 @@ xfs_bmap_shift_extents(
* In case of first right shift, we need to initialize next_fsb * In case of first right shift, we need to initialize next_fsb
*/ */
if (*next_fsb == NULLFSBLOCK) { if (*next_fsb == NULLFSBLOCK) {
gotp = xfs_iext_get_ext(ifp, total_extents - 1); ASSERT(direction == SHIFT_RIGHT);
current_ext = total_extents - 1;
gotp = xfs_iext_get_ext(ifp, current_ext);
xfs_bmbt_get_all(gotp, &got); xfs_bmbt_get_all(gotp, &got);
*next_fsb = got.br_startoff; *next_fsb = got.br_startoff;
if (stop_fsb > *next_fsb) { if (stop_fsb > *next_fsb) {
*done = 1; *done = 1;
goto del_cursor; goto del_cursor;
} }
} else {
/*
* Look up the extent index for the fsb where we start shifting. We can
* henceforth iterate with current_ext as extent list changes are locked
* out via ilock.
*
* gotp can be null in 2 cases: 1) if there are no extents or 2)
* *next_fsb lies in a hole beyond which there are no extents. Either
* way, we are done.
*/
gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, &current_ext);
if (!gotp) {
*done = 1;
goto del_cursor;
}
} }
/* Lookup the extent index at which we have to stop */ /* Lookup the extent index at which we have to stop */
if (direction == SHIFT_RIGHT) { if (direction == SHIFT_RIGHT) {
gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent);
/* Make stop_extent exclusive of shift range */ /* Make stop_extent exclusive of shift range */
stop_extent--; stop_extent--;
} else if (current_ext <= stop_extent) {
error = -EIO;
goto del_cursor;
}
} else {
stop_extent = total_extents; stop_extent = total_extents;
if (current_ext >= stop_extent) {
/* error = -EIO;
* Look up the extent index for the fsb where we start shifting. We can goto del_cursor;
* henceforth iterate with current_ext as extent list changes are locked }
* out via ilock.
*
* gotp can be null in 2 cases: 1) if there are no extents or 2)
* *next_fsb lies in a hole beyond which there are no extents. Either
* way, we are done.
*/
gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, &current_ext);
if (!gotp) {
*done = 1;
goto del_cursor;
}
/* some sanity checking before we finally start shifting extents */
if ((direction == SHIFT_LEFT && current_ext >= stop_extent) ||
(direction == SHIFT_RIGHT && current_ext <= stop_extent)) {
error = -EIO;
goto del_cursor;
} }
while (nexts++ < num_exts) { while (nexts++ < num_exts) {
......
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