From d32d85e1332b7b5e378a12576cc18ee3da187cbe Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 27 Apr 2019 22:38:51 +0200 Subject: [PATCH] Kernel: Fix rename() sometimes failing to move within the same directory. It was wrong to do a reverse name lookup on the old inode after adding a new name for it, since we might very well get the new inode instead of the old one, depending on hash table layouts. --- Kernel/FileSystem/VirtualFileSystem.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 1a6bf241df..04339efcbd 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -333,7 +333,7 @@ KResult VFS::rename(StringView old_path, StringView new_path, Inode& base) return KSuccess; if (new_inode->is_directory() && !old_inode->is_directory()) return KResult(-EISDIR); - auto result = new_parent_inode->remove_child(new_parent_inode->reverse_lookup(new_inode->identifier())); + auto result = new_parent_inode->remove_child(FileSystemPath(new_path).basename()); if (result.is_error()) return result; } @@ -342,7 +342,7 @@ KResult VFS::rename(StringView old_path, StringView new_path, Inode& base) if (result.is_error()) return result; - result = old_parent_inode->remove_child(old_parent_inode->reverse_lookup(old_inode->identifier())); + result = old_parent_inode->remove_child(FileSystemPath(old_path).basename()); if (result.is_error()) return result; @@ -495,8 +495,7 @@ KResult VFS::rmdir(StringView path, Inode& base) if (result.is_error()) return result; - // FIXME: The reverse_lookup here can definitely be avoided. - return parent_inode->remove_child(parent_inode->reverse_lookup(inode->identifier())); + return parent_inode->remove_child(FileSystemPath(path).basename()); } KResultOr VFS::resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode)