diff options
Diffstat (limited to 'kernel/filesystem')
| -rw-r--r-- | kernel/filesystem/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp | 4 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/filesystem.hpp | 6 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/inode.hpp | 7 | ||||
| -rw-r--r-- | kernel/filesystem/include/filesystem/inode_metadata.hpp | 24 | ||||
| -rw-r--r-- | kernel/filesystem/src/ext2/ext2_filesystem.cpp | 14 | ||||
| -rw-r--r-- | kernel/filesystem/src/filesystem.cpp | 9 | ||||
| -rw-r--r-- | kernel/filesystem/src/inode.cpp | 34 |
8 files changed, 92 insertions, 7 deletions
diff --git a/kernel/filesystem/CMakeLists.txt b/kernel/filesystem/CMakeLists.txt index 19f1be1..bb2090a 100644 --- a/kernel/filesystem/CMakeLists.txt +++ b/kernel/filesystem/CMakeLists.txt @@ -25,6 +25,7 @@ target_sources("kernel_filesystem" PUBLIC "include/filesystem/file.hpp" "include/filesystem/filesystem.hpp" "include/filesystem/inode_file.hpp" + "include/filesystem/inode_metadata.hpp" "include/filesystem/inode.hpp" "include/filesystem/mount.hpp" "include/filesystem/open_file_description.hpp" diff --git a/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp b/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp index 91ba14a..cba2192 100644 --- a/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp +++ b/kernel/filesystem/include/filesystem/ext2/ext2_filesystem.hpp @@ -3,12 +3,16 @@ #include "devices/device.hpp" #include "filesystem/filesystem.hpp" +#include "filesystem/inode.hpp" + +#include <string_view> namespace filesystem::ext2 { struct ext2_filesystem : filesystem { auto mount(devices::device * device) -> int override; + auto lookup(inode const & parent, std::string_view name) -> inode * override; private: devices::device * m_device{}; diff --git a/kernel/filesystem/include/filesystem/filesystem.hpp b/kernel/filesystem/include/filesystem/filesystem.hpp index 2077ed6..8deb336 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 <string_view> + namespace filesystem { struct filesystem @@ -11,8 +13,10 @@ namespace filesystem virtual ~filesystem() = default; virtual auto mount(devices::device * device) -> int = 0; + virtual auto lookup(inode const & parent, std::string_view name) -> inode * = 0; - [[nodiscard]] auto root_inode() const -> inode const &; + [[nodiscard]] auto root_inode() -> inode *; + [[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 eb8440f..bceabb6 100644 --- a/kernel/filesystem/include/filesystem/inode.hpp +++ b/kernel/filesystem/include/filesystem/inode.hpp @@ -2,6 +2,7 @@ #define TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP #include "devices/device.hpp" +#include "filesystem/inode_metadata.hpp" #include <cstddef> @@ -10,8 +11,13 @@ namespace filesystem struct inode { inode() = default; + explicit inode(inode_kind kind); explicit inode(devices::device * device); + [[nodiscard]] auto metadata() const -> inode_metadata; + + [[nodiscard]] auto is_directory() const -> bool; + [[nodiscard]] auto is_regular() const -> bool; [[nodiscard]] auto is_device() const -> bool; [[nodiscard]] auto is_block_device() const -> bool; [[nodiscard]] auto major_device() const -> size_t; @@ -22,6 +28,7 @@ namespace filesystem 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{}; }; } // namespace filesystem diff --git a/kernel/filesystem/include/filesystem/inode_metadata.hpp b/kernel/filesystem/include/filesystem/inode_metadata.hpp new file mode 100644 index 0000000..ed5a09d --- /dev/null +++ b/kernel/filesystem/include/filesystem/inode_metadata.hpp @@ -0,0 +1,24 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_METADATA_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_INODE_METADATA_HPP + +#include <cstddef> +#include <optional> + +namespace filesystem +{ + enum class inode_kind + { + regular, + directory, + device + }; + + struct inode_metadata + { + inode_kind kind{inode_kind::regular}; + std::optional<size_t> major{}; + std::optional<size_t> minor{}; + }; +} // namespace filesystem + +#endif // TEACH_OS_KERNEL_FILESYSTEM_INODE_METADATA_HPP
\ No newline at end of file diff --git a/kernel/filesystem/src/ext2/ext2_filesystem.cpp b/kernel/filesystem/src/ext2/ext2_filesystem.cpp index 97257a2..f092ddf 100644 --- a/kernel/filesystem/src/ext2/ext2_filesystem.cpp +++ b/kernel/filesystem/src/ext2/ext2_filesystem.cpp @@ -3,6 +3,8 @@ #include "devices/device.hpp" #include "filesystem/inode.hpp" +#include <string_view> + namespace filesystem::ext2 { auto ext2_filesystem::mount(devices::device * device) -> int @@ -12,9 +14,17 @@ namespace filesystem::ext2 return -1; // TODO BA-FS26 panic or errorcode? } - m_root_inode = inode{}; // TODO BA-FS26 set properly during mount? + m_device = device; + // TODO BA-FS26 load proper root inode from ext2 metadata + m_root_inode = inode{inode_kind::directory}; // TODO BA-FS26 implement return 0; } -} // namespace filesystem::ext2
\ No newline at end of file + + auto ext2_filesystem::lookup(inode const & /*parent*/, std::string_view /*name*/) -> inode * + { + // TODO BA-FS26 implement ext2 directory traversal and inode loading + return nullptr; + } +} // namespace filesystem::ext2 diff --git a/kernel/filesystem/src/filesystem.cpp b/kernel/filesystem/src/filesystem.cpp index cdfe7f8..a06bccc 100644 --- a/kernel/filesystem/src/filesystem.cpp +++ b/kernel/filesystem/src/filesystem.cpp @@ -4,8 +4,13 @@ namespace filesystem { - auto filesystem::root_inode() const -> inode const & + auto filesystem::root_inode() -> inode * { - return m_root_inode; + return &m_root_inode; + } + + auto filesystem::root_inode() const -> inode const * + { + 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 a1427e2..17aa52a 100644 --- a/kernel/filesystem/src/inode.cpp +++ b/kernel/filesystem/src/inode.cpp @@ -3,13 +3,19 @@ #include "kapi/system.hpp" #include "devices/device.hpp" +#include "filesystem/inode_metadata.hpp" #include <cstddef> namespace filesystem { + inode::inode(inode_kind kind) + : m_kind(kind) + {} + inode::inode(devices::device * device) - : m_device(device) + : m_kind(inode_kind::device) + , m_device(device) { if (!m_device) { @@ -17,9 +23,33 @@ namespace filesystem } } + auto inode::metadata() const -> inode_metadata + { + auto meta = inode_metadata{}; + meta.kind = m_kind; + + if (is_device()) + { + meta.major = m_device->major(); + meta.minor = m_device->minor(); + } + + return meta; + } + + auto inode::is_directory() const -> bool + { + return m_kind == inode_kind::directory; + } + + auto inode::is_regular() const -> bool + { + return m_kind == inode_kind::regular; + } + auto inode::is_device() const -> bool { - return m_device != nullptr; + return m_kind == inode_kind::device; } auto inode::is_block_device() const -> bool |
