aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/include/kernel/filesystem/dentry.hpp14
-rw-r--r--kernel/include/kernel/filesystem/vfs.hpp2
-rw-r--r--kernel/src/filesystem/dentry.cpp17
-rw-r--r--kernel/src/filesystem/vfs.cpp21
4 files changed, 43 insertions, 11 deletions
diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp
index 1532880..db15b48 100644
--- a/kernel/include/kernel/filesystem/dentry.hpp
+++ b/kernel/include/kernel/filesystem/dentry.hpp
@@ -4,21 +4,35 @@
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
+#include <kstd/string>
#include <kstd/vector>
+#include <cstdint>
+
namespace filesystem
{
struct dentry
{
+ enum class dentry_flags : uint32_t
+ {
+ dcache_mounted = 1 << 15
+ };
+
dentry(kstd::shared_ptr<dentry> const & parent, kstd::shared_ptr<inode> const & node);
[[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode> const &;
[[nodiscard]] auto get_parent() const -> kstd::shared_ptr<dentry> const &;
+ auto set_flag(dentry_flags flag) -> void;
+ auto unset_flag(dentry_flags flag) -> void;
+ [[nodiscard]] auto has_flag(dentry_flags flag) const -> bool;
+
private:
+ kstd::string m_name;
kstd::shared_ptr<dentry> m_parent;
kstd::vector<kstd::shared_ptr<dentry>> m_children;
kstd::shared_ptr<inode> m_inode;
+ uint32_t m_flags{0};
};
} // namespace filesystem
diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp
index bcf06f7..01cd2ea 100644
--- a/kernel/include/kernel/filesystem/vfs.hpp
+++ b/kernel/include/kernel/filesystem/vfs.hpp
@@ -40,7 +40,7 @@ namespace filesystem
[[nodiscard]] auto resolve_path(std::string_view path) -> std::optional<dentry>;
kstd::shared_ptr<filesystem> m_root_fs;
- std::optional<mount> m_root_mount;
+ kstd::shared_ptr<dentry> m_root_dentry;
kstd::vector<mount> m_mount_table;
};
} // namespace filesystem
diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp
index 08f0b25..e498b52 100644
--- a/kernel/src/filesystem/dentry.cpp
+++ b/kernel/src/filesystem/dentry.cpp
@@ -6,6 +6,8 @@
#include <kstd/memory>
+#include <cstdint>
+
namespace filesystem
{
dentry::dentry(kstd::shared_ptr<dentry> const & parent, kstd::shared_ptr<inode> const & node)
@@ -27,4 +29,19 @@ namespace filesystem
{
return m_parent;
}
+
+ auto dentry::set_flag(dentry_flags flag) -> void
+ {
+ m_flags |= static_cast<uint32_t>(flag);
+ }
+
+ auto dentry::unset_flag(dentry_flags flag) -> void
+ {
+ m_flags &= ~static_cast<uint32_t>(flag);
+ }
+
+ auto dentry::has_flag(dentry_flags flag) const -> bool
+ {
+ return (m_flags & static_cast<uint32_t>(flag)) != 0;
+ }
} // namespace filesystem \ No newline at end of file
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index a111f23..2c4a4d5 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -38,10 +38,11 @@ namespace filesystem
if (auto boot_device = storage_mgmt.determine_boot_device())
{
active_vfs->m_root_fs = kstd::make_shared<ext2::ext2_filesystem>();
- if (active_vfs->do_mount("/", active_vfs->m_root_fs) != 0)
- {
- kapi::system::panic("[FILESYSTEM] Failed to mount root filesystem.");
- }
+ active_vfs->m_root_dentry = kstd::make_shared<dentry>(nullptr, active_vfs->m_root_fs->root_inode());
+ // if (active_vfs->do_mount("/", active_vfs->m_root_fs) != 0)
+ // {
+ // kapi::system::panic("[FILESYSTEM] Failed to mount root filesystem.");
+ // }
// TODO BA-FS26 use do_mount when tempdevfs is implemented -> just call /dev/ with all devices in devtempfs
std::ranges::for_each(storage_mgmt.all_controllers(), [&](auto controller) {
@@ -92,12 +93,12 @@ namespace filesystem
return -1; // TODO BA-FS26 panic or errorcode?
}
- if (path == "/")
- {
- m_root_fs = filesystem;
- m_root_mount = mount{"/", filesystem};
- return 0;
- }
+ // if (path == "/")
+ // {
+ // m_root_fs = filesystem;
+ // m_root_mount = mount{"/", filesystem};
+ // return 0;
+ // }
auto existing_mount =
std::ranges::find_if(m_mount_table, [&](auto const & existing) { return existing.path() == path; });