diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c index 8f9fe1d7a690..d9cca094960b 100644 --- a/fs/ntfs3/frecord.c +++ b/fs/ntfs3/frecord.c @@ -3023,6 +3023,18 @@ int ni_rename(struct ntfs_inode *dir_ni, struct ntfs_inode *new_dir_ni, /* * Way 1 - Add new + remove old. */ + struct inode *dir_inode = &dir_ni->vfs_inode; + struct inode *new_dir_inode = &new_dir_ni->vfs_inode; + + if (dir_inode == new_dir_inode) { + inode_lock(dir_inode); + } else if (dir_inode < new_dir_inode) { + inode_lock(dir_inode); + inode_lock(new_dir_inode); + } else { + inode_lock(new_dir_inode); + inode_lock(dir_inode); + } err = ni_add_name(new_dir_ni, ni, new_de); if (!err) { err = ni_remove_name(dir_ni, ni, de, &de2, &undo); @@ -3042,6 +3054,13 @@ int ni_rename(struct ntfs_inode *dir_ni, struct ntfs_inode *new_dir_ni, * } */ + if (dir_inode == new_dir_inode) { + inode_unlock(dir_inode); + } else { + inode_unlock(dir_inode); + inode_unlock(new_dir_inode); + } + return err; }