diff options
| author | Lukas Oesch <lukasoesch20@gmail.com> | 2026-03-21 00:28:17 +0100 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-03-26 21:17:33 +0100 |
| commit | ba63fbfc2bb43a6f0f05b6b49fd51fd6c89a0861 (patch) | |
| tree | 87f30fe5d929c170d4eecbdf2989773c821d537a /kernel/src/filesystem | |
| parent | 90452b752688110db2edc8d5dccdf0d6e0face5f (diff) | |
| download | teachos-ba63fbfc2bb43a6f0f05b6b49fd51fd6c89a0861.tar.xz teachos-ba63fbfc2bb43a6f0f05b6b49fd51fd6c89a0861.zip | |
refactor file and inode architecture again
Diffstat (limited to 'kernel/src/filesystem')
| -rw-r--r-- | kernel/src/filesystem/device_file.cpp | 25 | ||||
| -rw-r--r-- | kernel/src/filesystem/device_inode.cpp | 14 | ||||
| -rw-r--r-- | kernel/src/filesystem/ext2/ext2_inode.cpp | 15 | ||||
| -rw-r--r-- | kernel/src/filesystem/file.cpp | 20 | ||||
| -rw-r--r-- | kernel/src/filesystem/inode_file.cpp | 21 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 5 |
6 files changed, 74 insertions, 26 deletions
diff --git a/kernel/src/filesystem/device_file.cpp b/kernel/src/filesystem/device_file.cpp index 48ed20d..26c7511 100644 --- a/kernel/src/filesystem/device_file.cpp +++ b/kernel/src/filesystem/device_file.cpp @@ -4,6 +4,9 @@ #include "kernel/devices/block_device.hpp" #include "kernel/devices/device.hpp" +#include "kernel/filesystem/device_inode.hpp" +#include "kernel/filesystem/file.hpp" +#include "kernel/filesystem/inode.hpp" #include <kstd/cstring> #include <kstd/memory> @@ -14,18 +17,18 @@ namespace filesystem { - device_file::device_file(kstd::shared_ptr<devices::device> const & device) - : m_device(device) + device_file::device_file(kstd::shared_ptr<inode> const & inode) + : file(inode) { - if (!m_device) + if (!m_inode->is_device()) { - kapi::system::panic("[FILESYSTEM] device_file constructed with null device."); + kapi::system::panic("[FILESYSTEM] device_file constructed with non-device inode."); } } auto device_file::read(void * buffer, size_t offset, size_t size) const -> size_t { - if (m_device->is_block_device()) + if (device()->is_block_device()) { return process_blocks(offset, size, buffer, [](size_t idx, size_t off, size_t len, size_t done, devices::block_device * device, @@ -50,7 +53,7 @@ namespace filesystem auto device_file::write(void const * buffer, size_t offset, size_t size) -> size_t { - if (m_device->is_block_device()) + if (device()->is_block_device()) { return process_blocks(offset, size, const_cast<void *>(buffer), [](size_t idx, size_t off, size_t len, size_t done, devices::block_device * device, @@ -78,7 +81,7 @@ namespace filesystem { if (buffer == nullptr) { - kapi::system::panic("[FILESYSTEM] device_file::write called with null buffer."); + kapi::system::panic("[FILESYSTEM] device_file::process_blocks called with null buffer."); } if (size == 0) @@ -86,7 +89,7 @@ namespace filesystem return 0; } - auto * block_dev = static_cast<devices::block_device *>(m_device.get()); + auto * block_dev = static_cast<devices::block_device *>(device().get()); if (block_dev == nullptr) { kapi::system::panic("[FILESYSTEM] device_file: expected block_device."); @@ -116,4 +119,10 @@ namespace filesystem return processed; } + + auto device_file::device() const -> kstd::shared_ptr<devices::device> const & + { + auto inode = static_cast<device_inode *>(m_inode.get()); + return inode->device(); + } } // namespace filesystem diff --git a/kernel/src/filesystem/device_inode.cpp b/kernel/src/filesystem/device_inode.cpp index 592637d..65dd9a3 100644 --- a/kernel/src/filesystem/device_inode.cpp +++ b/kernel/src/filesystem/device_inode.cpp @@ -21,8 +21,18 @@ namespace filesystem } } - auto device_inode::open_file() const -> kstd::shared_ptr<file> + auto device_inode::open_file(kstd::shared_ptr<inode> const & self) const -> kstd::shared_ptr<file> { - return kstd::make_shared<device_file>(m_device); + if (!self) + { + kapi::system::panic("[FILESYSTEM] device_inode::open_file called with null inode."); + } + + return kstd::make_shared<device_file>(self); + } + + auto device_inode::device() const -> kstd::shared_ptr<devices::device> const & + { + return m_device; } } // namespace filesystem
\ No newline at end of file diff --git a/kernel/src/filesystem/ext2/ext2_inode.cpp b/kernel/src/filesystem/ext2/ext2_inode.cpp index 8131f43..0a1994b 100644 --- a/kernel/src/filesystem/ext2/ext2_inode.cpp +++ b/kernel/src/filesystem/ext2/ext2_inode.cpp @@ -1,6 +1,7 @@ #include "kernel/filesystem/ext2/ext2_inode.hpp" -#include "kernel/filesystem/disk_file.hpp" +#include "kapi/system.hpp" + #include "kernel/filesystem/file.hpp" #include "kernel/filesystem/inode.hpp" #include "kernel/filesystem/inode_file.hpp" @@ -9,13 +10,17 @@ namespace filesystem::ext2 { - ext2_inode::ext2_inode(kstd::shared_ptr<disk_file> const & disk_file) + ext2_inode::ext2_inode() : inode(inode_kind::regular) - , m_disk_file(disk_file) {} - auto ext2_inode::open_file() const -> kstd::shared_ptr<file> + auto ext2_inode::open_file(kstd::shared_ptr<inode> const & self) const -> kstd::shared_ptr<filesystem::file> { - return kstd::make_shared<inode_file>(m_disk_file); + if (!self) + { + kapi::system::panic("[FILESYSTEM] ext2_inode::open_file called with null inode."); + } + + return kstd::make_shared<inode_file>(self); } } // namespace filesystem::ext2
\ No newline at end of file diff --git a/kernel/src/filesystem/file.cpp b/kernel/src/filesystem/file.cpp new file mode 100644 index 0000000..a147863 --- /dev/null +++ b/kernel/src/filesystem/file.cpp @@ -0,0 +1,20 @@ +#include "kernel/filesystem/file.hpp" + +#include "kapi/system.hpp" + +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> + +namespace filesystem +{ + + file::file(kstd::shared_ptr<inode> const & inode) + : m_inode(inode) + { + if (!m_inode) + { + kapi::system::panic("[FILESYSTEM] file constructed with null inode."); + } + } +} // namespace filesystem
\ No newline at end of file diff --git a/kernel/src/filesystem/inode_file.cpp b/kernel/src/filesystem/inode_file.cpp index 9c351da..8b2fcba 100644 --- a/kernel/src/filesystem/inode_file.cpp +++ b/kernel/src/filesystem/inode_file.cpp @@ -2,7 +2,8 @@ #include "kapi/system.hpp" -#include "kernel/filesystem/disk_file.hpp" +#include "kernel/filesystem/file.hpp" +#include "kernel/filesystem/inode.hpp" #include <kstd/memory> @@ -10,22 +11,24 @@ namespace filesystem { - inode_file::inode_file(kstd::shared_ptr<disk_file> const & disk_file) - : m_disk_file(disk_file) + inode_file::inode_file(kstd::shared_ptr<inode> const & inode) + : file(inode) { - if (!m_disk_file) + if (m_inode->is_device()) { - kapi::system::panic("[FILESYSTEM] inode_file constructed with null disk_file."); + kapi::system::panic("[FILESYSTEM] inode_file constructed with device inode."); } } - auto inode_file::read(void * buffer, size_t offset, size_t size) const -> size_t + auto inode_file::read(void * /*buffer*/, size_t /*offset*/, size_t /*size*/) const -> size_t { - return m_disk_file->read(buffer, offset, size); + // TODO BA-FS26 + return 0; } - auto inode_file::write(void const * buffer, size_t offset, size_t size) -> size_t + auto inode_file::write(void const * /*buffer*/, size_t /*offset*/, size_t /*size*/) -> size_t { - return m_disk_file->write(buffer, offset, size); + // TODO BA-FS26 + return 0; } } // namespace filesystem
\ No newline at end of file diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index ee5fd9b..5330b82 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -34,6 +34,7 @@ namespace filesystem active_vfs.emplace(vfs{}); auto storage_mgmt = devices::storage::storage_management::get(); + // TODO BA-FS26 fix mounting boot_device if (auto boot_device = storage_mgmt.determine_boot_device()) { active_vfs->m_root_fs = kstd::make_shared<ext2::ext2_filesystem>(); @@ -69,9 +70,9 @@ namespace filesystem { auto node = custody->get_inode(); - if (auto current_inode_file = node->open_file()) + if (auto opened_file = node->open_file(node)) { - return kstd::make_shared<open_file_description>(current_inode_file); + return kstd::make_shared<open_file_description>(opened_file); } kapi::system::panic("[FILESYSTEM] inode::open_file returned null file."); |
