From c1d22ae89cf6086d6a457b3b9241fcb36ebddd14 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Wed, 3 Aug 2016 12:26:22 +1000 Subject: [PATCH] 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 Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_btree.c | 34 +++++++++++++++++----------------- 1 file 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) -- 2.20.1