struct ext2_dir_entry_2 * dir_de = NULL;
        struct folio * old_folio;
        struct ext2_dir_entry_2 * old_de;
+       bool old_is_dir = S_ISDIR(old_inode->i_mode);
        int err;
 
        if (flags & ~RENAME_NOREPLACE)
        if (IS_ERR(old_de))
                return PTR_ERR(old_de);
 
-       if (S_ISDIR(old_inode->i_mode)) {
+       if (old_is_dir && old_dir != new_dir) {
                err = -EIO;
                dir_de = ext2_dotdot(old_inode, &dir_folio);
                if (!dir_de)
                struct ext2_dir_entry_2 *new_de;
 
                err = -ENOTEMPTY;
-               if (dir_de && !ext2_empty_dir (new_inode))
+               if (old_is_dir && !ext2_empty_dir(new_inode))
                        goto out_dir;
 
                new_de = ext2_find_entry(new_dir, &new_dentry->d_name,
                if (err)
                        goto out_dir;
                inode_set_ctime_current(new_inode);
-               if (dir_de)
+               if (old_is_dir)
                        drop_nlink(new_inode);
                inode_dec_link_count(new_inode);
        } else {
                err = ext2_add_link(new_dentry, old_inode);
                if (err)
                        goto out_dir;
-               if (dir_de)
+               if (old_is_dir)
                        inode_inc_link_count(new_dir);
        }
 
        mark_inode_dirty(old_inode);
 
        err = ext2_delete_entry(old_de, old_folio);
-       if (!err && dir_de) {
+       if (!err && old_is_dir) {
                if (old_dir != new_dir)
                        err = ext2_set_link(old_inode, dir_de, dir_folio,
                                            new_dir, false);