From e0ca6bb97e2e33e3a773ba45687ecf697234ef22 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 9 Nov 2018 17:46:55 +0100 Subject: [PATCH] Add /proc/vnodes, listing basic info about all open vnodes. --- Kernel/ProcFileSystem.cpp | 24 ++++++++++++++++++++++++ VirtualFileSystem/VirtualFileSystem.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/Kernel/ProcFileSystem.cpp b/Kernel/ProcFileSystem.cpp index 457397b06b..f63b540996 100644 --- a/Kernel/ProcFileSystem.cpp +++ b/Kernel/ProcFileSystem.cpp @@ -319,6 +319,29 @@ ByteBuffer procfs$summary() return buffer; } +ByteBuffer procfs$vnodes() +{ + auto& vfs = VirtualFileSystem::the(); + auto buffer = ByteBuffer::createUninitialized(vfs.m_maxNodeCount * 256); + char* ptr = (char*)buffer.pointer(); + for (size_t i = 0; i < vfs.m_maxNodeCount; ++i) { + auto& vnode = vfs.m_nodes[i]; + if (!vnode.inUse()) + continue; + auto path = vfs.absolutePath(vnode.inode); + if (path.isEmpty()) { + if (auto* dev = vnode.characterDevice()) { + if (dev->isTTY()) + path = static_cast(dev)->ttyName(); + } + } + ptr += ksprintf(ptr, "vnode %03u: %02u:%08u (%u) %s\n", i, vnode.inode.fileSystemID(), vnode.inode.index(), vnode.retain_count(), path.characters()); + } + *ptr = '\0'; + buffer.trim(ptr - (char*)buffer.pointer()); + return buffer; +} + bool ProcFileSystem::initialize() { SyntheticFileSystem::initialize(); @@ -328,6 +351,7 @@ bool ProcFileSystem::initialize() addFile(createGeneratedFile("kmalloc", procfs$kmalloc)); addFile(createGeneratedFile("summary", procfs$summary)); addFile(createGeneratedFile("cpuinfo", procfs$cpuinfo)); + addFile(createGeneratedFile("vnodes", procfs$vnodes)); return true; } diff --git a/VirtualFileSystem/VirtualFileSystem.h b/VirtualFileSystem/VirtualFileSystem.h index a9afa9c33f..3ef1597899 100644 --- a/VirtualFileSystem/VirtualFileSystem.h +++ b/VirtualFileSystem/VirtualFileSystem.h @@ -28,6 +28,7 @@ inline constexpr dword encodedDevice(unsigned major, unsigned minor) class VirtualFileSystem { AK_MAKE_ETERNAL + friend ByteBuffer procfs$vnodes(); public: static void initializeGlobals(); @@ -68,6 +69,8 @@ public: void* vmo() { return m_vmo; } void set_vmo(void* vmo) { m_vmo = vmo; } + unsigned retain_count() const { return retainCount; } + private: friend class VirtualFileSystem; VirtualFileSystem* m_vfs { nullptr };