From 81627cf7d539b3aa15773967f6c3d7c6e7ca86be Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 26 Oct 2018 18:43:25 +0200 Subject: [PATCH] Add a simple /proc/mounts that enumerates the current VFS mounts. --- Kernel/Console.h | 2 +- Kernel/MemoryManager.h | 2 +- Kernel/ProcFileSystem.cpp | 17 +++++++++++++ Kernel/ProcFileSystem.h | 2 +- VirtualFileSystem/VirtualFileSystem.cpp | 7 ++++++ VirtualFileSystem/VirtualFileSystem.h | 33 ++++++++++++++----------- 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/Kernel/Console.h b/Kernel/Console.h index 18f3882924..3d82cb126e 100644 --- a/Kernel/Console.h +++ b/Kernel/Console.h @@ -4,7 +4,7 @@ class Console final : public CharacterDevice { public: - static Console& the(); + static Console& the() PURE; Console(); virtual ~Console() override; diff --git a/Kernel/MemoryManager.h b/Kernel/MemoryManager.h index 7b1a607914..d2873c0d79 100644 --- a/Kernel/MemoryManager.h +++ b/Kernel/MemoryManager.h @@ -37,7 +37,7 @@ bool copyToZone(Zone&, const void* data, size_t); class MemoryManager { public: - static MemoryManager& the(); + static MemoryManager& the() PURE; PhysicalAddress pageDirectoryBase() const { return PhysicalAddress(reinterpret_cast(m_pageDirectory)); } diff --git a/Kernel/ProcFileSystem.cpp b/Kernel/ProcFileSystem.cpp index 5f79b448c1..8c594eecf1 100644 --- a/Kernel/ProcFileSystem.cpp +++ b/Kernel/ProcFileSystem.cpp @@ -1,5 +1,6 @@ #include "ProcFileSystem.h" #include "Task.h" +#include static ProcFileSystem* s_the; @@ -64,6 +65,22 @@ bool ProcFileSystem::initialize() { SyntheticFileSystem::initialize(); + addFile(createGeneratedFile("mounts", [] { + InterruptDisabler disabler; + auto buffer = ByteBuffer::createUninitialized(VirtualFileSystem::the().mountCount() * 80); + char* ptr = (char*)buffer.pointer(); + VirtualFileSystem::the().forEachMount([&ptr] (auto& mount) { + auto& fs = mount.fileSystem(); + ptr += ksprintf(ptr, "%s @ ", fs.className()); + if (!mount.host().isValid()) + ptr += ksprintf(ptr, "/\n", fs.className()); + else + ptr += ksprintf(ptr, "%u:%u\n", mount.host().fileSystemID(), mount.host().index()); + }); + buffer.trim(ptr - (char*)buffer.pointer()); + return buffer; + })); + addFile(createGeneratedFile("kmalloc", [] { InterruptDisabler disabler; auto buffer = ByteBuffer::createUninitialized(128); diff --git a/Kernel/ProcFileSystem.h b/Kernel/ProcFileSystem.h index f7602cc20f..954c4e4dea 100644 --- a/Kernel/ProcFileSystem.h +++ b/Kernel/ProcFileSystem.h @@ -7,7 +7,7 @@ class Task; class ProcFileSystem final : public SyntheticFileSystem { public: - static ProcFileSystem& the(); + static ProcFileSystem& the() PURE; virtual ~ProcFileSystem() override; static RetainPtr create(); diff --git a/VirtualFileSystem/VirtualFileSystem.cpp b/VirtualFileSystem/VirtualFileSystem.cpp index 3b5a2ccd7f..f7c91d38d7 100644 --- a/VirtualFileSystem/VirtualFileSystem.cpp +++ b/VirtualFileSystem/VirtualFileSystem.cpp @@ -501,3 +501,10 @@ void VirtualFileSystem::registerCharacterDevice(unsigned major, unsigned minor, { m_characterDevices.set(encodedDevice(major, minor), &device); } + +void VirtualFileSystem::forEachMount(Function callback) const +{ + for (auto& mount : m_mounts) { + callback(*mount); + } +} diff --git a/VirtualFileSystem/VirtualFileSystem.h b/VirtualFileSystem/VirtualFileSystem.h index 6c20bc6ad1..f23da02f6a 100644 --- a/VirtualFileSystem/VirtualFileSystem.h +++ b/VirtualFileSystem/VirtualFileSystem.h @@ -20,6 +20,21 @@ public: static void initializeGlobals(); static SpinLock& lock(); + class Mount { + public: + Mount(InodeIdentifier host, RetainPtr&&); + + InodeIdentifier host() const { return m_host; } + InodeIdentifier guest() const { return m_guest; } + + const FileSystem& fileSystem() const { return *m_fileSystem; } + + private: + InodeIdentifier m_host; + InodeIdentifier m_guest; + RetainPtr m_fileSystem; + }; + struct Node { InodeIdentifier inode; const InodeMetadata& metadata() const; @@ -46,7 +61,7 @@ public: mutable InodeMetadata m_cachedMetadata; }; - static VirtualFileSystem& the(); + static VirtualFileSystem& the() PURE; VirtualFileSystem(); ~VirtualFileSystem(); @@ -74,6 +89,9 @@ public: void registerCharacterDevice(unsigned major, unsigned minor, CharacterDevice&); + size_t mountCount() const { return m_mounts.size(); } + void forEachMount(Function) const; + private: friend class FileHandle; @@ -88,19 +106,6 @@ private: RetainPtr makeNode(InodeIdentifier); RetainPtr getOrCreateNode(InodeIdentifier); - class Mount { - public: - Mount(InodeIdentifier host, RetainPtr&&); - - InodeIdentifier host() const { return m_host; } - InodeIdentifier guest() const { return m_guest; } - - private: - InodeIdentifier m_host; - InodeIdentifier m_guest; - RetainPtr m_fileSystem; - }; - Mount* findMountForHost(InodeIdentifier); Mount* findMountForGuest(InodeIdentifier);