From 210689281f1eee5c635dc20aed110410e1d36424 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 3 Feb 2022 01:37:46 +0100 Subject: [PATCH] Kernel: Protect mounted filesystem list with spinlock instead of mutex --- Kernel/FileSystem/VirtualFileSystem.cpp | 14 +++++++------- Kernel/FileSystem/VirtualFileSystem.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 8a4f68737b..8efdacc338 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -52,7 +52,7 @@ InodeIdentifier VirtualFileSystem::root_inode_id() const ErrorOr VirtualFileSystem::mount(FileSystem& fs, Custody& mount_point, int flags) { - return m_mounts.with_exclusive([&](auto& mounts) -> ErrorOr { + return m_mounts.with([&](auto& mounts) -> ErrorOr { auto& inode = mount_point.inode(); dbgln("VirtualFileSystem: Mounting {} at inode {} with flags {}", fs.class_name(), @@ -67,7 +67,7 @@ ErrorOr VirtualFileSystem::mount(FileSystem& fs, Custody& mount_point, int ErrorOr VirtualFileSystem::bind_mount(Custody& source, Custody& mount_point, int flags) { - return m_mounts.with_exclusive([&](auto& mounts) -> ErrorOr { + return m_mounts.with([&](auto& mounts) -> ErrorOr { dbgln("VirtualFileSystem: Bind-mounting inode {} at inode {}", source.inode().identifier(), mount_point.inode().identifier()); // FIXME: check that this is not already a mount point Mount mount { source.inode(), mount_point, flags }; @@ -92,7 +92,7 @@ ErrorOr VirtualFileSystem::unmount(Inode& guest_inode) { dbgln("VirtualFileSystem: unmount called with inode {}", guest_inode.identifier()); - return m_mounts.with_exclusive([&](auto& mounts) -> ErrorOr { + return m_mounts.with([&](auto& mounts) -> ErrorOr { for (size_t i = 0; i < mounts.size(); ++i) { auto& mount = mounts[i]; if (&mount.guest() != &guest_inode) @@ -126,7 +126,7 @@ ErrorOr VirtualFileSystem::mount_root(FileSystem& fs) auto pseudo_path = TRY(static_cast(fs).file_description().pseudo_path()); dmesgln("VirtualFileSystem: mounted root from {} ({})", fs.class_name(), pseudo_path); - m_mounts.with_exclusive([&](auto& mounts) { + m_mounts.with([&](auto& mounts) { mounts.append(move(mount)); }); @@ -136,7 +136,7 @@ ErrorOr VirtualFileSystem::mount_root(FileSystem& fs) auto VirtualFileSystem::find_mount_for_host(InodeIdentifier id) -> Mount* { - return m_mounts.with_exclusive([&](auto& mounts) -> Mount* { + return m_mounts.with([&](auto& mounts) -> Mount* { for (auto& mount : mounts) { if (mount.host() && mount.host()->identifier() == id) return &mount; @@ -147,7 +147,7 @@ auto VirtualFileSystem::find_mount_for_host(InodeIdentifier id) -> Mount* auto VirtualFileSystem::find_mount_for_guest(InodeIdentifier id) -> Mount* { - return m_mounts.with_exclusive([&](auto& mounts) -> Mount* { + return m_mounts.with([&](auto& mounts) -> Mount* { for (auto& mount : mounts) { if (mount.guest().identifier() == id) return &mount; @@ -724,7 +724,7 @@ ErrorOr VirtualFileSystem::rmdir(StringView path, Custody& base) void VirtualFileSystem::for_each_mount(Function callback) const { - m_mounts.with_shared([&](auto& mounts) { + m_mounts.with([&](auto& mounts) { for (auto& mount : mounts) { if (callback(mount) == IterationDecision::Break) break; diff --git a/Kernel/FileSystem/VirtualFileSystem.h b/Kernel/FileSystem/VirtualFileSystem.h index 9fbde822ca..72993c3093 100644 --- a/Kernel/FileSystem/VirtualFileSystem.h +++ b/Kernel/FileSystem/VirtualFileSystem.h @@ -19,7 +19,7 @@ #include #include #include -#include +#include namespace Kernel { @@ -95,7 +95,7 @@ private: RefPtr m_root_inode; RefPtr m_root_custody; - MutexProtected> m_mounts; + SpinlockProtected> m_mounts; }; }