aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-03-21 16:22:23 +0100
committerLukas Oesch <lukasoesch20@gmail.com>2026-03-26 21:17:37 +0100
commit6c172389b562a08a6540574d6fbdf6a5bdce37b8 (patch)
tree117a54580d50a7702f88ea7ff30c9b9c8317b978 /kernel/src/filesystem
parentffb2accb09a013d8da16acd824c846bc1acfd8e4 (diff)
downloadteachos-6c172389b562a08a6540574d6fbdf6a5bdce37b8.tar.xz
teachos-6c172389b562a08a6540574d6fbdf6a5bdce37b8.zip
simplify architecture again
Diffstat (limited to 'kernel/src/filesystem')
-rw-r--r--kernel/src/filesystem/device_file.cpp128
-rw-r--r--kernel/src/filesystem/device_inode.cpp100
-rw-r--r--kernel/src/filesystem/ext2/ext2_inode.cpp15
-rw-r--r--kernel/src/filesystem/file.cpp20
-rw-r--r--kernel/src/filesystem/inode_file.cpp34
-rw-r--r--kernel/src/filesystem/open_file_description.cpp14
-rw-r--r--kernel/src/filesystem/vfs.cpp6
7 files changed, 113 insertions, 204 deletions
diff --git a/kernel/src/filesystem/device_file.cpp b/kernel/src/filesystem/device_file.cpp
deleted file mode 100644
index 26c7511..0000000
--- a/kernel/src/filesystem/device_file.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#include "kernel/filesystem/device_file.hpp"
-
-#include "kapi/system.hpp"
-
-#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>
-#include <kstd/vector>
-
-#include <algorithm>
-#include <cstddef>
-
-namespace filesystem
-{
- device_file::device_file(kstd::shared_ptr<inode> const & inode)
- : file(inode)
- {
- if (!m_inode->is_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 (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,
- std::byte * scratch, void * buffer) {
- auto * out = static_cast<std::byte *>(buffer);
- if (off == 0 && len == device->block_size())
- {
- device->read_block(idx, out + done);
- }
- else
- {
- device->read_block(idx, scratch);
- kstd::libc::memcpy(out + done, scratch + off, len);
- }
- });
- }
- else
- {
- kapi::system::panic("[FILESYSTEM] device_file::read called on non-block device.");
- }
- }
-
- auto device_file::write(void const * buffer, size_t offset, size_t size) -> size_t
- {
- 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,
- std::byte * scratch, void * buffer) {
- auto const * in = static_cast<std::byte const *>(buffer);
- if (off == 0 && len == device->block_size())
- {
- device->write_block(idx, in + done);
- }
- else
- {
- device->read_block(idx, scratch);
- kstd::libc::memcpy(scratch + off, in + done, len);
- device->write_block(idx, scratch);
- }
- });
- }
- else
- {
- kapi::system::panic("[FILESYSTEM] device_file::write called on non-block device.");
- }
- }
-
- auto device_file::process_blocks(size_t offset, size_t size, void * buffer, block_op op) const -> size_t
- {
- if (buffer == nullptr)
- {
- kapi::system::panic("[FILESYSTEM] device_file::process_blocks called with null buffer.");
- }
-
- if (size == 0)
- {
- return 0;
- }
-
- auto * block_dev = static_cast<devices::block_device *>(device().get());
- if (block_dev == nullptr)
- {
- kapi::system::panic("[FILESYSTEM] device_file: expected block_device.");
- }
-
- size_t const block_size = block_dev->block_size();
- size_t const capacity = block_dev->capacity();
-
- if (offset >= capacity)
- return 0;
- size_t const total_to_process = std::min(size, capacity - offset);
-
- kstd::vector<std::byte> scratch_buffer{block_size};
- auto processed = 0uz;
-
- while (processed < total_to_process)
- {
- size_t const absolute_offset = offset + processed;
- size_t const block_index = absolute_offset / block_size;
- size_t const in_block_offset = absolute_offset % block_size;
- size_t const chunk_size = std::min(total_to_process - processed, block_size - in_block_offset);
-
- op(block_index, in_block_offset, chunk_size, processed, block_dev, scratch_buffer.data(), buffer);
-
- processed += chunk_size;
- }
-
- 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 b9ccd6d..812b43a 100644
--- a/kernel/src/filesystem/device_inode.cpp
+++ b/kernel/src/filesystem/device_inode.cpp
@@ -2,12 +2,16 @@
#include "kapi/system.hpp"
+#include "kernel/devices/block_device.hpp"
#include "kernel/devices/device.hpp"
-#include "kernel/filesystem/device_file.hpp"
-#include "kernel/filesystem/file.hpp"
#include "kernel/filesystem/inode.hpp"
+#include <kstd/cstring>
#include <kstd/memory>
+#include <kstd/vector>
+
+#include <algorithm>
+#include <cstddef>
namespace filesystem
{
@@ -21,13 +25,97 @@ namespace filesystem
}
}
- auto device_inode::open_file() -> kstd::shared_ptr<file>
+ auto device_inode::read(void * buffer, size_t offset, size_t size) const -> size_t
{
- return kstd::make_shared<device_file>(shared_from_this());
+ if (m_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,
+ std::byte * scratch, void * buffer) {
+ auto * out = static_cast<std::byte *>(buffer);
+ if (off == 0 && len == device->block_size())
+ {
+ device->read_block(idx, out + done);
+ }
+ else
+ {
+ device->read_block(idx, scratch);
+ kstd::libc::memcpy(out + done, scratch + off, len);
+ }
+ });
+ }
+ else
+ {
+ kapi::system::panic("[FILESYSTEM] device_file::read called on non-block device.");
+ }
}
- auto device_inode::device() const -> kstd::shared_ptr<devices::device> const &
+ auto device_inode::write(void const * buffer, size_t offset, size_t size) -> size_t
{
- return m_device;
+ if (m_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,
+ std::byte * scratch, void * buffer) {
+ auto const * in = static_cast<std::byte const *>(buffer);
+ if (off == 0 && len == device->block_size())
+ {
+ device->write_block(idx, in + done);
+ }
+ else
+ {
+ device->read_block(idx, scratch);
+ kstd::libc::memcpy(scratch + off, in + done, len);
+ device->write_block(idx, scratch);
+ }
+ });
+ }
+ else
+ {
+ kapi::system::panic("[FILESYSTEM] device_file::write called on non-block device.");
+ }
+ }
+
+ auto device_inode::process_blocks(size_t offset, size_t size, void * buffer, block_op op) const -> size_t
+ {
+ if (buffer == nullptr)
+ {
+ kapi::system::panic("[FILESYSTEM] device_file::process_blocks called with null buffer.");
+ }
+
+ if (size == 0)
+ {
+ return 0;
+ }
+
+ auto * block_dev = static_cast<devices::block_device *>(m_device.get());
+ if (block_dev == nullptr)
+ {
+ kapi::system::panic("[FILESYSTEM] device_file: expected block_device.");
+ }
+
+ size_t const block_size = block_dev->block_size();
+ size_t const capacity = block_dev->capacity();
+
+ if (offset >= capacity)
+ return 0;
+ size_t const total_to_process = std::min(size, capacity - offset);
+
+ kstd::vector<std::byte> scratch_buffer{block_size};
+ auto processed = 0uz;
+
+ while (processed < total_to_process)
+ {
+ size_t const absolute_offset = offset + processed;
+ size_t const block_index = absolute_offset / block_size;
+ size_t const in_block_offset = absolute_offset % block_size;
+ size_t const chunk_size = std::min(total_to_process - processed, block_size - in_block_offset);
+
+ op(block_index, in_block_offset, chunk_size, processed, block_dev, scratch_buffer.data(), buffer);
+
+ processed += chunk_size;
+ }
+
+ return processed;
}
} // 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 0760cb1..3cc0fb2 100644
--- a/kernel/src/filesystem/ext2/ext2_inode.cpp
+++ b/kernel/src/filesystem/ext2/ext2_inode.cpp
@@ -1,10 +1,8 @@
#include "kernel/filesystem/ext2/ext2_inode.hpp"
-#include "kernel/filesystem/file.hpp"
#include "kernel/filesystem/inode.hpp"
-#include "kernel/filesystem/inode_file.hpp"
-#include <kstd/memory>
+#include <cstddef>
namespace filesystem::ext2
{
@@ -12,8 +10,15 @@ namespace filesystem::ext2
: inode(inode_kind::regular)
{}
- auto ext2_inode::open_file() -> kstd::shared_ptr<filesystem::file>
+ auto ext2_inode::read(void * /*buffer*/, size_t /*offset*/, size_t /*size*/) const -> size_t
{
- return kstd::make_shared<inode_file>(shared_from_this());
+ // TODO BA-FS26 implement
+ return 0;
+ }
+
+ auto ext2_inode::write(void const * /*buffer*/, size_t /*offset*/, size_t /*size*/) -> size_t
+ {
+ // TODO BA-FS26 implement
+ return 0;
}
} // namespace filesystem::ext2 \ No newline at end of file
diff --git a/kernel/src/filesystem/file.cpp b/kernel/src/filesystem/file.cpp
deleted file mode 100644
index a147863..0000000
--- a/kernel/src/filesystem/file.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#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
deleted file mode 100644
index 8b2fcba..0000000
--- a/kernel/src/filesystem/inode_file.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "kernel/filesystem/inode_file.hpp"
-
-#include "kapi/system.hpp"
-
-#include "kernel/filesystem/file.hpp"
-#include "kernel/filesystem/inode.hpp"
-
-#include <kstd/memory>
-
-#include <cstddef>
-
-namespace filesystem
-{
- inode_file::inode_file(kstd::shared_ptr<inode> const & inode)
- : file(inode)
- {
- if (m_inode->is_device())
- {
- 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
- {
- // TODO BA-FS26
- return 0;
- }
-
- auto inode_file::write(void const * /*buffer*/, size_t /*offset*/, size_t /*size*/) -> size_t
- {
- // TODO BA-FS26
- return 0;
- }
-} // namespace filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/open_file_description.cpp b/kernel/src/filesystem/open_file_description.cpp
index ff4d678..93c38ac 100644
--- a/kernel/src/filesystem/open_file_description.cpp
+++ b/kernel/src/filesystem/open_file_description.cpp
@@ -1,6 +1,6 @@
#include "kernel/filesystem/open_file_description.hpp"
-#include "kernel/filesystem/file.hpp"
+#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
#include <kstd/os/error.hpp>
@@ -9,26 +9,26 @@
namespace filesystem
{
- open_file_description::open_file_description(kstd::shared_ptr<file> const & file)
- : m_file(file)
+ open_file_description::open_file_description(kstd::shared_ptr<inode> const & inode)
+ : m_inode(inode)
, m_offset(0)
{
- if (!file)
+ if (!inode)
{
- kstd::os::panic("[FILESYSTEM] open_file_description constructed with null file.");
+ kstd::os::panic("[FILESYSTEM] open_file_description constructed with null inode.");
}
}
auto open_file_description::read(void * buffer, size_t size) -> size_t
{
- auto read_bytes = m_file->read(buffer, m_offset, size);
+ auto read_bytes = m_inode->read(buffer, m_offset, size);
m_offset += read_bytes;
return read_bytes;
}
auto open_file_description::write(void const * buffer, size_t size) -> size_t
{
- auto written_bytes = m_file->write(buffer, m_offset, size);
+ auto written_bytes = m_inode->write(buffer, m_offset, size);
m_offset += written_bytes;
return written_bytes;
}
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index 2316de0..86991ea 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -68,11 +68,9 @@ namespace filesystem
{
if (auto custody = resolve_path(path))
{
- auto node = custody->get_inode();
-
- if (auto opened_file = node->open_file())
+ if (auto node = custody->get_inode())
{
- return kstd::make_shared<open_file_description>(opened_file);
+ return kstd::make_shared<open_file_description>(node);
}
kapi::system::panic("[FILESYSTEM] inode::open_file returned null file.");