Commit c1d22ae8 authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Dave Chinner

xfs: in btree_lshift, only allocate temporary cursor when needed

We only need the temporary cursor in _btree_lshift if we're shifting
in an overlapped btree.  Therefore, factor that into a single block
of code so we avoid unnecessary cursor duplication.

Also fix use of the wrong cursor when checking for corruption in
xfs_btree_rshift().
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 1f704b2b
...@@ -2397,29 +2397,29 @@ xfs_btree_lshift( ...@@ -2397,29 +2397,29 @@ xfs_btree_lshift(
* Using a temporary cursor, update the parent key values of the * Using a temporary cursor, update the parent key values of the
* block on the left. * block on the left.
*/ */
error = xfs_btree_dup_cursor(cur, &tcur); if (cur->bc_flags & XFS_BTREE_OVERLAPPING) {
if (error) error = xfs_btree_dup_cursor(cur, &tcur);
goto error0; if (error)
i = xfs_btree_firstrec(tcur, level); goto error0;
XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); i = xfs_btree_firstrec(tcur, level);
XFS_WANT_CORRUPTED_GOTO(tcur->bc_mp, i == 1, error0);
error = xfs_btree_decrement(tcur, level, &i);
if (error)
goto error1;
/* Update the parent keys of the right block. */ error = xfs_btree_decrement(tcur, level, &i);
error = xfs_btree_update_keys(cur, level); if (error)
if (error) goto error1;
goto error1;
/* Update the parent high keys of the left block, if needed. */ /* Update the parent high keys of the left block, if needed. */
if (tcur->bc_flags & XFS_BTREE_OVERLAPPING) {
error = xfs_btree_update_keys(tcur, level); error = xfs_btree_update_keys(tcur, level);
if (error) if (error)
goto error1; goto error1;
xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR);
} }
xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); /* Update the parent keys of the right block. */
error = xfs_btree_update_keys(cur, level);
if (error)
goto error0;
/* Slide the cursor value left one. */ /* Slide the cursor value left one. */
cur->bc_ptrs[level]--; cur->bc_ptrs[level]--;
...@@ -2580,7 +2580,7 @@ xfs_btree_rshift( ...@@ -2580,7 +2580,7 @@ xfs_btree_rshift(
if (error) if (error)
goto error0; goto error0;
i = xfs_btree_lastrec(tcur, level); i = xfs_btree_lastrec(tcur, level);
XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); XFS_WANT_CORRUPTED_GOTO(tcur->bc_mp, i == 1, error0);
error = xfs_btree_increment(tcur, level, &i); error = xfs_btree_increment(tcur, level, &i);
if (error) if (error)
......
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