From 59c2e1cfa42ce030ae7c78ed39391c1c57faedda Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 24 Sep 2026 08:07:19 +0000 Subject: kernel/filesystems: copy and rename rootfs to fat32 --- kernel/CMakeLists.txt | 5 +++ kernel/kernel/filesystems/fat32/filesystem.cpp | 47 +++++++++++++++++++++ kernel/kernel/filesystems/fat32/filesystem.hpp | 38 +++++++++++++++++ .../kernel/filesystems/fat32/filesystem.tests.cpp | 48 ++++++++++++++++++++++ kernel/kernel/filesystems/fat32/inode.cpp | 37 +++++++++++++++++ kernel/kernel/filesystems/fat32/inode.hpp | 37 +++++++++++++++++ kernel/kernel/filesystems/fat32/inode.tests.cpp | 42 +++++++++++++++++++ kernel/kernel/filesystems/fat32/module.cpp | 28 +++++++++++++ 8 files changed, 282 insertions(+) create mode 100644 kernel/kernel/filesystems/fat32/filesystem.cpp create mode 100644 kernel/kernel/filesystems/fat32/filesystem.hpp create mode 100644 kernel/kernel/filesystems/fat32/filesystem.tests.cpp create mode 100644 kernel/kernel/filesystems/fat32/inode.cpp create mode 100644 kernel/kernel/filesystems/fat32/inode.hpp create mode 100644 kernel/kernel/filesystems/fat32/inode.tests.cpp create mode 100644 kernel/kernel/filesystems/fat32/module.cpp (limited to 'kernel') diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 341f396a..e7464658 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -85,6 +85,11 @@ target_sources("kernel_lib" PRIVATE "kernel/filesystems/ext2/module.cpp" "kernel/filesystems/ext2/write_batch.cpp" + # fat32 Filesystem + "kernel/filesystems/fat32/filesystem.cpp" + "kernel/filesystems/fat32/inode.cpp" + "kernel/filesystems/fat32/module.cpp" + # Rootfs Filesystem "kernel/filesystems/rootfs/filesystem.cpp" "kernel/filesystems/rootfs/inode.cpp" diff --git a/kernel/kernel/filesystems/fat32/filesystem.cpp b/kernel/kernel/filesystems/fat32/filesystem.cpp new file mode 100644 index 00000000..a66a9b25 --- /dev/null +++ b/kernel/kernel/filesystems/fat32/filesystem.cpp @@ -0,0 +1,47 @@ +#include + +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include + +namespace kernel::filesystems::fat32 +{ + static_assert(sizeof(kernel::vfs::filesystem) == sizeof(fat32::filesystem)); + + auto filesystem::probe(inode_ptr const & inode) const -> kstd::result + { + if (inode) + { + return kstd::failure(vfs::errc::invalid_argument); + } + + return 0; + } + + auto filesystem::mount(inode_ptr const &) -> kstd::result + { + auto root = kstd::make_shared(); + return mount_result{root, nullptr}; + } + + auto filesystem::lookup(inode_ptr const &, std::string_view, driver_data_ptr) const -> kstd::result + { + return kstd::failure(vfs::errc::no_such_file_or_directory); + } + + auto filesystem::create_inode(inode_ptr const &, std::string_view, kapi::filesystem::file_type, driver_data_ptr, + std::optional) -> kstd::result + { + return kstd::failure(vfs::errc::read_only_file_system); + } +} // namespace kernel::filesystems::fat32 diff --git a/kernel/kernel/filesystems/fat32/filesystem.hpp b/kernel/kernel/filesystems/fat32/filesystem.hpp new file mode 100644 index 00000000..8b0b4941 --- /dev/null +++ b/kernel/kernel/filesystems/fat32/filesystem.hpp @@ -0,0 +1,38 @@ +#ifndef TEACHOS_KERNEL_FILESYSTEMS_FAT32_FILESYSTEM_HPP +#define TEACHOS_KERNEL_FILESYSTEMS_FAT32_FILESYSTEM_HPP + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace kernel::filesystems::fat32 +{ + //! The File Allocation Table 32 Filesystem (fat32) + struct filesystem : kernel::vfs::filesystem + { + [[nodiscard]] auto probe(inode_ptr const & inode) const -> kstd::result override; + + auto mount(inode_ptr const & backing_inode) -> kstd::result override; + + [[nodiscard]] auto lookup(inode_ptr const & parent, std::string_view name, driver_data_ptr driver_data) const + -> kstd::result override; + + [[nodiscard]] auto create_inode(inode_ptr const & parent, std::string_view name, kapi::filesystem::file_type type, + driver_data_ptr driver_data, + std::optional raw_device = std::nullopt) + -> kstd::result override; + }; +} // namespace kernel::filesystems::fat32 + +#endif \ No newline at end of file diff --git a/kernel/kernel/filesystems/fat32/filesystem.tests.cpp b/kernel/kernel/filesystems/fat32/filesystem.tests.cpp new file mode 100644 index 00000000..cc35cd74 --- /dev/null +++ b/kernel/kernel/filesystems/fat32/filesystem.tests.cpp @@ -0,0 +1,48 @@ +#include + +#include + +#include + +#include +#include +#include + +#include + +SCENARIO("fat32 filesystem mount and lookup", "[filesystem][fat32][filesystem]") +{ + GIVEN("a mounted fat32 filesystem") + { + auto fs = kstd::make_shared(); + auto mount = fs->mount(nullptr); + REQUIRE(mount); + auto [root, driver_data] = *mount; + REQUIRE(root); + + THEN("the filesystem can be mounted successfully") + { + REQUIRE(mount); + } + + THEN("looking up a non-existent directory returns an error") + { + auto non_existent_inode_1 = fs->lookup(root, "", driver_data); + REQUIRE(!non_existent_inode_1); + auto non_existent_inode_2 = fs->lookup(root, "nonexistent", driver_data); + REQUIRE(!non_existent_inode_2); + } + + THEN("looking up with a null parent inode returns an error") + { + auto result = fs->lookup(nullptr, "dev", driver_data); + REQUIRE(!result); + } + + THEN("create_inode always returns an error") + { + auto result = fs->create_inode(root, "new_device", kapi::filesystem::file_type::directory, driver_data); + REQUIRE(!result); + } + } +} diff --git a/kernel/kernel/filesystems/fat32/inode.cpp b/kernel/kernel/filesystems/fat32/inode.cpp new file mode 100644 index 00000000..993256df --- /dev/null +++ b/kernel/kernel/filesystems/fat32/inode.cpp @@ -0,0 +1,37 @@ +#include + +#include + +#include + +#include +#include + +#include +#include +#include + +namespace kernel::filesystems::fat32 +{ + auto inode::read(std::span, kstd::bytes) const -> kstd::result + { + return kstd::bytes{}; + } + + auto inode::write(std::span, kstd::bytes) -> kstd::result + { + return kstd::bytes{}; + } + + auto inode::is_directory() const -> bool + { + return true; + } + + auto inode::read_directory(kapi::filesystem::directory_cursor position, + std::span) const + -> kstd::result> + { + return std::pair{0, position}; + } +} // namespace kernel::filesystems::fat32 diff --git a/kernel/kernel/filesystems/fat32/inode.hpp b/kernel/kernel/filesystems/fat32/inode.hpp new file mode 100644 index 00000000..3f9ae37e --- /dev/null +++ b/kernel/kernel/filesystems/fat32/inode.hpp @@ -0,0 +1,37 @@ +#ifndef TEACHOS_KERNEL_FILESYSTEMS_FAT32_INODE_HPP +#define TEACHOS_KERNEL_FILESYSTEMS_FAT32_INODE_HPP + +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace kernel::filesystems::fat32 +{ + //! An inode in the fat32 filesystem. + struct inode : kernel::vfs::inode + { + [[nodiscard]] auto read(std::span buffer, kstd::bytes offset) const + -> kstd::result override; + + [[nodiscard]] auto write(std::span buffer, kstd::bytes offset) + -> kstd::result override; + + [[nodiscard]] auto is_directory() const -> bool override; + + [[nodiscard]] auto read_directory(kapi::filesystem::directory_cursor position, + std::span entries) const + -> kstd::result> override; + }; +} // namespace kernel::filesystems::fat32 + +#endif diff --git a/kernel/kernel/filesystems/fat32/inode.tests.cpp b/kernel/kernel/filesystems/fat32/inode.tests.cpp new file mode 100644 index 00000000..7e151d9f --- /dev/null +++ b/kernel/kernel/filesystems/fat32/inode.tests.cpp @@ -0,0 +1,42 @@ +#include + +#include +#include +#include +#include + +#include + +#include + +using namespace kstd::units_literals; + +SCENARIO("Rootfs inode read/write", "[filesystem][rootfs][inode]") +{ + GIVEN("a rootfs inode") + { + auto inode = kernel::filesystems::rootfs::inode{}; + + WHEN("reading from the inode") + { + kstd::vector buffer(10); + auto bytes_read = inode.read(buffer, 0_B); + + THEN("no bytes are read") + { + REQUIRE(bytes_read == 0_B); + } + } + + WHEN("writing to the inode") + { + kstd::vector buffer(10, std::byte{'x'}); + auto bytes_written = inode.write(buffer, 0_B); + + THEN("no bytes are written") + { + REQUIRE(bytes_written == 0_B); + } + } + } +} diff --git a/kernel/kernel/filesystems/fat32/module.cpp b/kernel/kernel/filesystems/fat32/module.cpp new file mode 100644 index 00000000..c3cbb9d6 --- /dev/null +++ b/kernel/kernel/filesystems/fat32/module.cpp @@ -0,0 +1,28 @@ +#include +#include +#include + +#include + +#include + +namespace +{ + + struct descriptor final : kernel::vfs::driver_descriptor + { + [[nodiscard]] auto name() const noexcept -> std::string_view override + { + return "fat32"; + } + + [[nodiscard]] auto make_instance() const -> kernel::vfs::filesystem::filesystem_ptr override + { + return kstd::make_shared(); + } + }; + + [[gnu::used]] + constexpr auto registration = kernel::vfs::driver_module{}; + +} // namespace \ No newline at end of file -- cgit v1.2.3