summary refs log tree commit diff
path: root/fs/ocfs2/dcache.c
diff options
context:
space:
mode:
authorMark Fasheh <mark.fasheh@oracle.com>2006-09-08 14:22:54 -0700
committerMark Fasheh <mark.fasheh@oracle.com>2006-09-24 13:50:45 -0700
commit1ba9da2ffa54b56a6346746248bfa38124d499a6 (patch)
tree51b25c65e92b6d2b3281d175e517cb5699e4b9ee /fs/ocfs2/dcache.c
parent349457ccf2592c14bdf13b6706170ae2e94931b1 (diff)
downloadlinux-1ba9da2ffa54b56a6346746248bfa38124d499a6.tar.gz
ocfs2: manually d_move() during ocfs2_rename()
Make use of FS_RENAME_DOES_D_MOVE to avoid a race condition that can occur
during ->rename() if we d_move() outside of the parent directory cluster
locks, and another node discovers the new name (created during the rename)
and unlinks it. d_move() will unconditionally rehash a dentry - which will
leave stale data in the system.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2/dcache.c')
-rw-r--r--fs/ocfs2/dcache.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c
index 09efe240e652..18a31906316e 100644
--- a/fs/ocfs2/dcache.c
+++ b/fs/ocfs2/dcache.c
@@ -414,7 +414,7 @@ void ocfs2_dentry_move(struct dentry *dentry, struct dentry *target,
 	 * XXX: Is there any advantage to dropping the lock here?
 	 */
 	if (old_dir == new_dir)
-		return;
+		goto out_move;
 
 	ocfs2_dentry_lock_put(osb, dentry->d_fsdata);
 
@@ -423,6 +423,9 @@ void ocfs2_dentry_move(struct dentry *dentry, struct dentry *target,
 				       OCFS2_I(new_dir)->ip_blkno, 0);
 	if (ret)
 		mlog_errno(ret);
+
+out_move:
+	d_move(dentry, target);
 }
 
 struct dentry_operations ocfs2_dentry_ops = {