summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Wipfli <mail@maxwipfli.ch>2021-07-05 17:15:07 +0200
committerAndreas Kling <kling@serenityos.org>2021-07-05 18:51:21 +0200
commit3c0272126e03c22500d22fbc054254758fa4de06 (patch)
tree3387441ed75664b1896a9296c836bca5714ca7c1
parent557424a1415d134f2d9cac571ab459ad8b25d647 (diff)
downloadserenity-3c0272126e03c22500d22fbc054254758fa4de06.zip
Kernel: Don't allocate Strings unnecessarily in process veil validation
Previously, Custody::absolute_path() was called for every call to validate_path_against_process_veil(). For processes that don't have a veil, the path is not used by the function. This means that it is unnecessarily generated. This introduces an overload to validate_path_against_process_veil(), which takes a Custody const& and only generates the absolute path if it there is actually a veil and it is thus needed. This patch results in a speed up of Assistant's file system cache building by around 16 percent.
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.cpp11
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.h1
2 files changed, 10 insertions, 2 deletions
diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp
index a6341df577..d08bad6788 100644
--- a/Kernel/FileSystem/VirtualFileSystem.cpp
+++ b/Kernel/FileSystem/VirtualFileSystem.cpp
@@ -838,6 +838,13 @@ UnveilNode const& VFS::find_matching_unveiled_path(StringView path)
return unveil_root.traverse_until_last_accessible_node(path_parts.begin(), path_parts.end());
}
+KResult VFS::validate_path_against_process_veil(Custody const& custody, int options)
+{
+ if (Process::current()->veil_state() == VeilState::None)
+ return KSuccess;
+ return validate_path_against_process_veil(custody.absolute_path(), options);
+}
+
KResult VFS::validate_path_against_process_veil(StringView path, int options)
{
if (Process::current()->veil_state() == VeilState::None)
@@ -910,7 +917,7 @@ KResultOr<NonnullRefPtr<Custody>> VFS::resolve_path(StringView path, Custody& ba
return custody_or_error.error();
auto& custody = custody_or_error.value();
- if (auto result = validate_path_against_process_veil(custody->absolute_path(), options); result.is_error())
+ if (auto result = validate_path_against_process_veil(*custody, options); result.is_error())
return result;
return custody;
@@ -1009,7 +1016,7 @@ KResultOr<NonnullRefPtr<Custody>> VFS::resolve_path_without_veil(StringView path
if (!safe_to_follow_symlink(*child_inode, parent_metadata))
return EACCES;
- if (auto result = validate_path_against_process_veil(custody->absolute_path(), options); result.is_error())
+ if (auto result = validate_path_against_process_veil(*custody, options); result.is_error())
return result;
auto symlink_target = child_inode->resolve_as_link(parent, out_parent, options, symlink_recursion_level + 1);
diff --git a/Kernel/FileSystem/VirtualFileSystem.h b/Kernel/FileSystem/VirtualFileSystem.h
index ad92143db1..ae8770115e 100644
--- a/Kernel/FileSystem/VirtualFileSystem.h
+++ b/Kernel/FileSystem/VirtualFileSystem.h
@@ -103,6 +103,7 @@ private:
friend class FileDescription;
UnveilNode const& find_matching_unveiled_path(StringView path);
+ KResult validate_path_against_process_veil(Custody const& path, int options);
KResult validate_path_against_process_veil(StringView path, int options);
bool is_vfs_root(InodeIdentifier) const;