From e6358021b9f14e67d1ec5a781173312e1f1329e9 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Wed, 10 Aug 2016 14:53:46 +1000 Subject: [PATCH] xfs: in btree_lshift, only allocate temporary cursor when needed Source kernel commit: c1d22ae89cf6086d6a457b3b9241fcb36ebddd14 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 Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- libxfs/xfs_btree.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 7a34b6580..8391078f3 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -2393,29 +2393,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]--; @@ -2576,7 +2576,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) -- 2.47.2