aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-04-02 09:50:14 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-04-11 07:58:20 +0200
commit93bca4c2a7c1852fc89df6965c835a7dbbdd6512 (patch)
tree9330b8397b2c76da6c0e4f9115e5f4e5264f043b
parent72b40ecf33fb0ef2d4232b80560642296c79399c (diff)
downloadteachos-93bca4c2a7c1852fc89df6965c835a7dbbdd6512.tar.xz
teachos-93bca4c2a7c1852fc89df6965c835a7dbbdd6512.zip
read ext2 superblock and check the magic number
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp11
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp66
2 files changed, 47 insertions, 30 deletions
diff --git a/kernel/include/kernel/filesystem/ext2/filesystem.hpp b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
index 078da31..176d83c 100644
--- a/kernel/include/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
@@ -2,20 +2,29 @@
#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILESYSTEM_HPP
#include "kapi/devices/device.hpp"
+
+#include "kernel/filesystem/ext2/superblock.hpp"
#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
+#include <cstddef>
#include <string_view>
namespace kernel::filesystem::ext2
{
struct filesystem : kernel::filesystem::filesystem
{
- auto mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int override;
+ auto mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int;
auto lookup(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
-> kstd::shared_ptr<kernel::filesystem::inode> override;
+
+ private:
+ auto get_block_size() -> size_t;
+ auto get_inode_size() -> size_t;
+
+ superblock m_superblock;
};
} // namespace kernel::filesystem::ext2
diff --git a/kernel/src/filesystem/ext2/filesystem.cpp b/kernel/src/filesystem/ext2/filesystem.cpp
index eb9edc4..a3425b5 100644
--- a/kernel/src/filesystem/ext2/filesystem.cpp
+++ b/kernel/src/filesystem/ext2/filesystem.cpp
@@ -1,10 +1,10 @@
#include "kernel/filesystem/ext2/filesystem.hpp"
-#include "kernel/devices/block_device_utils.hpp"
#include "kapi/devices/device.hpp"
+
+#include "kernel/devices/block_device_utils.hpp"
#include "kernel/filesystem/ext2/inode.hpp"
#include "kernel/filesystem/ext2/superblock.hpp"
-#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
@@ -17,37 +17,35 @@ namespace kernel::filesystem::ext2
{
namespace
{
- // constexpr size_t SUPERBLOCK_OFFSET = 1024;
- // constexpr uint16_t EXT2_MAGIC = 0xEF53;
-
- // // Mode bits
- // constexpr uint16_t S_IFMT = 0xF000;
- // constexpr uint16_t S_IFREG = 0x8000;
- // constexpr uint16_t S_IFDIR = 0x4000;
-
- // auto S_ISREG(uint16_t mode) -> bool
- // {
- // return (mode & S_IFMT) == S_IFREG;
- // }
- // auto S_ISDIR(uint16_t mode) -> bool
- // {
- // return (mode & S_IFMT) == S_IFDIR;
- // }
-
- // auto get_block_size(superblock const & superblock) -> size_t
- // {
- // return 1024U << superblock.log_block_size;
- // }
-
- // auto get_inode_size(superblock const & superblock) -> size_t
- // {
- // return superblock.rev_level == 0 ? 128 : superblock.inode_size;
- // }
+ constexpr size_t SUPERBLOCK_OFFSET = 1024;
+ constexpr uint16_t EXT2_MAGIC = 0xEF53;
+
+ // Mode bits
+ constexpr uint16_t S_IFMT = 0xF000;
+ constexpr uint16_t S_IFREG = 0x8000;
+ constexpr uint16_t S_IFDIR = 0x4000;
+
+ auto S_ISREG(uint16_t mode) -> bool
+ {
+ return (mode & S_IFMT) == S_IFREG;
+ }
+ auto S_ISDIR(uint16_t mode) -> bool
+ {
+ return (mode & S_IFMT) == S_IFDIR;
+ }
} // namespace
auto filesystem::mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int
{
- kernel::filesystem::filesystem::mount(device); // TODO BA-FS26 error handling?
+ m_device = device;
+
+ kernel::devices::block_device_utils::read(m_device, &m_superblock, SUPERBLOCK_OFFSET, sizeof(m_superblock));
+
+ if (m_superblock.magic != EXT2_MAGIC)
+ {
+ return -1;
+ }
+
// TODO BA-FS26 load proper root inode from ext2 metadata
// m_root_inode = inode{inode_kind::directory};
@@ -69,4 +67,14 @@ namespace kernel::filesystem::ext2
return kstd::make_shared<inode>();
}
+
+ auto filesystem::get_block_size() -> size_t
+ {
+ return 1024U << m_superblock.log_block_size;
+ }
+
+ auto filesystem::get_inode_size() -> size_t
+ {
+ return m_superblock.rev_level == 0 ? 128 : m_superblock.inode_size;
+ }
} // namespace kernel::filesystem::ext2