linux-xfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Allison Henderson <allison.henderson@oracle.com>
To: linux-xfs@vger.kernel.org
Subject: [PATCH v9 23/28] xfs: Add parent pointers to rename
Date: Wed, 26 Sep 2018 03:15:02 -0700	[thread overview]
Message-ID: <1537956907-10244-24-git-send-email-allison.henderson@oracle.com> (raw)
In-Reply-To: <1537956907-10244-1-git-send-email-allison.henderson@oracle.com>

This patch removes the old parent pointer attribute during the
rename operation, and re-adds the updated parent pointer.  In
the case of xfs_cross_rename, we modify the routine not to roll
the transaction just yet.  We will do this after the parent
pointer is added in the calling xfs_rename function.

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
---
 fs/xfs/xfs_inode.c | 61 +++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 17 deletions(-)

diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 300ba90..30d6511 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2867,7 +2867,7 @@ xfs_cross_rename(
 	}
 	xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
 	xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE);
-	return xfs_finish_rename(tp);
+	return 0;
 
 out_trans_abort:
 	xfs_trans_cancel(tp);
@@ -2931,6 +2931,8 @@ xfs_rename(
 	bool			src_is_directory = S_ISDIR(VFS_I(src_ip)->i_mode);
 	int			spaceres;
 	int			error;
+	xfs_dir2_dataptr_t	new_diroffset;
+	xfs_dir2_dataptr_t	old_diroffset;
 
 	trace_xfs_rename(src_dp, target_dp, src_name, target_name);
 
@@ -2985,14 +2987,14 @@ xfs_rename(
 	 * we can rely on either trans_commit or trans_cancel to unlock
 	 * them.
 	 */
-	xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL);
+	xfs_trans_ijoin(tp, src_dp, 0);
 	if (new_parent)
-		xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL);
-	xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL);
+		xfs_trans_ijoin(tp, target_dp, 0);
+	xfs_trans_ijoin(tp, src_ip, 0);
 	if (target_ip)
-		xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL);
+		xfs_trans_ijoin(tp, target_ip, 0);
 	if (wip)
-		xfs_trans_ijoin(tp, wip, XFS_ILOCK_EXCL);
+		xfs_trans_ijoin(tp, wip, 0);
 
 	/*
 	 * If we are using project inheritance, we only allow renames
@@ -3002,15 +3004,16 @@ xfs_rename(
 	if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
 		     (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) {
 		error = -EXDEV;
-		goto out_trans_cancel;
+		goto out_unlock;
 	}
 
 	/* RENAME_EXCHANGE is unique from here on. */
-	if (flags & RENAME_EXCHANGE)
-		return xfs_cross_rename(tp, src_dp, src_name, src_ip,
+	if (flags & RENAME_EXCHANGE) {
+		error = xfs_cross_rename(tp, src_dp, src_name, src_ip,
 					target_dp, target_name, target_ip,
 					spaceres);
-
+		goto out_pptr;
+	}
 	/*
 	 * Set up the target.
 	 */
@@ -3022,7 +3025,7 @@ xfs_rename(
 		if (!spaceres) {
 			error = xfs_dir_canenter(tp, target_dp, target_name);
 			if (error)
-				goto out_trans_cancel;
+				goto out_unlock;
 		}
 		/*
 		 * If target does not exist and the rename crosses
@@ -3030,7 +3033,7 @@ xfs_rename(
 		 * to account for the ".." reference from the new entry.
 		 */
 		error = xfs_dir_createname(tp, target_dp, target_name,
-					   src_ip->i_ino, spaceres, NULL);
+					   src_ip->i_ino, spaceres, &new_diroffset);
 		if (error)
 			goto out_trans_cancel;
 
@@ -3055,7 +3058,7 @@ xfs_rename(
 			if (!(xfs_dir_isempty(target_ip)) ||
 			    (VFS_I(target_ip)->i_nlink > 2)) {
 				error = -EEXIST;
-				goto out_trans_cancel;
+				goto out_unlock;
 			}
 		}
 
@@ -3069,7 +3072,7 @@ xfs_rename(
 		 * name at the destination directory, remove it first.
 		 */
 		error = xfs_dir_replace(tp, target_dp, target_name,
-					src_ip->i_ino, spaceres, NULL);
+					src_ip->i_ino, spaceres, &new_diroffset);
 		if (error)
 			goto out_trans_cancel;
 
@@ -3103,7 +3106,7 @@ xfs_rename(
 		 * directory.
 		 */
 		error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
-					target_dp->i_ino, spaceres, NULL);
+					target_dp->i_ino, spaceres, &new_diroffset);
 		ASSERT(error != -EEXIST);
 		if (error)
 			goto out_trans_cancel;
@@ -3142,10 +3145,10 @@ xfs_rename(
 	 */
 	if (wip) {
 		error = xfs_dir_replace(tp, src_dp, src_name, wip->i_ino,
-					spaceres, NULL);
+					spaceres, &old_diroffset);
 	} else
 		error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
-					   spaceres, NULL);
+					   spaceres, &old_diroffset);
 	if (error)
 		goto out_trans_cancel;
 
@@ -3175,14 +3178,38 @@ xfs_rename(
 		VFS_I(wip)->i_state &= ~I_LINKABLE;
 	}
 
