summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2016-08-03 05:26:22 +0300
committerDave Chinner <david@fromorbit.com>2016-08-03 05:26:22 +0300
commitc1d22ae89cf6086d6a457b3b9241fcb36ebddd14 (patch)
tree8b587b63557dc80ac1a5a5a432973de8f89c8156
parent1f704b2b47822435765aee16f120ae06cc40e78c (diff)
downloadlinux-c1d22ae89cf6086d6a457b3b9241fcb36ebddd14.tar.xz
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: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--fs/xfs/libxfs/xfs_btree.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c
index 40c19f82190c..b5c213a051cd 100644
--- a/fs/xfs/libxfs/xfs_btree.c
+++ b/fs/xfs/libxfs/xfs_btree.c
@@ -2397,29 +2397,29 @@ xfs_btree_lshift(
* Using a temporary cursor, update the parent key values of the
* block on the left.
*/
- error = xfs_btree_dup_cursor(cur, &tcur);
- if (error)
- goto error0;
- i = xfs_btree_firstrec(tcur, level);
- XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0);
-
- error = xfs_btree_decrement(tcur, level, &i);
- if (error)
- goto error1;
+ if (cur->bc_flags & XFS_BTREE_OVERLAPPING) {
+ error = xfs_btree_dup_cursor(cur, &tcur);
+ if (error)
+ goto error0;
+ i = xfs_btree_firstrec(tcur, level);
+ XFS_WANT_CORRUPTED_GOTO(tcur->bc_mp, i == 1, error0);
- /* Update the parent keys of the right block. */
- error = xfs_btree_update_keys(cur, level);
- if (error)
- goto error1;
+ error = xfs_btree_decrement(tcur, level, &i);
+ if (error)
+ goto error1;
- /* Update the parent high keys of the left block, if needed. */
- if (tcur->bc_flags & XFS_BTREE_OVERLAPPING) {
+ /* Update the parent high keys of the left block, if needed. */
error = xfs_btree_update_keys(tcur, level);
if (error)
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. */
cur->bc_ptrs[level]--;
@@ -2580,7 +2580,7 @@ xfs_btree_rshift(
if (error)
goto error0;
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);
if (error)