--- x/fs/namei.c +++ y/fs/namei.c @@ -5044,6 +5044,8 @@ int vfs_rename(struct renamedata *rd) */ lock_old_subdir = new_dir != old_dir; lock_new_subdir = new_dir != old_dir || !(flags & RENAME_EXCHANGE); + if (lock_new_subdir) + lock_new_subdir = new_dir != target; if (is_dir) { if (lock_old_subdir) inode_lock_nested(source, I_MUTEX_CHILD);