From f53149d5f61422bad5507661af2ff3374bc0f9c8 Mon Sep 17 00:00:00 2001 From: Liav A Date: Sun, 23 Oct 2022 21:51:56 +0300 Subject: [PATCH] Kernel: Split the SysFS core files into smaller components --- Kernel/Arch/x86/init.cpp | 2 +- Kernel/Bus/PCI/Access.h | 4 +- .../PCI/Controller/MemoryBackedHostBridge.cpp | 1 + .../PCI/Controller/MemoryBackedHostBridge.h | 1 + Kernel/CMakeLists.txt | 5 +- Kernel/Devices/Device.cpp | 2 +- Kernel/FileSystem/SysFS/Component.cpp | 4 +- Kernel/FileSystem/SysFS/DirectoryInode.cpp | 54 ++++++++++++ Kernel/FileSystem/SysFS/DirectoryInode.h | 31 +++++++ Kernel/FileSystem/SysFS/FileSystem.cpp | 33 +++++++ Kernel/FileSystem/SysFS/FileSystem.h | 36 ++++++++ .../FileSystem/{SysFS.cpp => SysFS/Inode.cpp} | 87 +------------------ Kernel/FileSystem/{SysFS.h => SysFS/Inode.h} | 53 +---------- Kernel/FileSystem/SysFS/LinkInode.cpp | 37 ++++++++ Kernel/FileSystem/SysFS/LinkInode.h | 26 ++++++ .../Subsystems/Firmware/BIOS/Directory.h | 1 - .../SysFS/Subsystems/Firmware/Directory.h | 2 +- .../Subsystems/Kernel/PowerStateSwitch.h | 1 - Kernel/Syscalls/mount.cpp | 2 +- 19 files changed, 234 insertions(+), 148 deletions(-) create mode 100644 Kernel/FileSystem/SysFS/DirectoryInode.cpp create mode 100644 Kernel/FileSystem/SysFS/DirectoryInode.h create mode 100644 Kernel/FileSystem/SysFS/FileSystem.cpp create mode 100644 Kernel/FileSystem/SysFS/FileSystem.h rename Kernel/FileSystem/{SysFS.cpp => SysFS/Inode.cpp} (51%) rename Kernel/FileSystem/{SysFS.h => SysFS/Inode.h} (54%) create mode 100644 Kernel/FileSystem/SysFS/LinkInode.cpp create mode 100644 Kernel/FileSystem/SysFS/LinkInode.h diff --git a/Kernel/Arch/x86/init.cpp b/Kernel/Arch/x86/init.cpp index 74d8036ab3..fb165e9d34 100644 --- a/Kernel/Arch/x86/init.cpp +++ b/Kernel/Arch/x86/init.cpp @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Kernel/Bus/PCI/Access.h b/Kernel/Bus/PCI/Access.h index 51d7776b5e..31ea56049d 100644 --- a/Kernel/Bus/PCI/Access.h +++ b/Kernel/Bus/PCI/Access.h @@ -7,11 +7,11 @@ #pragma once #include +#include #include #include #include #include -#include #include namespace Kernel::PCI { @@ -59,7 +59,7 @@ private: mutable RecursiveSpinlock m_access_lock { LockRank::None }; mutable Spinlock m_scan_lock { LockRank::None }; - HashMap> m_host_controllers; + HashMap> m_host_controllers; Vector m_device_identifiers; }; } diff --git a/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.cpp b/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.cpp index c121e63ed3..a6c6c6bb88 100644 --- a/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.cpp +++ b/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.cpp @@ -7,6 +7,7 @@ #include #include #include +#include namespace Kernel::PCI { diff --git a/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.h b/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.h index 182d82308d..153c44738f 100644 --- a/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.h +++ b/Kernel/Bus/PCI/Controller/MemoryBackedHostBridge.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace Kernel::PCI { diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 78c53c541d..cf54143dc1 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -125,8 +125,11 @@ set(KERNEL_SOURCES FileSystem/OpenFileDescription.cpp FileSystem/Plan9FileSystem.cpp FileSystem/ProcFS.cpp - FileSystem/SysFS.cpp FileSystem/SysFS/Component.cpp + FileSystem/SysFS/DirectoryInode.cpp + FileSystem/SysFS/FileSystem.cpp + FileSystem/SysFS/Inode.cpp + FileSystem/SysFS/LinkInode.cpp FileSystem/SysFS/Registry.cpp FileSystem/SysFS/RootDirectory.cpp FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp diff --git a/Kernel/Devices/Device.cpp b/Kernel/Devices/Device.cpp index 8d4c0b1877..833a6d9d58 100644 --- a/Kernel/Devices/Device.cpp +++ b/Kernel/Devices/Device.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Kernel/FileSystem/SysFS/Component.cpp b/Kernel/FileSystem/SysFS/Component.cpp index 77140bdf15..a79bf06200 100644 --- a/Kernel/FileSystem/SysFS/Component.cpp +++ b/Kernel/FileSystem/SysFS/Component.cpp @@ -4,8 +4,10 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include +#include +#include +#include #include #include diff --git a/Kernel/FileSystem/SysFS/DirectoryInode.cpp b/Kernel/FileSystem/SysFS/DirectoryInode.cpp new file mode 100644 index 0000000000..8e3395e68b --- /dev/null +++ b/Kernel/FileSystem/SysFS/DirectoryInode.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Kernel { + +ErrorOr> SysFSDirectoryInode::try_create(SysFS const& sysfs, SysFSComponent const& component) +{ + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSDirectoryInode(sysfs, component)); +} + +SysFSDirectoryInode::SysFSDirectoryInode(SysFS const& fs, SysFSComponent const& component) + : SysFSInode(fs, component) +{ +} + +SysFSDirectoryInode::~SysFSDirectoryInode() = default; + +InodeMetadata SysFSDirectoryInode::metadata() const +{ + // NOTE: No locking required as m_associated_component or its component index will never change during our lifetime. + InodeMetadata metadata; + metadata.inode = { fsid(), m_associated_component->component_index() }; + metadata.mode = S_IFDIR | S_IRUSR | S_IRGRP | S_IROTH | S_IXOTH; + metadata.uid = 0; + metadata.gid = 0; + metadata.size = 0; + metadata.mtime = TimeManagement::boot_time(); + return metadata; +} + +ErrorOr SysFSDirectoryInode::traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)> callback) const +{ + MutexLocker locker(fs().m_lock); + return m_associated_component->traverse_as_directory(fs().fsid(), move(callback)); +} + +ErrorOr> SysFSDirectoryInode::lookup(StringView name) +{ + MutexLocker locker(fs().m_lock); + auto component = m_associated_component->lookup(name); + if (!component) + return ENOENT; + return TRY(component->to_inode(fs())); +} + +} diff --git a/Kernel/FileSystem/SysFS/DirectoryInode.h b/Kernel/FileSystem/SysFS/DirectoryInode.h new file mode 100644 index 0000000000..3f877eee39 --- /dev/null +++ b/Kernel/FileSystem/SysFS/DirectoryInode.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Kernel { + +class SysFSDirectoryInode : public SysFSInode { + friend class SysFS; + +public: + static ErrorOr> try_create(SysFS const&, SysFSComponent const&); + virtual ~SysFSDirectoryInode() override; + + SysFS& fs() { return static_cast(Inode::fs()); } + SysFS const& fs() const { return static_cast(Inode::fs()); } + +protected: + SysFSDirectoryInode(SysFS const&, SysFSComponent const&); + // ^Inode + virtual InodeMetadata metadata() const override; + virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; + virtual ErrorOr> lookup(StringView name) override; +}; + +} diff --git a/Kernel/FileSystem/SysFS/FileSystem.cpp b/Kernel/FileSystem/SysFS/FileSystem.cpp new file mode 100644 index 0000000000..cbd5dd1275 --- /dev/null +++ b/Kernel/FileSystem/SysFS/FileSystem.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Kernel { + +ErrorOr> SysFS::try_create() +{ + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFS)); +} + +SysFS::SysFS() = default; +SysFS::~SysFS() = default; + +ErrorOr SysFS::initialize() +{ + m_root_inode = TRY(SysFSComponentRegistry::the().root_directory().to_inode(*this)); + return {}; +} + +Inode& SysFS::root_inode() +{ + return *m_root_inode; +} + +} diff --git a/Kernel/FileSystem/SysFS/FileSystem.h b/Kernel/FileSystem/SysFS/FileSystem.h new file mode 100644 index 0000000000..8d5d8a527e --- /dev/null +++ b/Kernel/FileSystem/SysFS/FileSystem.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace Kernel { + +class SysFS final : public FileSystem { + friend class SysFSInode; + friend class SysFSDirectoryInode; + +public: + virtual ~SysFS() override; + static ErrorOr> try_create(); + + virtual ErrorOr initialize() override; + virtual StringView class_name() const override { return "SysFS"sv; } + + virtual Inode& root_inode() override; + +private: + SysFS(); + + LockRefPtr m_root_inode; +}; + +} diff --git a/Kernel/FileSystem/SysFS.cpp b/Kernel/FileSystem/SysFS/Inode.cpp similarity index 51% rename from Kernel/FileSystem/SysFS.cpp rename to Kernel/FileSystem/SysFS/Inode.cpp index b679d885d3..17bc4b1f1e 100644 --- a/Kernel/FileSystem/SysFS.cpp +++ b/Kernel/FileSystem/SysFS/Inode.cpp @@ -5,32 +5,11 @@ */ #include -#include -#include -#include +#include #include namespace Kernel { -ErrorOr> SysFS::try_create() -{ - return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFS)); -} - -SysFS::SysFS() = default; -SysFS::~SysFS() = default; - -ErrorOr SysFS::initialize() -{ - m_root_inode = TRY(SysFSComponentRegistry::the().root_directory().to_inode(*this)); - return {}; -} - -Inode& SysFS::root_inode() -{ - return *m_root_inode; -} - ErrorOr> SysFSInode::try_create(SysFS const& fs, SysFSComponent const& component) { return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSInode(fs, component)); @@ -131,68 +110,4 @@ ErrorOr SysFSInode::update_timestamps(Optional, Optional, return {}; } -ErrorOr> SysFSLinkInode::try_create(SysFS const& sysfs, SysFSComponent const& component) -{ - return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSLinkInode(sysfs, component)); -} - -SysFSLinkInode::SysFSLinkInode(SysFS const& fs, SysFSComponent const& component) - : SysFSInode(fs, component) -{ -} - -SysFSLinkInode::~SysFSLinkInode() = default; - -InodeMetadata SysFSLinkInode::metadata() const -{ - // NOTE: No locking required as m_associated_component or its component index will never change during our lifetime. - InodeMetadata metadata; - metadata.inode = { fsid(), m_associated_component->component_index() }; - metadata.mode = S_IFLNK | S_IRUSR | S_IRGRP | S_IROTH | S_IXOTH; - metadata.uid = 0; - metadata.gid = 0; - metadata.size = 0; - metadata.mtime = TimeManagement::boot_time(); - return metadata; -} - -ErrorOr> SysFSDirectoryInode::try_create(SysFS const& sysfs, SysFSComponent const& component) -{ - return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSDirectoryInode(sysfs, component)); -} - -SysFSDirectoryInode::SysFSDirectoryInode(SysFS const& fs, SysFSComponent const& component) - : SysFSInode(fs, component) -{ -} - -SysFSDirectoryInode::~SysFSDirectoryInode() = default; - -InodeMetadata SysFSDirectoryInode::metadata() const -{ - // NOTE: No locking required as m_associated_component or its component index will never change during our lifetime. - InodeMetadata metadata; - metadata.inode = { fsid(), m_associated_component->component_index() }; - metadata.mode = S_IFDIR | S_IRUSR | S_IRGRP | S_IROTH | S_IXOTH; - metadata.uid = 0; - metadata.gid = 0; - metadata.size = 0; - metadata.mtime = TimeManagement::boot_time(); - return metadata; -} -ErrorOr SysFSDirectoryInode::traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)> callback) const -{ - MutexLocker locker(fs().m_lock); - return m_associated_component->traverse_as_directory(fs().fsid(), move(callback)); -} - -ErrorOr> SysFSDirectoryInode::lookup(StringView name) -{ - MutexLocker locker(fs().m_lock); - auto component = m_associated_component->lookup(name); - if (!component) - return ENOENT; - return TRY(component->to_inode(fs())); -} - } diff --git a/Kernel/FileSystem/SysFS.h b/Kernel/FileSystem/SysFS/Inode.h similarity index 54% rename from Kernel/FileSystem/SysFS.h rename to Kernel/FileSystem/SysFS/Inode.h index a3b274cfa4..fdf907a6ca 100644 --- a/Kernel/FileSystem/SysFS.h +++ b/Kernel/FileSystem/SysFS/Inode.h @@ -6,32 +6,12 @@ #pragma once -#include #include #include -#include +#include namespace Kernel { -class SysFS final : public FileSystem { - friend class SysFSInode; - friend class SysFSDirectoryInode; - -public: - virtual ~SysFS() override; - static ErrorOr> try_create(); - - virtual ErrorOr initialize() override; - virtual StringView class_name() const override { return "SysFS"sv; } - - virtual Inode& root_inode() override; - -private: - SysFS(); - - LockRefPtr m_root_inode; -}; - class SysFSInode : public Inode { friend class SysFS; friend class SysFSDirectoryInode; @@ -62,35 +42,4 @@ protected: NonnullLockRefPtr m_associated_component; }; -class SysFSLinkInode : public SysFSInode { - friend class SysFS; - -public: - static ErrorOr> try_create(SysFS const&, SysFSComponent const&); - virtual ~SysFSLinkInode() override; - -protected: - SysFSLinkInode(SysFS const&, SysFSComponent const&); - // ^Inode - virtual InodeMetadata metadata() const override; -}; - -class SysFSDirectoryInode : public SysFSInode { - friend class SysFS; - -public: - static ErrorOr> try_create(SysFS const&, SysFSComponent const&); - virtual ~SysFSDirectoryInode() override; - - SysFS& fs() { return static_cast(Inode::fs()); } - SysFS const& fs() const { return static_cast(Inode::fs()); } - -protected: - SysFSDirectoryInode(SysFS const&, SysFSComponent const&); - // ^Inode - virtual InodeMetadata metadata() const override; - virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; -}; - } diff --git a/Kernel/FileSystem/SysFS/LinkInode.cpp b/Kernel/FileSystem/SysFS/LinkInode.cpp new file mode 100644 index 0000000000..b3bf62e5ff --- /dev/null +++ b/Kernel/FileSystem/SysFS/LinkInode.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Kernel { + +ErrorOr> SysFSLinkInode::try_create(SysFS const& sysfs, SysFSComponent const& component) +{ + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSLinkInode(sysfs, component)); +} + +SysFSLinkInode::SysFSLinkInode(SysFS const& fs, SysFSComponent const& component) + : SysFSInode(fs, component) +{ +} + +SysFSLinkInode::~SysFSLinkInode() = default; + +InodeMetadata SysFSLinkInode::metadata() const +{ + // NOTE: No locking required as m_associated_component or its component index will never change during our lifetime. + InodeMetadata metadata; + metadata.inode = { fsid(), m_associated_component->component_index() }; + metadata.mode = S_IFLNK | S_IRUSR | S_IRGRP | S_IROTH | S_IXOTH; + metadata.uid = 0; + metadata.gid = 0; + metadata.size = 0; + metadata.mtime = TimeManagement::boot_time(); + return metadata; +} + +} diff --git a/Kernel/FileSystem/SysFS/LinkInode.h b/Kernel/FileSystem/SysFS/LinkInode.h new file mode 100644 index 0000000000..750b22b7ef --- /dev/null +++ b/Kernel/FileSystem/SysFS/LinkInode.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Kernel { + +class SysFSLinkInode : public SysFSInode { + friend class SysFS; + +public: + static ErrorOr> try_create(SysFS const&, SysFSComponent const&); + virtual ~SysFSLinkInode() override; + +protected: + SysFSLinkInode(SysFS const&, SysFSComponent const&); + // ^Inode + virtual InodeMetadata metadata() const override; +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h index fc1bb87390..7f92620006 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h @@ -8,7 +8,6 @@ #include #include -#include #include #include #include diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h index b2e0adee02..e491d80af7 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include namespace Kernel { diff --git a/Kernel/FileSystem/SysFS/Subsystems/Kernel/PowerStateSwitch.h b/Kernel/FileSystem/SysFS/Subsystems/Kernel/PowerStateSwitch.h index 1c4c7adfbb..32269b8072 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Kernel/PowerStateSwitch.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Kernel/PowerStateSwitch.h @@ -9,7 +9,6 @@ #include #include -#include #include #include #include diff --git a/Kernel/Syscalls/mount.cpp b/Kernel/Syscalls/mount.cpp index a97425ee40..792169c81e 100644 --- a/Kernel/Syscalls/mount.cpp +++ b/Kernel/Syscalls/mount.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include