Skip to content

Commit

Permalink
ocfs2: manually d_move() during ocfs2_rename()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mark Fasheh committed Sep 24, 2006
1 parent 349457c commit 1ba9da2
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 2 deletions.
5 changes: 4 additions & 1 deletion fs/ocfs2/dcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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 = {
Expand Down
2 changes: 1 addition & 1 deletion fs/ocfs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,7 @@ static struct file_system_type ocfs2_fs_type = {
.kill_sb = kill_block_super, /* set to the generic one
* right now, but do we
* need to change that? */
.fs_flags = FS_REQUIRES_DEV,
.fs_flags = FS_REQUIRES_DEV|FS_RENAME_DOES_D_MOVE,
.next = NULL
};

Expand Down

0 comments on commit 1ba9da2

Please sign in to comment.