diff --git a/kernel/include/kernel/FS/ProcFS/Inode.h b/kernel/include/kernel/FS/ProcFS/Inode.h index 1e937396..c14c6c58 100644 --- a/kernel/include/kernel/FS/ProcFS/Inode.h +++ b/kernel/include/kernel/FS/ProcFS/Inode.h @@ -76,7 +76,7 @@ namespace Kernel class ProcROInode final : public TmpInode { public: - static BAN::ErrorOr> create_new(size_t (*callback)(off_t, BAN::ByteSpan), TmpFileSystem&, mode_t, uid_t, gid_t); + static BAN::ErrorOr> create_new(BAN::ErrorOr (*callback)(off_t, BAN::ByteSpan, void*), TmpFileSystem&, void*, mode_t, uid_t, gid_t); ~ProcROInode() = default; protected: @@ -92,10 +92,11 @@ namespace Kernel virtual bool has_hungup_impl() const override { return false; } private: - ProcROInode(size_t (*callback)(off_t, BAN::ByteSpan), TmpFileSystem&, const TmpInodeInfo&); + ProcROInode(BAN::ErrorOr (*callback)(off_t, BAN::ByteSpan, void*), TmpFileSystem&, void*, const TmpInodeInfo&); private: - size_t (*m_callback)(off_t, BAN::ByteSpan); + BAN::ErrorOr (*m_callback)(off_t, BAN::ByteSpan, void*); + void* m_argument; }; class ProcSymlinkInode final : public TmpInode diff --git a/kernel/kernel/FS/ProcFS/FileSystem.cpp b/kernel/kernel/FS/ProcFS/FileSystem.cpp index 55f224b9..bfb03b57 100644 --- a/kernel/kernel/FS/ProcFS/FileSystem.cpp +++ b/kernel/kernel/FS/ProcFS/FileSystem.cpp @@ -16,22 +16,23 @@ namespace Kernel MUST(s_instance->TmpFileSystem::initialize(0555, 0, 0)); auto meminfo_inode = MUST(ProcROInode::create_new( - [](off_t offset, BAN::ByteSpan buffer) -> size_t + [](off_t offset, BAN::ByteSpan buffer, void*) -> BAN::ErrorOr { ASSERT(offset >= 0); if ((size_t)offset >= sizeof(full_meminfo_t)) return 0; - full_meminfo_t meminfo; - meminfo.page_size = PAGE_SIZE; - meminfo.free_pages = Heap::get().free_pages(); - meminfo.used_pages = Heap::get().used_pages(); + const full_meminfo_t meminfo { + .page_size = PAGE_SIZE, + .free_pages = Heap::get().free_pages(), + .used_pages = Heap::get().used_pages(), + }; size_t bytes = BAN::Math::min(sizeof(full_meminfo_t) - offset, buffer.size()); memcpy(buffer.data(), (uint8_t*)&meminfo + offset, bytes); return bytes; }, - *s_instance, 0444, 0, 0 + *s_instance, nullptr, 0444, 0, 0 )); MUST(static_cast(s_instance->root_inode().ptr())->link_inode(*meminfo_inode, "meminfo"_sv)); diff --git a/kernel/kernel/FS/ProcFS/Inode.cpp b/kernel/kernel/FS/ProcFS/Inode.cpp index 61ee66eb..d199fcf8 100644 --- a/kernel/kernel/FS/ProcFS/Inode.cpp +++ b/kernel/kernel/FS/ProcFS/Inode.cpp @@ -95,19 +95,20 @@ namespace Kernel return (m_process.*m_callback)(); } - BAN::ErrorOr> ProcROInode::create_new(size_t (*callback)(off_t, BAN::ByteSpan), TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid) + BAN::ErrorOr> ProcROInode::create_new(BAN::ErrorOr (*callback)(off_t, BAN::ByteSpan, void*), TmpFileSystem& fs, void* argument, mode_t mode, uid_t uid, gid_t gid) { auto inode_info = create_inode_info(Mode::IFREG | mode, uid, gid); - auto* inode_ptr = new ProcROInode(callback, fs, inode_info); + auto* inode_ptr = new ProcROInode(callback, fs, argument, inode_info); if (inode_ptr == nullptr) return BAN::Error::from_errno(ENOMEM); return BAN::RefPtr::adopt(inode_ptr); } - ProcROInode::ProcROInode(size_t (*callback)(off_t, BAN::ByteSpan), TmpFileSystem& fs, const TmpInodeInfo& inode_info) + ProcROInode::ProcROInode(BAN::ErrorOr (*callback)(off_t, BAN::ByteSpan, void*), TmpFileSystem& fs, void* argument, const TmpInodeInfo& inode_info) : TmpInode(fs, MUST(fs.allocate_inode(inode_info)), inode_info) , m_callback(callback) + , m_argument(argument) { m_mode |= Inode::Mode::IFREG; } @@ -116,7 +117,7 @@ namespace Kernel { if (offset < 0) return BAN::Error::from_errno(EINVAL); - return m_callback(offset, buffer); + return TRY(m_callback(offset, buffer, m_argument)); } BAN::ErrorOr> ProcSymlinkInode::create_new(BAN::ErrorOr (*callback)(void*), void (*destructor)(void*), void* data, TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)