aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.cpp45
-rw-r--r--kernel/kernel/filesystem/ext2/filesystem.hpp6
-rw-r--r--kernel/kernel/filesystem/vfs_types.hpp15
3 files changed, 51 insertions, 15 deletions
diff --git a/kernel/kernel/filesystem/ext2/filesystem.cpp b/kernel/kernel/filesystem/ext2/filesystem.cpp
index fb314d0d..a5bc5f4d 100644
--- a/kernel/kernel/filesystem/ext2/filesystem.cpp
+++ b/kernel/kernel/filesystem/ext2/filesystem.cpp
@@ -9,6 +9,9 @@
#include <kernel/filesystem/filesystem.hpp>
#include <kernel/filesystem/inode.hpp>
#include <kernel/filesystem/type.hpp>
+#include <kernel/filesystem/vfs_types.hpp>
+
+#include <kapi/system.hpp>
#include <kstd/cstring.hpp>
#include <kstd/memory.hpp>
@@ -64,6 +67,15 @@ namespace kernel::filesystem::ext2
[[gnu::used]]
constexpr auto registration = type_registration<type>{};
+ auto filesystem::indirect_levels() const -> std::array<indirect_level, 3>
+ {
+ return {
+ {{constants::singly_indirect_block_index, block_numbers_per_singly_indirect_block()},
+ {constants::doubly_indirect_block_index, block_numbers_per_doubly_indirect_block()},
+ {constants::triply_indirect_block_index, block_numbers_per_triply_indirect_block()}}
+ };
+ }
+
auto filesystem::mount(kstd::shared_ptr<kernel::filesystem::inode> const & backing_inode) -> kstd::result<void>
{
std::ignore = kernel::filesystem::filesystem::mount(backing_inode);
@@ -154,7 +166,8 @@ namespace kernel::filesystem::ext2
return kstd::failure(vfs_errc::no_such_file_or_directory);
}
- auto filesystem::create_inode(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
+ auto filesystem::create_inode(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name,
+ kernel::filesystem::vfs_types::inode_type inode_type)
-> kstd::result<kstd::shared_ptr<kernel::filesystem::inode>>
{
if (!parent)
@@ -183,8 +196,7 @@ namespace kernel::filesystem::ext2
inode_data new_inode_data{};
- // TODO set mode depending on type/mode
- new_inode_data.mode = 0x8000;
+ new_inode_data.mode = map_vfs_inode_type_to_inode_mode(inode_type);
new_inode_data.size = 0;
new_inode_data.dir_acl = 0;
new_inode_data.links_count = 1;
@@ -200,8 +212,7 @@ namespace kernel::filesystem::ext2
auto new_inode = kstd::make_shared<inode>(this, inode_number, new_inode_data);
- bool is_directory = false; // TODO refactor
- if (is_directory)
+ if (new_inode->is_directory())
{
if (auto result = init_directory(new_inode, ext2_parent); !result)
{
@@ -503,15 +514,6 @@ namespace kernel::filesystem::ext2
return kstd::failure(ext2_errc::not_enough_inodes);
}
- auto filesystem::indirect_levels() const -> std::array<indirect_level, 3>
- {
- return {
- {{constants::singly_indirect_block_index, block_numbers_per_singly_indirect_block()},
- {constants::doubly_indirect_block_index, block_numbers_per_doubly_indirect_block()},
- {constants::triply_indirect_block_index, block_numbers_per_triply_indirect_block()}}
- };
- }
-
auto filesystem::map_inode_block_index_to_global_block_number(size_t inode_block_index, inode_data data) const
-> std::expected<std::size_t, kstd::error_code>
{
@@ -721,6 +723,21 @@ namespace kernel::filesystem::ext2
}
}
+ auto filesystem::map_vfs_inode_type_to_inode_mode(kernel::filesystem::vfs_types::inode_type vfs_type) -> uint16_t
+ {
+ switch (vfs_type)
+ {
+ case kernel::filesystem::vfs_types::inode_type::directory:
+ return constants::mode_directory;
+ case kernel::filesystem::vfs_types::inode_type::regular:
+ return constants::mode_regular;
+ case kernel::filesystem::vfs_types::inode_type::symbolic_link:
+ // return constants::mode_symbolic_link; // TODO implement
+ default:
+ kapi::system::panic("[EXT2] Not implemented.");
+ }
+ }
+
auto filesystem::block_numbers_per_block() const -> size_t
{
return block_size() / sizeof(uint32_t);
diff --git a/kernel/kernel/filesystem/ext2/filesystem.hpp b/kernel/kernel/filesystem/ext2/filesystem.hpp
index d997f508..e8f72727 100644
--- a/kernel/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/kernel/filesystem/ext2/filesystem.hpp
@@ -6,6 +6,7 @@
#include <kernel/filesystem/ext2/superblock.hpp>
#include <kernel/filesystem/filesystem.hpp>
#include <kernel/filesystem/inode.hpp>
+#include <kernel/filesystem/vfs_types.hpp>
#include <kstd/memory.hpp>
#include <kstd/result.hpp>
@@ -71,9 +72,11 @@ namespace kernel::filesystem::ext2
@brief Creates a new inode with @p name within a @p parent directory.
@param parent The parent directory inode.
@param name The name of the inode to create.
+ @param inode_type The type of inode to be created.
@return A pointer to the created inode, or a null pointer if creation failed.
*/
- [[nodiscard]] auto create_inode(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
+ [[nodiscard]] auto create_inode(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name,
+ kernel::filesystem::vfs_types::inode_type inode_type)
-> kstd::result<kstd::shared_ptr<kernel::filesystem::inode>>; // TODO move into base class and override
/**
@@ -191,6 +194,7 @@ namespace kernel::filesystem::ext2
[[nodiscard]] auto write_superblock() const -> kstd::result<void>;
auto map_inode_mode_to_file_type(uint16_t mode) -> uint8_t;
+ auto map_vfs_inode_type_to_inode_mode(kernel::filesystem::vfs_types::inode_type vfs_type) -> uint16_t;
superblock m_superblock{};
kstd::vector<block_group_descriptor> m_block_group_descriptors;
diff --git a/kernel/kernel/filesystem/vfs_types.hpp b/kernel/kernel/filesystem/vfs_types.hpp
new file mode 100644
index 00000000..4bedaddc
--- /dev/null
+++ b/kernel/kernel/filesystem/vfs_types.hpp
@@ -0,0 +1,15 @@
+#ifndef TEACH_OS_KERNEL_FILESYSTEM_VFS_TYPES_HPP
+#define TEACH_OS_KERNEL_FILESYSTEM_VFS_TYPES_HPP
+
+#include <cstddef>
+
+namespace kernel::filesystem::vfs_types
+{
+ enum class inode_type : size_t
+ {
+ directory = 0,
+ regular = 1,
+ symbolic_link = 2,
+ };
+} // namespace kernel::filesystem::vfs_types
+#endif \ No newline at end of file