aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Fasheh <mark.fasheh@oracle.com>2006-09-08 17:22:54 -0400
committerMark Fasheh <mark.fasheh@oracle.com>2006-09-24 16:50:45 -0400
commit1ba9da2ffa54b56a6346746248bfa38124d499a6 (patch)
tree51b25c65e92b6d2b3281d175e517cb5699e4b9ee
parent349457ccf2592c14bdf13b6706170ae2e94931b1 (diff)
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>
-rw-r--r--fs/ocfs2/dcache.c5
-rw-r--r--fs/ocfs2/super.c2
2 files changed, 5 insertions, 2 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,
414 * XXX: Is there any advantage to dropping the lock here? 414 * XXX: Is there any advantage to dropping the lock here?
415 */ 415 */
416 if (old_dir == new_dir) 416 if (old_dir == new_dir)
417 return; 417 goto out_move;
418 418
419 ocfs2_dentry_lock_put(osb, dentry->d_fsdata); 419 ocfs2_dentry_lock_put(osb, dentry->d_fsdata);
420 420
@@ -423,6 +423,9 @@ void ocfs2_dentry_move(struct dentry *dentry, struct dentry *target,
423 OCFS2_I(new_dir)->ip_blkno, 0); 423 OCFS2_I(new_dir)->ip_blkno, 0);
424 if (ret) 424 if (ret)
425 mlog_errno(ret); 425 mlog_errno(ret);
426
427out_move:
428 d_move(dentry, target);
426} 429}
427 430
428struct dentry_operations ocfs2_dentry_ops = { 431struct dentry_operations ocfs2_dentry_ops = {
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index d17e33e66a1e..33a6de6fc612 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -682,7 +682,7 @@ static struct file_system_type ocfs2_fs_type = {
682 .kill_sb = kill_block_super, /* set to the generic one 682 .kill_sb = kill_block_super, /* set to the generic one
683 * right now, but do we 683 * right now, but do we
684 * need to change that? */ 684 * need to change that? */
685 .fs_flags = FS_REQUIRES_DEV, 685 .fs_flags = FS_REQUIRES_DEV|FS_RENAME_DOES_D_MOVE,
686 .next = NULL 686 .next = NULL
687}; 687};
688 688