diff options
Diffstat (limited to 'kernel/include')
22 files changed, 270 insertions, 161 deletions
diff --git a/kernel/include/kernel/devices/block_device.hpp b/kernel/include/kernel/devices/block_device.hpp index fb7d104..e2026dd 100644 --- a/kernel/include/kernel/devices/block_device.hpp +++ b/kernel/include/kernel/devices/block_device.hpp @@ -3,8 +3,9 @@ #include "kernel/devices/device.hpp" +#include <kstd/string> + #include <cstddef> -#include <string_view> namespace devices { @@ -20,7 +21,7 @@ namespace devices * @param name Device name. * @param block_size Size of one logical block in bytes. */ - block_device(size_t major, size_t minor, std::string_view name, size_t block_size); + block_device(size_t major, size_t minor, kstd::string const & name, size_t block_size); /** * @brief Read data from the block at @p block_index into @p buffer. diff --git a/kernel/include/kernel/devices/device.hpp b/kernel/include/kernel/devices/device.hpp index d6f520f..66cb7f8 100644 --- a/kernel/include/kernel/devices/device.hpp +++ b/kernel/include/kernel/devices/device.hpp @@ -1,8 +1,9 @@ #ifndef TEACH_OS_KERNEL_DEVICES_DEVICE_HPP #define TEACH_OS_KERNEL_DEVICES_DEVICE_HPP +#include <kstd/string> + #include <cstddef> -#include <string_view> namespace devices { @@ -17,7 +18,7 @@ namespace devices * @param minor Device minor number. * @param name Device name. */ - device(size_t major, size_t minor, std::string_view name); + device(size_t major, size_t minor, kstd::string const & name); /** * @brief Virtual destructor for device. @@ -40,7 +41,7 @@ namespace devices * @brief Returns the name of the device. * @return Device name. */ - [[nodiscard]] auto name() const -> std::string_view; + [[nodiscard]] auto name() const -> kstd::string const &; /** * @brief Check if the device is a block device. @@ -54,7 +55,7 @@ namespace devices private: size_t m_major; size_t m_minor; - std::string_view m_name; + kstd::string m_name; }; } // namespace devices diff --git a/kernel/include/kernel/filesystem/custody.hpp b/kernel/include/kernel/filesystem/custody.hpp deleted file mode 100644 index 8a0e09a..0000000 --- a/kernel/include/kernel/filesystem/custody.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef TEACH_OS_KERNEL_CUSTODY_HPP -#define TEACH_OS_KERNEL_CUSTODY_HPP - -#include "kernel/filesystem/inode.hpp" - -#include <kstd/memory> - -namespace filesystem -{ - struct custody - { - custody(kstd::shared_ptr<custody> 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<custody> const &; - - private: - kstd::shared_ptr<custody> m_parent; - kstd::shared_ptr<inode> m_inode; - }; -} // namespace filesystem - -#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp new file mode 100644 index 0000000..c28246f --- /dev/null +++ b/kernel/include/kernel/filesystem/dentry.hpp @@ -0,0 +1,43 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DENTRY_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DENTRY_HPP + +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> +#include <kstd/string> +#include <kstd/vector> + +#include <cstdint> +#include <string_view> + +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, std::string_view name = {}); + + [[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode> const &; + [[nodiscard]] auto get_parent() const -> kstd::shared_ptr<dentry> const &; + + auto add_child(kstd::shared_ptr<dentry> const & child) -> void; + [[nodiscard]] auto find_child(std::string_view name) const -> kstd::shared_ptr<dentry>; + + 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 + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/devfs/devfs_filesystem.hpp b/kernel/include/kernel/filesystem/devfs/devfs_filesystem.hpp new file mode 100644 index 0000000..5559c2a --- /dev/null +++ b/kernel/include/kernel/filesystem/devfs/devfs_filesystem.hpp @@ -0,0 +1,25 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_FILESYSTEM_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_FILESYSTEM_HPP + +#include "kernel/devices/device.hpp" +#include "kernel/filesystem/filesystem.hpp" +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> +#include <kstd/vector> + +#include <string_view> + +namespace filesystem::devfs +{ + struct devfs_filesystem : filesystem + { + auto mount(kstd::shared_ptr<devices::device> const & device) -> int override; + auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> override; + + private: + auto build_device_inode_table() -> void; + }; +} // namespace filesystem::devfs + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/devfs/devfs_root_inode.hpp b/kernel/include/kernel/filesystem/devfs/devfs_root_inode.hpp new file mode 100644 index 0000000..b1d37ab --- /dev/null +++ b/kernel/include/kernel/filesystem/devfs/devfs_root_inode.hpp @@ -0,0 +1,19 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_ROOT_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DEVFS_DEVFS_ROOT_INODE_HPP + +#include "kernel/filesystem/inode.hpp" + +#include <cstddef> + +namespace filesystem::devfs +{ + struct devfs_root_inode : inode + { + devfs_root_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; + }; +} // namespace filesystem::devfs + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/device_file.hpp b/kernel/include/kernel/filesystem/device_inode.hpp index 06aa9b2..1cf08d4 100644 --- a/kernel/include/kernel/filesystem/device_file.hpp +++ b/kernel/include/kernel/filesystem/device_inode.hpp @@ -1,9 +1,9 @@ -#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVICE_FILE_HPP -#define TEACH_OS_KERNEL_FILESYSTEM_DEVICE_FILE_HPP +#ifndef TEACH_OS_KERNEL_FILESYSTEM_DEVICE_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_DEVICE_INODE_HPP #include "kernel/devices/block_device.hpp" #include "kernel/devices/device.hpp" -#include "kernel/filesystem/file.hpp" +#include "kernel/filesystem/inode.hpp" #include <kstd/memory> @@ -11,15 +11,15 @@ namespace filesystem { - struct device_file : file + struct device_inode : inode { - explicit device_file(kstd::shared_ptr<devices::device> const & device); - - auto open() -> void override; + explicit device_inode(kstd::shared_ptr<devices::device> const & device); 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; + [[nodiscard]] auto device() const -> kstd::shared_ptr<devices::device> const &; + private: using block_op = void (*)(size_t idx, size_t off, size_t len, size_t done, devices::block_device * device, std::byte * scratch, void * buffer); @@ -29,4 +29,4 @@ namespace filesystem }; } // namespace filesystem -#endif +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/ext2/ext2_file.hpp b/kernel/include/kernel/filesystem/ext2/ext2_file.hpp new file mode 100644 index 0000000..e5357e3 --- /dev/null +++ b/kernel/include/kernel/filesystem/ext2/ext2_file.hpp @@ -0,0 +1,15 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_FILE_HPP + +#include <cstddef> + +namespace filesystem::ext2 +{ + struct ext2_file + { + auto read(void * buffer, size_t offset, size_t size) const -> size_t; + auto write(void const * buffer, size_t offset, size_t size) -> size_t; + }; +} // namespace filesystem::ext2 + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp b/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp index d6f69c8..1445e5a 100644 --- a/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp +++ b/kernel/include/kernel/filesystem/ext2/ext2_filesystem.hpp @@ -14,10 +14,9 @@ namespace filesystem::ext2 struct ext2_filesystem : filesystem { auto mount(kstd::shared_ptr<devices::device> const & device) -> int override; - auto lookup(inode const & parent, std::string_view name) -> inode * override; + auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> override; private: - kstd::shared_ptr<devices::device> m_device{}; }; } // namespace filesystem::ext2 diff --git a/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp b/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp new file mode 100644 index 0000000..5f4d16a --- /dev/null +++ b/kernel/include/kernel/filesystem/ext2/ext2_inode.hpp @@ -0,0 +1,25 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_EXT2_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_EXT2_INODE_HPP + +#include "kernel/filesystem/ext2/ext2_file.hpp" +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> + +#include <cstddef> + +namespace filesystem::ext2 +{ + struct ext2_inode : inode + { + explicit ext2_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; + + private: + kstd::shared_ptr<ext2_file> m_file; + }; +} // namespace filesystem::ext2 + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/file.hpp b/kernel/include/kernel/filesystem/file.hpp deleted file mode 100644 index e7e1b12..0000000 --- a/kernel/include/kernel/filesystem/file.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef TEACH_OS_KERNEL_FILESYSTEM_FILE_HPP -#define TEACH_OS_KERNEL_FILESYSTEM_FILE_HPP - -#include <cstddef> - -namespace filesystem -{ - struct file - { - virtual ~file() = default; - - virtual auto open() -> void = 0; - - virtual auto read(void * buffer, size_t offset, size_t size) const -> size_t = 0; - virtual auto write(void const * buffer, size_t offset, size_t size) -> size_t = 0; - }; -} // namespace filesystem - -#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/file_descriptor_table.hpp b/kernel/include/kernel/filesystem/file_descriptor_table.hpp index 6d78532..bc6fb24 100644 --- a/kernel/include/kernel/filesystem/file_descriptor_table.hpp +++ b/kernel/include/kernel/filesystem/file_descriptor_table.hpp @@ -3,10 +3,9 @@ #include "open_file_description.hpp" +#include <kstd/memory> #include <kstd/vector> -#include <optional> - namespace filesystem { struct file_descriptor_table @@ -16,15 +15,14 @@ namespace filesystem ~file_descriptor_table() = default; - auto add_file(open_file_description & f) -> int; - [[nodiscard]] auto get_file(int fd) const -> std::optional<open_file_description>; + auto add_file(kstd::shared_ptr<open_file_description> const & f) -> int; + [[nodiscard]] auto get_file(int fd) const -> kstd::shared_ptr<open_file_description>; auto remove_file(int fd) -> void; private: file_descriptor_table() = default; - // TODO BA-FS26 use kstd::shared_ptr when available - kstd::vector<std::optional<open_file_description>> m_open_files{}; + kstd::vector<kstd::shared_ptr<open_file_description>> m_open_files{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/filesystem.hpp b/kernel/include/kernel/filesystem/filesystem.hpp index 23924c4..e069ced 100644 --- a/kernel/include/kernel/filesystem/filesystem.hpp +++ b/kernel/include/kernel/filesystem/filesystem.hpp @@ -5,6 +5,7 @@ #include "kernel/filesystem/inode.hpp" #include <kstd/memory> +#include <kstd/vector> #include <string_view> @@ -14,13 +15,15 @@ namespace filesystem { virtual ~filesystem() = default; - virtual auto mount(kstd::shared_ptr<devices::device> const & device) -> int = 0; - virtual auto lookup(inode const & parent, std::string_view name) -> inode * = 0; + virtual auto mount(kstd::shared_ptr<devices::device> const & device) -> int; + virtual auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> = 0; - [[nodiscard]] auto root_inode() const -> inode const &; + [[nodiscard]] auto root_inode() const -> kstd::shared_ptr<inode> const &; protected: - inode m_root_inode{}; // TODO BA-FS26 set during mount? + kstd::shared_ptr<inode> m_root_inode{}; + kstd::shared_ptr<devices::device> m_device{}; + kstd::vector<kstd::shared_ptr<inode>> m_inodes{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/inode.hpp b/kernel/include/kernel/filesystem/inode.hpp index a2955f9..6d8f0d4 100644 --- a/kernel/include/kernel/filesystem/inode.hpp +++ b/kernel/include/kernel/filesystem/inode.hpp @@ -1,37 +1,32 @@ #ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP #define TEACH_OS_KERNEL_FILESYSTEM_INODE_HPP -#include "kernel/devices/device.hpp" -#include "kernel/filesystem/inode_metadata.hpp" - -#include <kstd/memory> - #include <cstddef> namespace filesystem { struct inode { - inode() = default; + enum class inode_kind + { + regular, + directory, + device + }; + explicit inode(inode_kind kind); - explicit inode(kstd::shared_ptr<devices::device> const & device); - [[nodiscard]] auto metadata() const -> inode_metadata; + virtual ~inode() = default; + + virtual auto read(void * buffer, size_t offset, size_t size) const -> size_t = 0; + virtual auto write(void const * buffer, size_t offset, size_t size) -> size_t = 0; [[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; - [[nodiscard]] auto minor_device() const -> size_t; - [[nodiscard]] auto backing_device() const -> kstd::shared_ptr<devices::device> const &; - - auto read(void * buffer, size_t offset, size_t size) const -> size_t; - auto write(void const * buffer, size_t offset, size_t size) -> size_t; private: inode_kind m_kind{inode_kind::regular}; - kstd::shared_ptr<devices::device> m_device{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/inode_file.hpp b/kernel/include/kernel/filesystem/inode_file.hpp deleted file mode 100644 index ee84eee..0000000 --- a/kernel/include/kernel/filesystem/inode_file.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef TEACH_OS_KERNEL_FILESYSTEM_INODE_FILE_HPP -#define TEACH_OS_KERNEL_FILESYSTEM_INODE_FILE_HPP - -#include "kernel/filesystem/file.hpp" -#include "kernel/filesystem/inode.hpp" - -#include <kstd/memory> - -#include <cstddef> - -namespace filesystem -{ - struct inode_file : file - { - explicit inode_file(kstd::shared_ptr<inode> const & inode); - - auto open() -> void override; - - 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; - - private: - kstd::shared_ptr<inode> m_inode; - }; -} // namespace filesystem - -#endif
\ No newline at end of file diff --git a/kernel/include/kernel/filesystem/inode_metadata.hpp b/kernel/include/kernel/filesystem/inode_metadata.hpp deleted file mode 100644 index ed5a09d..0000000 --- a/kernel/include/kernel/filesystem/inode_metadata.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#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/include/kernel/filesystem/mount.hpp b/kernel/include/kernel/filesystem/mount.hpp index 232a9be..0f37687 100644 --- a/kernel/include/kernel/filesystem/mount.hpp +++ b/kernel/include/kernel/filesystem/mount.hpp @@ -1,9 +1,11 @@ #ifndef TEACH_OS_KERNEL_FILESYSTEM_MOUNT_HPP #define TEACH_OS_KERNEL_FILESYSTEM_MOUNT_HPP +#include "kernel/filesystem/dentry.hpp" #include "kernel/filesystem/filesystem.hpp" #include <kstd/memory> +#include <kstd/string> #include <string_view> @@ -11,13 +13,19 @@ namespace filesystem { struct mount { - mount(std::string_view const & path, kstd::shared_ptr<filesystem> const & fs); + mount(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<dentry> const & root_dentry, + kstd::shared_ptr<filesystem> const & fs, std::string_view mount_path); + + [[nodiscard]] auto get_mount_dentry() const -> kstd::shared_ptr<dentry>; + [[nodiscard]] auto root_dentry() const -> kstd::shared_ptr<dentry> const &; - [[nodiscard]] auto path() const -> std::string_view; [[nodiscard]] auto get_filesystem() const -> kstd::shared_ptr<filesystem> const &; + [[nodiscard]] auto get_mount_path() const -> std::string_view; private: - std::string_view m_path; + kstd::string m_mount_path; + kstd::shared_ptr<dentry> m_mount_dentry; + kstd::shared_ptr<dentry> m_root_dentry; kstd::shared_ptr<filesystem> m_filesystem{}; }; } // namespace filesystem diff --git a/kernel/include/kernel/filesystem/mount_table.hpp b/kernel/include/kernel/filesystem/mount_table.hpp new file mode 100644 index 0000000..2cd66ea --- /dev/null +++ b/kernel/include/kernel/filesystem/mount_table.hpp @@ -0,0 +1,25 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_MOUNT_TABLE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_MOUNT_TABLE_HPP + +#include "kernel/filesystem/mount.hpp" + +#include <kstd/memory> +#include <kstd/vector> + +#include <string_view> + +namespace filesystem +{ + struct mount_table + { + public: + void add_mount(kstd::shared_ptr<mount>); + + [[nodiscard]] auto find_longest_prefix_mount(std::string_view path) const -> kstd::shared_ptr<mount>; + + private: + kstd::vector<kstd::shared_ptr<mount>> m_mounts; + }; +} // namespace filesystem + +#endif diff --git a/kernel/include/kernel/filesystem/open_file_description.hpp b/kernel/include/kernel/filesystem/open_file_description.hpp index 5ff094d..e17f9fe 100644 --- a/kernel/include/kernel/filesystem/open_file_description.hpp +++ b/kernel/include/kernel/filesystem/open_file_description.hpp @@ -1,7 +1,7 @@ #ifndef TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTION_HPP #define TEACH_OS_KERNEL_FILESYSTEM_OPEN_FILE_DESCRIPTION_HPP -#include "file.hpp" +#include "kernel/filesystem/inode.hpp" #include <kstd/memory> @@ -11,7 +11,7 @@ namespace filesystem { struct open_file_description { - open_file_description(kstd::shared_ptr<file> const & file); + explicit open_file_description(kstd::shared_ptr<inode> const & inode); ~open_file_description() = default; @@ -19,7 +19,7 @@ namespace filesystem auto write(void const * buffer, size_t size) -> size_t; private: - kstd::shared_ptr<file> m_file; + kstd::shared_ptr<inode> m_inode; size_t m_offset; }; diff --git a/kernel/include/kernel/filesystem/rootfs/rootfs_filesystem.hpp b/kernel/include/kernel/filesystem/rootfs/rootfs_filesystem.hpp new file mode 100644 index 0000000..b3e03a9 --- /dev/null +++ b/kernel/include/kernel/filesystem/rootfs/rootfs_filesystem.hpp @@ -0,0 +1,23 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_ROOTFS_ROOTFS_FILESYSTEM_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_ROOTFS_ROOTFS_FILESYSTEM_HPP + +#include "kernel/devices/device.hpp" +#include "kernel/filesystem/filesystem.hpp" +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> +#include <kstd/string> +#include <kstd/vector> + +#include <string_view> + +namespace filesystem::rootfs +{ + struct rootfs_filesystem : filesystem + { + auto mount(kstd::shared_ptr<devices::device> const & device) -> int override; + auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> override; + }; +} // namespace filesystem::rootfs + +#endif diff --git a/kernel/include/kernel/filesystem/rootfs/rootfs_inode.hpp b/kernel/include/kernel/filesystem/rootfs/rootfs_inode.hpp new file mode 100644 index 0000000..de4fb7c --- /dev/null +++ b/kernel/include/kernel/filesystem/rootfs/rootfs_inode.hpp @@ -0,0 +1,31 @@ +#ifndef TEACH_OS_KERNEL_FILESYSTEM_ROOTFS_ROOTFS_INODE_HPP +#define TEACH_OS_KERNEL_FILESYSTEM_ROOTFS_ROOTFS_INODE_HPP + +#include "kernel/filesystem/inode.hpp" + +#include <kstd/memory> +#include <kstd/string> +#include <kstd/vector> + +#include <cstddef> +#include <string_view> +#include <utility> + +namespace filesystem::rootfs +{ + struct rootfs_inode : inode + { + rootfs_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; + + auto add_child(std::string_view name) -> void; + auto lookup_child(std::string_view name) -> kstd::shared_ptr<inode>; + + private: + kstd::vector<std::pair<kstd::string, kstd::shared_ptr<rootfs_inode>>> m_children; + }; +} // namespace filesystem::rootfs + +#endif diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp index a2894a6..9bee104 100644 --- a/kernel/include/kernel/filesystem/vfs.hpp +++ b/kernel/include/kernel/filesystem/vfs.hpp @@ -1,17 +1,13 @@ #ifndef TEACH_OS_KERNEL_FILESYSTEM_VFS_HPP #define TEACH_OS_KERNEL_FILESYSTEM_VFS_HPP -#include "kernel/devices/device.hpp" -#include "kernel/filesystem/custody.hpp" -#include "kernel/filesystem/ext2/ext2_filesystem.hpp" -#include "kernel/filesystem/inode.hpp" -#include "kernel/filesystem/mount.hpp" +#include "kernel/filesystem/dentry.hpp" +#include "kernel/filesystem/filesystem.hpp" +#include "kernel/filesystem/mount_table.hpp" #include "kernel/filesystem/open_file_description.hpp" #include <kstd/memory> -#include <kstd/vector> -#include <optional> #include <string_view> namespace filesystem @@ -23,23 +19,18 @@ namespace filesystem ~vfs() = default; - auto open(std::string_view path) -> std::optional<open_file_description>; + auto open(std::string_view path) -> kstd::shared_ptr<open_file_description>; + auto do_mount(std::string_view path, kstd::shared_ptr<filesystem> const & filesystem) -> int; private: - struct device_node_entry - { - std::string_view name; - kstd::shared_ptr<inode> node; - }; - vfs() = default; - auto make_device_node(kstd::shared_ptr<devices::device> const & device) -> void; - [[nodiscard]] auto resolve_path(std::string_view path) -> std::optional<custody>; + auto init_internal() -> void; + + [[nodiscard]] auto resolve_path(std::string_view path) -> kstd::shared_ptr<dentry>; + auto do_mount_internal(std::string_view path, kstd::shared_ptr<dentry> const & mount_point_dentry, + kstd::shared_ptr<filesystem> const & fs) -> void; - kstd::shared_ptr<ext2::ext2_filesystem> m_root_fs; - std::optional<mount> m_root_mount; - // kstd::vector<mount> m_mounts; // TODO BA-FS26 really needed? - kstd::vector<std::optional<device_node_entry>> m_device_nodes; // TODO BA-FS26 remove again, use devtempfs + mount_table m_mount_table; }; } // namespace filesystem |