+out_pptr:
+	if (xfs_sb_version_hasparent(&mp->m_sb)) {
+		error = xfs_parent_add_deferred(target_dp, tp, src_ip, target_name,
+				new_diroffset);
+		if (error)
+			goto out_trans_cancel;
+
+		error = xfs_parent_remove_deferred(src_dp, tp, src_ip,
+						   old_diroffset);
+		if (error)
+			goto out_trans_cancel;
+	}
+
 	xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
 	xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE);
 	if (new_parent)
 		xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE);
 
 	error = xfs_finish_rename(tp);
+
+out_unlock:
 	if (wip)
 		xfs_irele(wip);
+	if (wip)
+		xfs_iunlock(wip, XFS_ILOCK_EXCL);
+	if (target_ip)
+		xfs_iunlock(target_ip, XFS_ILOCK_EXCL);
+	xfs_iunlock(src_ip, XFS_ILOCK_EXCL);
+	if (new_parent)
+		xfs_iunlock(target_dp, XFS_ILOCK_EXCL);
+	xfs_iunlock(src_dp, XFS_ILOCK_EXCL);
+
 	return error;
 
 out_trans_cancel:
-- 
2.7.4

  parent reply	other threads:[~2018-09-26 16:29 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-26 10:14 [PATCH v9 00/28] Parent Pointers v9 Allison Henderson
2018-09-26 10:14 ` [PATCH v9 01/28] xfs: Move fs/xfs/xfs_attr.h to fs/xfs/libxfs/xfs_attr.h Allison Henderson
2018-09-26 10:14 ` [PATCH v9 02/28] xfs: Add helper function xfs_attr_try_sf_addname Allison Henderson
2018-10-06  3:01   ` Darrick J. Wong
2018-10-06  3:13     ` Dave Chinner
2018-09-26 10:14 ` [PATCH v9 03/28] xfs: Add attibute set and helper functions Allison Henderson
2018-10-06  2:51   ` Dave Chinner
2018-09-26 10:14 ` [PATCH v9 04/28] xfs: Add attibute remove " Allison Henderson
2018-09-26 10:14 ` [PATCH v9 05/28] xfs: Hold inode locks in xfs_ialloc Allison Henderson
2018-10-06  2:53   ` Dave Chinner
2018-09-26 10:14 ` [PATCH v9 06/28] xfs: Add trans toggle to attr routines Allison Henderson
2018-09-26 10:14 ` [PATCH v9 07/28] xfs: Set up infastructure for deferred attribute operations Allison Henderson
2018-09-26 10:14 ` [PATCH v9 08/28] xfs: Add xfs_attr_set_deferred and xfs_attr_remove_deferred Allison Henderson
2018-09-26 10:14 ` [PATCH v9 09/28] xfs: Add xfs_has_attr and subroutines Allison Henderson
2018-09-26 10:14 ` [PATCH v9 10/28] xfs: Add attr context to log item Allison Henderson
2018-09-26 10:14 ` [PATCH v9 11/28] xfs: Roll delayed attr operations by returning EAGAIN Allison Henderson
2018-09-26 10:14 ` [PATCH v9 12/28] xfs: Remove roll_trans boolean Allison Henderson
2018-09-26 10:14 ` [PATCH v9 13/28] xfs: Remove all strlen calls in all xfs_attr_* functions for attr names Allison Henderson
2018-09-26 10:14 ` [PATCH v9 14/28] xfs: get directory offset when adding directory name Allison Henderson
2018-09-26 10:14 ` [PATCH v9 15/28] xfs: get directory offset when removing " Allison Henderson
2018-09-26 10:14 ` [PATCH v9 16/28] xfs: get directory offset when replacing a " Allison Henderson
2018-09-26 10:14 ` [PATCH v9 17/28] xfs: add parent pointer support to attribute code Allison Henderson
2018-09-26 10:14 ` [PATCH v9 18/28] xfs: define parent pointer xattr format Allison Henderson
2018-09-26 10:14 ` [PATCH v9 19/28] xfs: extent transaction reservations for parent attributes Allison Henderson
2018-09-26 10:14 ` [PATCH v9 20/28] xfs: parent pointer attribute creation Allison Henderson
2018-09-26 10:15 ` [PATCH v9 21/28] xfs: add parent attributes to link Allison Henderson
2018-09-26 10:15 ` [PATCH v9 22/28] xfs: remove parent pointers in unlink Allison Henderson
2018-09-26 10:15 ` Allison Henderson [this message]
2018-09-26 10:15 ` [PATCH v9 24/28] xfs: Add the parent pointer support to the superblock version 5 Allison Henderson
2018-09-26 10:15 ` [PATCH v9 25/28] xfs: Add helper function xfs_attr_list_context_init Allison Henderson
2018-09-26 10:15 ` [PATCH v9 26/28] xfs: Increase XFS_DEFER_OPS_NR_INODES to 4 Allison Henderson
2018-09-26 10:15 ` [PATCH v9 27/28] xfs: Add parent pointer ioctl Allison Henderson
2018-09-26 10:15 ` [PATCH v9 28/28] xfs: Add delayed attributes error tag Allison Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1537956907-10244-24-git-send-email-allison.henderson@oracle.com \
    --to=allison.henderson@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).