aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp2
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp4
-rw-r--r--kernel/include/kernel/filesystem/ext2/inode.hpp19
-rw-r--r--kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp2
-rw-r--r--kernel/include/kernel/filesystem/ext2/superblock.hpp2
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp35
6 files changed, 45 insertions, 19 deletions
diff --git a/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp b/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp
index a23c045..2ff91d9 100644
--- a/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp
+++ b/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp
@@ -6,7 +6,7 @@
namespace kernel::filesystem::ext2
{
- struct block_group_descriptor
+ struct [[gnu::packed]] block_group_descriptor
{
uint32_t block_bitmap;
uint32_t inode_bitmap;
diff --git a/kernel/include/kernel/filesystem/ext2/filesystem.hpp b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
index 59b9cba..ccee172 100644
--- a/kernel/include/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
@@ -4,6 +4,7 @@
#include "kapi/devices/device.hpp"
#include "kernel/filesystem/ext2/block_group_descriptor.hpp"
+#include "kernel/filesystem/ext2/inode.hpp"
#include "kernel/filesystem/ext2/superblock.hpp"
#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/inode.hpp"
@@ -12,6 +13,7 @@
#include <kstd/vector>
#include <cstddef>
+#include <cstdint>
#include <string_view>
namespace kernel::filesystem::ext2
@@ -23,6 +25,8 @@ namespace kernel::filesystem::ext2
-> kstd::shared_ptr<kernel::filesystem::inode> override;
private:
+ auto read_inode(uint32_t inode_number) -> kstd::shared_ptr<kernel::filesystem::ext2::inode>;
+
auto get_block_size() -> size_t;
auto get_inode_size() -> size_t;
diff --git a/kernel/include/kernel/filesystem/ext2/inode.hpp b/kernel/include/kernel/filesystem/ext2/inode.hpp
index 2c27c17..4284e6f 100644
--- a/kernel/include/kernel/filesystem/ext2/inode.hpp
+++ b/kernel/include/kernel/filesystem/ext2/inode.hpp
@@ -11,13 +11,8 @@
namespace kernel::filesystem::ext2
{
- struct inode : kernel::filesystem::inode
+ struct [[gnu::packed]] inode_data
{
- inode();
-
- auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
- auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
-
uint16_t mode;
uint16_t uid;
uint32_t size;
@@ -30,15 +25,23 @@ namespace kernel::filesystem::ext2
uint32_t blocks;
uint32_t flags;
uint32_t osd1;
- // uint32_t block[15]; // TODO BA-FS26 really correct?
std::array<uint32_t, 15> block; // NOLINT(readability-magic-numbers)
uint32_t generation;
uint32_t file_acl;
uint32_t dir_acl;
uint32_t faddr;
- // uint8_t osd2[12]; // TODO BA-FS26 really correct?
std::array<uint8_t, 12> osd2; // NOLINT(readability-magic-numbers)
};
+
+ struct inode : kernel::filesystem::inode
+ {
+ inode();
+
+ auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
+ auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
+
+ inode_data m_data{};
+ };
} // namespace kernel::filesystem::ext2
#endif \ No newline at end of file
diff --git a/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp b/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp
index 8dd42a1..f44255a 100644
--- a/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp
+++ b/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp
@@ -6,7 +6,7 @@
namespace kernel::filesystem::ext2
{
- struct linked_directory_entry
+ struct [[gnu::packed]] linked_directory_entry
{
uint32_t inode;
uint16_t rec_len;
diff --git a/kernel/include/kernel/filesystem/ext2/superblock.hpp b/kernel/include/kernel/filesystem/ext2/superblock.hpp
index e7e15f2..8e57ae7 100644
--- a/kernel/include/kernel/filesystem/ext2/superblock.hpp
+++ b/kernel/include/kernel/filesystem/ext2/superblock.hpp
@@ -6,7 +6,7 @@
namespace kernel::filesystem::ext2
{
- struct superblock
+ struct [[gnu::packed]] superblock
{
uint32_t inodes_count;
uint32_t blocks_count;
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index 96c1589..d650e97 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -21,7 +21,9 @@ namespace kernel::filesystem::ext2
namespace
{
constexpr size_t SUPERBLOCK_OFFSET = 1024;
- constexpr uint16_t EXT2_MAGIC = 0xEF53;
+ constexpr uint16_t MAGIC_NUMBER = 0xEF53;
+
+ constexpr uint32_t ROOT_INODE_NUMBER = 2;
// Mode bits
// constexpr uint16_t S_IFMT = 0xF000;
@@ -44,7 +46,7 @@ namespace kernel::filesystem::ext2
kernel::devices::block_device_utils::read(m_device, &m_superblock, SUPERBLOCK_OFFSET, sizeof(m_superblock));
- if (m_superblock.magic != EXT2_MAGIC)
+ if (m_superblock.magic != MAGIC_NUMBER)
{
return -1;
}
@@ -60,12 +62,7 @@ namespace kernel::filesystem::ext2
block_group_descriptor_table_offset,
num_block_groups * sizeof(block_group_descriptor));
- // TODO BA-FS26 load proper root inode from ext2 metadata
- // m_root_inode = inode{inode_kind::directory};
-
- // TODO BA-FS26 implement
- m_root_inode = kstd::make_shared<inode>();
- // devices::block_device_utils::read(device, nullptr, 0, 0); // TODO BA-FS26 just for testing
+ m_root_inode = read_inode(ROOT_INODE_NUMBER);
return 0;
}
@@ -82,6 +79,28 @@ namespace kernel::filesystem::ext2
return kstd::make_shared<inode>();
}
+ auto filesystem::read_inode(uint32_t inode_number) -> kstd::shared_ptr<inode>
+ {
+ auto const block_size = get_block_size();
+ auto const inodes_per_group = m_superblock.inodes_per_group;
+ auto const block_group_index = (inode_number - 1) / inodes_per_group;
+ auto const inode_index_within_group = (inode_number - 1) % inodes_per_group;
+
+ if (block_group_index >= m_block_group_descriptors.size())
+ {
+ return nullptr;
+ }
+
+ auto const & block_group_descriptor = m_block_group_descriptors.at(block_group_index);
+ auto const inode_table_start_block = block_group_descriptor.inode_table;
+ auto const inode_table_offset = static_cast<size_t>(inode_table_start_block) * block_size;
+ auto const inode_offset = inode_table_offset + inode_index_within_group * get_inode_size();
+
+ auto new_inode = kstd::make_shared<inode>();
+ kernel::devices::block_device_utils::read(m_device, &new_inode->m_data, inode_offset, sizeof(inode_data));
+ return new_inode;
+ }
+
auto filesystem::get_block_size() -> size_t
{
return 1024U << m_superblock.log_block_size;