diff options
Diffstat (limited to 'kernel/filesystem')
20 files changed, 110 insertions, 92 deletions
diff --git a/kernel/filesystem/include/filesystem/custody.hpp b/kernel/filesystem/include/filesystem/custody.hpp index 9ee984d..b6eae22 100644 --- a/kernel/filesystem/include/filesystem/custody.hpp +++ b/kernel/filesystem/include/filesystem/custody.hpp @@ -3,18 +3,20 @@ #include "filesystem/inode.hpp" +#include <kstd/memory> + namespace filesystem { struct custody { - custody(custody * parent, inode * node); + custody(kstd::shared_ptr<custody> parent, kstd::shared_ptr<inode> node); - [[nodiscard]] auto get_inode() const -> inode *; - [[nodiscard]] auto get_parent() const -> custody *; + [[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode>; + [[nodiscard]] auto get_parent() const -> kstd::shared_ptr<custody>; private: - custody * m_parent; - inode * m_inode; + kstd::shared_ptr<custody> m_parent; + kstd::shared_ptr<inode> m_inode; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/device_file.hpp b/kernel/filesystem/include/filesystem/device_file.hpp index 033317b..4dce37f 100644 --- a/kernel/filesystem/include/filesystem/device_file.hpp +++ b/kernel/filesystem/include/filesystem/device_file.hpp @@ -5,13 +5,15 @@ #include "devices/device.hpp" #include "filesystem/file.hpp" +#include <kstd/memory> + #include <cstddef> namespace filesystem { struct device_file : file { - explicit device_file(devices::device * device); + explicit device_file(kstd::shared_ptr<devices::device> device); auto open() -> void override; @@ -23,7 +25,7 @@ namespace filesystem std::byte * scratch, void * buffer); auto process_blocks(size_t offset, size_t size, void * buffer, block_op op) const -> size_t; - devices::device * m_device; + kstd::shared_ptr<devices::device> m_device; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp b/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp index cba2192..dd52e72 100644 --- a/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp +++ b/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp @@ -5,17 +5,19 @@ #include "filesystem/filesystem.hpp" #include "filesystem/inode.hpp" +#include <kstd/memory> + #include <string_view> namespace filesystem::ext2 { struct ext2_filesystem : filesystem { - auto mount(devices::device * device) -> int override; + auto mount(kstd::shared_ptr<devices::device> device) -> int override; auto lookup(inode const & parent, std::string_view name) -> inode * override; private: - devices::device * m_device{}; + kstd::shared_ptr<devices::device> m_device{}; }; } // namespace filesystem::ext2 diff --git a/kernel/filesystem/include/filesystem/file_descriptor_table.hpp b/kernel/filesystem/include/filesystem/file_descriptor_table.hpp index 3ac03d1..6d78532 100644 --- a/kernel/filesystem/include/filesystem/file_descriptor_table.hpp +++ b/kernel/filesystem/include/filesystem/file_descriptor_table.hpp @@ -3,7 +3,8 @@ #include "open_file_description.hpp" -#include <array> +#include <kstd/vector> + #include <optional> namespace filesystem @@ -23,8 +24,7 @@ namespace filesystem file_descriptor_table() = default; // TODO BA-FS26 use kstd::shared_ptr when available - // TODO BA-FS26 use kstd::vector when available - std::array<std::optional<open_file_description>, 32> m_open_files{}; + kstd::vector<std::optional<open_file_description>> m_open_files{}; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/filesystem.hpp b/kernel/filesystem/include/filesystem/filesystem.hpp index 8deb336..eabefc0 100644 --- a/kernel/filesystem/include/filesystem/filesystem.hpp +++ b/kernel/filesystem/include/filesystem/filesystem.hpp @@ -4,6 +4,8 @@ #include "devices/device.hpp" #include "filesystem/inode.hpp" +#include <kstd/memory> + #include <string_view> namespace filesystem @@ -12,11 +14,10 @@ namespace filesystem { virtual ~filesystem() = default; - virtual auto mount(devices::device * device) -> int = 0; + virtual auto mount(kstd::shared_ptr<devices::device> device) -> int = 0; virtual auto lookup(inode const & parent, std::string_view name) -> inode * = 0; - [[nodiscard]] auto root_inode() -> inode *; - [[nodiscard]] auto root_inode() const -> inode const *; + [[nodiscard]] auto root_inode() const -> inode const &; protected: inode m_root_inode{}; // TODO BA-FS26 set during mount? diff --git a/kernel/filesystem/include/filesystem/inode.hpp b/kernel/filesystem/include/filesystem/inode.hpp index bceabb6..2b5ee6c 100644 --- a/kernel/filesystem/include/filesystem/inode.hpp +++ b/kernel/filesystem/include/filesystem/inode.hpp @@ -4,6 +4,8 @@ #include "devices/device.hpp" #include "filesystem/inode_metadata.hpp" +#include <kstd/memory> + #include <cstddef> namespace filesystem @@ -12,7 +14,7 @@ namespace filesystem { inode() = default; explicit inode(inode_kind kind); - explicit inode(devices::device * device); + explicit inode(kstd::shared_ptr<devices::device> device); [[nodiscard]] auto metadata() const -> inode_metadata; @@ -22,14 +24,14 @@ namespace filesystem [[nodiscard]] auto is_block_device() const -> bool; [[nodiscard]] auto major_device() const -> size_t; [[nodiscard]] auto minor_device() const -> size_t; - [[nodiscard]] auto backing_device() const -> devices::device *; + [[nodiscard]] auto backing_device() const -> kstd::shared_ptr<devices::device>; auto read(void * buffer, size_t offset, size_t size) const -> size_t; auto write(void const * buffer, size_t offset, size_t size) -> size_t; private: inode_kind m_kind{inode_kind::regular}; - devices::device * m_device{}; + kstd::shared_ptr<devices::device> m_device{}; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/inode_file.hpp b/kernel/filesystem/include/filesystem/inode_file.hpp index c091280..512f51d 100644 --- a/kernel/filesystem/include/filesystem/inode_file.hpp +++ b/kernel/filesystem/include/filesystem/inode_file.hpp @@ -4,13 +4,15 @@ #include "filesystem/file.hpp" #include "filesystem/inode.hpp" +#include <kstd/memory> + #include <cstddef> namespace filesystem { struct inode_file : file { - explicit inode_file(inode * inode); + explicit inode_file(kstd::shared_ptr<inode> inode); auto open() -> void override; @@ -18,7 +20,7 @@ namespace filesystem auto write(void const * buffer, size_t offset, size_t size) -> size_t override; private: - inode * m_inode; + kstd::shared_ptr<inode> m_inode; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/mount.hpp b/kernel/filesystem/include/filesystem/mount.hpp index fe5d9cc..f28de74 100644 --- a/kernel/filesystem/include/filesystem/mount.hpp +++ b/kernel/filesystem/include/filesystem/mount.hpp @@ -3,21 +3,22 @@ #include "filesystem/filesystem.hpp" +#include <kstd/memory> + #include <string_view> namespace filesystem { struct mount { - mount() = default; // TODO BA-FS26 remove again when kstd::vector is available and used in vfs - mount(std::string_view const & path, filesystem * fs); + mount(std::string_view const & path, kstd::shared_ptr<filesystem> fs); [[nodiscard]] auto path() const -> std::string_view; - [[nodiscard]] auto get_filesystem() const -> filesystem *; + [[nodiscard]] auto get_filesystem() const -> kstd::shared_ptr<filesystem>; private: std::string_view m_path; - filesystem * m_filesystem{}; + kstd::shared_ptr<filesystem> m_filesystem{}; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/open_file_description.hpp b/kernel/filesystem/include/filesystem/open_file_description.hpp index 1589196..035b0ee 100644 --- a/kernel/filesystem/include/filesystem/open_file_description.hpp +++ b/kernel/filesystem/include/filesystem/open_file_description.hpp @@ -2,6 +2,7 @@ #define TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTION_HPP #include "file.hpp" +#include <kstd/memory> #include <cstddef> @@ -9,7 +10,7 @@ namespace filesystem { struct open_file_description { - open_file_description(file * file); + open_file_description(kstd::shared_ptr<file> file); ~open_file_description() = default; @@ -17,7 +18,7 @@ namespace filesystem auto write(void const * buffer, size_t size) -> size_t; private: - file * m_file; + kstd::shared_ptr<file> m_file; size_t m_offset; }; diff --git a/kernel/filesystem/include/filesystem/vfs.hpp b/kernel/filesystem/include/filesystem/vfs.hpp index 1d95d4a..9c89044 100644 --- a/kernel/filesystem/include/filesystem/vfs.hpp +++ b/kernel/filesystem/include/filesystem/vfs.hpp @@ -3,11 +3,14 @@ #include "devices/device.hpp" #include "filesystem/custody.hpp" +#include "filesystem/ext2/ext2_filesystem.hpp" #include "filesystem/inode.hpp" #include "filesystem/mount.hpp" #include "filesystem/open_file_description.hpp" -#include <array> +#include <kstd/memory> +#include <kstd/vector> + #include <optional> #include <string_view> @@ -26,17 +29,17 @@ namespace filesystem struct device_node_entry { std::string_view name; - inode node; + kstd::shared_ptr<inode> node; }; vfs() = default; - auto make_device_node(devices::device * device) -> void; + auto make_device_node(kstd::shared_ptr<devices::device> device) -> void; [[nodiscard]] auto resolve_path(std::string_view path) -> std::optional<custody>; + kstd::shared_ptr<ext2::ext2_filesystem> m_root_fs; std::optional<mount> m_root_mount; - std::array<mount, 10> m_mounts; // TODO BA-FS26 remove when kstd::vector is available and used - std::array<std::optional<device_node_entry>, 10> - m_device_nodes; // TODO BA-FS26 use kstd::vector // TODO BA-FS26 remove again, use + // kstd::vector<mount> m_mounts; // TODO BA-FS26 really needed? + kstd::vector<std::optional<device_node_entry>> m_device_nodes; // TODO BA-FS26 remove again, use devtempfs }; } // namespace filesystem diff --git a/kernel/filesystem/src/custody.cpp b/kernel/filesystem/src/custody.cpp index 614e63b..7a58229 100644 --- a/kernel/filesystem/src/custody.cpp +++ b/kernel/filesystem/src/custody.cpp @@ -4,9 +4,11 @@ #include "filesystem/inode.hpp" +#include <kstd/memory> + namespace filesystem { - custody::custody(custody * parent, inode * node) + custody::custody(kstd::shared_ptr<custody> parent, kstd::shared_ptr<inode> node) : m_parent(parent) , m_inode(node) { @@ -16,12 +18,12 @@ namespace filesystem } } - auto custody::get_inode() const -> inode * + auto custody::get_inode() const -> kstd::shared_ptr<inode> { return m_inode; } - auto custody::get_parent() const -> custody * + auto custody::get_parent() const -> kstd::shared_ptr<custody> { return m_parent; } diff --git a/kernel/filesystem/src/device_file.cpp b/kernel/filesystem/src/device_file.cpp index f11638e..882c9b1 100644 --- a/kernel/filesystem/src/device_file.cpp +++ b/kernel/filesystem/src/device_file.cpp @@ -6,14 +6,15 @@ #include "devices/device.hpp" #include <kstd/cstring> +#include <kstd/memory> +#include <kstd/vector> #include <algorithm> -#include <array> #include <cstddef> namespace filesystem { - device_file::device_file(devices::device * device) + device_file::device_file(kstd::shared_ptr<devices::device> device) : m_device(device) { if (!m_device) @@ -90,7 +91,13 @@ namespace filesystem return 0; } - auto * block_dev = static_cast<devices::block_device *>(m_device); + // @Felix rtti not activated why? e.g. dynamic_cast does not work, whats with std::dynamic_pointer_cast + // online: rtti overhead, bad design, ... ? + 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(); @@ -99,8 +106,7 @@ namespace filesystem return 0; size_t const total_to_process = std::min(size, capacity - offset); - // TODO BA-FS26 use kstd::vector when available - std::array<std::byte, 512> scratch_buffer{}; // TODO BA-FS26 better solution than fixed scratch_buffer ?? + kstd::vector<std::byte> scratch_buffer{block_size}; auto processed = 0uz; while (processed < total_to_process) diff --git a/kernel/filesystem/src/ext2/ext2_filesystem.cpp b/kernel/filesystem/src/ext2/ext2_filesystem.cpp index f092ddf..2ae5ab7 100644 --- a/kernel/filesystem/src/ext2/ext2_filesystem.cpp +++ b/kernel/filesystem/src/ext2/ext2_filesystem.cpp @@ -2,12 +2,15 @@ #include "devices/device.hpp" #include "filesystem/inode.hpp" +#include "filesystem/inode_metadata.hpp" + +#include <kstd/memory> #include <string_view> namespace filesystem::ext2 { - auto ext2_filesystem::mount(devices::device * device) -> int + auto ext2_filesystem::mount(kstd::shared_ptr<devices::device> device) -> int { if (!device) { diff --git a/kernel/filesystem/src/file_descriptor_table.cpp b/kernel/filesystem/src/file_descriptor_table.cpp index eb9a281..64fad0c 100644 --- a/kernel/filesystem/src/file_descriptor_table.cpp +++ b/kernel/filesystem/src/file_descriptor_table.cpp @@ -44,7 +44,8 @@ namespace filesystem return static_cast<int>(it - m_open_files.begin()); } - return -1; + m_open_files.push_back(file_description); + return static_cast<int>(m_open_files.size() - 1); } auto file_descriptor_table::get_file(int fd) const -> std::optional<open_file_description> @@ -55,12 +56,12 @@ namespace filesystem } auto const index = static_cast<size_t>(fd); - if (index >= m_open_files.size() || !m_open_files[index].has_value()) + if (index >= m_open_files.size() || !m_open_files.at(fd).has_value()) { return std::nullopt; } - return *m_open_files[index]; + return m_open_files.at(fd); } auto file_descriptor_table::remove_file(int fd) -> void @@ -76,6 +77,6 @@ namespace filesystem return; } - m_open_files[index].reset(); + m_open_files.at(fd).reset(); } } // namespace filesystem
\ No newline at end of file diff --git a/kernel/filesystem/src/filesystem.cpp b/kernel/filesystem/src/filesystem.cpp index a06bccc..cdfe7f8 100644 --- a/kernel/filesystem/src/filesystem.cpp +++ b/kernel/filesystem/src/filesystem.cpp @@ -4,13 +4,8 @@ namespace filesystem { - auto filesystem::root_inode() -> inode * + auto filesystem::root_inode() const -> inode const & { - return &m_root_inode; - } - - auto filesystem::root_inode() const -> inode const * - { - return &m_root_inode; + return m_root_inode; } } // namespace filesystem
\ No newline at end of file diff --git a/kernel/filesystem/src/inode.cpp b/kernel/filesystem/src/inode.cpp index 17aa52a..10a9a30 100644 --- a/kernel/filesystem/src/inode.cpp +++ b/kernel/filesystem/src/inode.cpp @@ -5,6 +5,8 @@ #include "devices/device.hpp" #include "filesystem/inode_metadata.hpp" +#include <kstd/memory> + #include <cstddef> namespace filesystem @@ -13,7 +15,7 @@ namespace filesystem : m_kind(kind) {} - inode::inode(devices::device * device) + inode::inode(kstd::shared_ptr<devices::device> device) : m_kind(inode_kind::device) , m_device(device) { @@ -77,7 +79,7 @@ namespace filesystem return m_device->minor(); } - auto inode::backing_device() const -> devices::device * + auto inode::backing_device() const -> kstd::shared_ptr<devices::device> { return m_device; } diff --git a/kernel/filesystem/src/inode_file.cpp b/kernel/filesystem/src/inode_file.cpp index 071661f..b68b3ee 100644 --- a/kernel/filesystem/src/inode_file.cpp +++ b/kernel/filesystem/src/inode_file.cpp @@ -4,11 +4,13 @@ #include "filesystem/inode.hpp" +#include <kstd/memory> + #include <cstddef> namespace filesystem { - inode_file::inode_file(inode * inode) + inode_file::inode_file(kstd::shared_ptr<inode> inode) : m_inode(inode) { if (!m_inode) diff --git a/kernel/filesystem/src/mount.cpp b/kernel/filesystem/src/mount.cpp index 6594598..53a8143 100644 --- a/kernel/filesystem/src/mount.cpp +++ b/kernel/filesystem/src/mount.cpp @@ -4,11 +4,13 @@ #include "filesystem/filesystem.hpp" +#include <kstd/memory> + #include <string_view> namespace filesystem { - mount::mount(std::string_view const & path, filesystem * fs) + mount::mount(std::string_view const & path, kstd::shared_ptr<filesystem> fs) : m_path(path) , m_filesystem(fs) { @@ -23,7 +25,7 @@ namespace filesystem return m_path; } - auto mount::get_filesystem() const -> filesystem * + auto mount::get_filesystem() const -> kstd::shared_ptr<filesystem> { return m_filesystem; } diff --git a/kernel/filesystem/src/open_file_description.cpp b/kernel/filesystem/src/open_file_description.cpp index d483746..9ebf67d 100644 --- a/kernel/filesystem/src/open_file_description.cpp +++ b/kernel/filesystem/src/open_file_description.cpp @@ -2,18 +2,25 @@ #include "filesystem/file.hpp" +#include <kstd/memory> +#include <kstd/os/error.hpp> + #include <cstddef> namespace filesystem { - open_file_description::open_file_description(file * file) + open_file_description::open_file_description(kstd::shared_ptr<file> file) : m_file(file) , m_offset(0) - {} + { + if (!file) + { + kstd::os::panic("[FILESYSTEM] open_file_description constructed with null file."); + } + } auto open_file_description::read(void * buffer, size_t size) -> size_t { - // TODO BA-FS26 nullptr check auto read_bytes = m_file->read(buffer, m_offset, size); m_offset += read_bytes; return read_bytes; @@ -21,7 +28,6 @@ namespace filesystem auto open_file_description::write(void const * buffer, size_t size) -> size_t { - // TODO BA-FS26 nullptr check auto written_bytes = m_file->write(buffer, m_offset, size); m_offset += written_bytes; return written_bytes; diff --git a/kernel/filesystem/src/vfs.cpp b/kernel/filesystem/src/vfs.cpp index 2ecf847..578fde4 100644 --- a/kernel/filesystem/src/vfs.cpp +++ b/kernel/filesystem/src/vfs.cpp @@ -13,6 +13,7 @@ #include "filesystem/open_file_description.hpp" #include <kstd/cstring> +#include <kstd/memory> #include <algorithm> #include <optional> @@ -23,15 +24,6 @@ namespace filesystem namespace { constinit auto static active_vfs = std::optional<vfs>{}; - - // TODO BA-FS26 @Felix better solution? while dynamic memory not available? - // TODO BA-FS26 remove when dynamic memory available; - constinit auto static root_fs = std::optional<ext2::ext2_filesystem>{}; - - // TODO BA-FS26 remove when dynamic memory available; - constinit auto static temp_device_file = std::optional<device_file>{}; - // TODO BA-FS26 remove when dynamic memory available; - constinit auto static temp_inode_file = std::optional<inode_file>{}; } // namespace auto vfs::init() -> void @@ -46,13 +38,13 @@ namespace filesystem auto storage_mgmt = devices::storage::storage_management::get(); if (auto boot_device = storage_mgmt.determine_boot_device()) { - root_fs.emplace(ext2::ext2_filesystem{}); - if (root_fs->mount(boot_device) != 0) + active_vfs->m_root_fs = kstd::make_shared<ext2::ext2_filesystem>(); + if (active_vfs->m_root_fs->mount(boot_device) != 0) { kapi::system::panic("[FILESYSTEM] Failed to mount root filesystem."); } - active_vfs->m_root_mount = mount{"/", &*root_fs}; + active_vfs->m_root_mount = mount{"/", active_vfs->m_root_fs}; std::ranges::for_each(storage_mgmt.all_controllers(), [&](auto controller) { std::ranges::for_each(controller->all_devices(), [&](auto device) { active_vfs->make_device_node(device); }); @@ -78,39 +70,30 @@ namespace filesystem { if (auto custody = resolve_path(path)) { - auto * node = custody->get_inode(); + auto node = custody->get_inode(); if (node->is_device()) { - temp_device_file.emplace(node->backing_device()); - temp_device_file->open(); - return open_file_description{&*temp_device_file}; + auto current_device_file = kstd::make_shared<device_file>(node->backing_device()); + current_device_file->open(); + return open_file_description{current_device_file}; } - temp_inode_file.emplace(node); - temp_inode_file->open(); - return open_file_description{&*temp_inode_file}; + auto current_inode_file = kstd::make_shared<inode_file>(node); + current_inode_file->open(); + return open_file_description{current_inode_file}; } return std::nullopt; } - auto vfs::make_device_node(devices::device * device) -> void + auto vfs::make_device_node(kstd::shared_ptr<devices::device> device) -> void { if (!device) { kapi::system::panic("[FILESYSTEM] make_device_node called with null device."); } - auto const device_name = device->name(); - - // TODO BA-FS26 this logic isn't needed anymore when kstd::vector available, just use push_back - auto const slot = std::ranges::find_if(m_device_nodes, [](auto const & entry) { return !entry.has_value(); }); - if (slot == m_device_nodes.end()) - { - kapi::system::panic("[FILESYSTEM] No free slot available for device nodes."); - } - - slot->emplace(device_node_entry{device_name, inode{device}}); + m_device_nodes.push_back(device_node_entry{device->name(), kstd::make_shared<inode>(device)}); } auto vfs::resolve_path(std::string_view path) -> std::optional<custody> @@ -128,7 +111,7 @@ namespace filesystem if (entry != m_device_nodes.end()) { - return custody{nullptr, &entry->value().node}; + return custody{static_cast<kstd::shared_ptr<custody>>(nullptr), entry->value().node}; } return std::nullopt; |
