aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/devices/block_device_utils.hpp29
-rw-r--r--kernel/include/kernel/filesystem/dentry.hpp46
-rw-r--r--kernel/include/kernel/filesystem/devfs/filesystem.hpp18
-rw-r--r--kernel/include/kernel/filesystem/devfs/inode.hpp22
-rw-r--r--kernel/include/kernel/filesystem/device_inode.hpp31
-rw-r--r--kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp3
-rw-r--r--kernel/include/kernel/filesystem/ext2/filesystem.hpp29
-rw-r--r--kernel/include/kernel/filesystem/ext2/inode.hpp27
-rw-r--r--kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp3
-rw-r--r--kernel/include/kernel/filesystem/ext2/superblock.hpp3
-rw-r--r--kernel/include/kernel/filesystem/file_descriptor_table.hpp34
-rw-r--r--kernel/include/kernel/filesystem/filesystem.hpp37
-rw-r--r--kernel/include/kernel/filesystem/inode.hpp44
-rw-r--r--kernel/include/kernel/filesystem/mount.hpp28
-rw-r--r--kernel/include/kernel/filesystem/mount_table.hpp16
-rw-r--r--kernel/include/kernel/filesystem/open_file_description.hpp28
-rw-r--r--kernel/include/kernel/filesystem/rootfs/filesystem.hpp18
-rw-r--r--kernel/include/kernel/filesystem/rootfs/inode.hpp34
-rw-r--r--kernel/include/kernel/filesystem/vfs.hpp31
-rw-r--r--kernel/src/filesystem/ext2/filesystem.cpp12
-rw-r--r--kernel/src/filesystem/ext2/inode.cpp2
-rw-r--r--kernel/src/filesystem/filesystem.cpp3
-rw-r--r--kernel/src/filesystem/mount.cpp2
-rw-r--r--kernel/src/filesystem/mount_table.cpp2
-rw-r--r--kernel/src/filesystem/vfs.cpp19
25 files changed, 500 insertions, 21 deletions
diff --git a/kernel/include/kernel/devices/block_device_utils.hpp b/kernel/include/kernel/devices/block_device_utils.hpp
index 5e862ba..7b1daec 100644
--- a/kernel/include/kernel/devices/block_device_utils.hpp
+++ b/kernel/include/kernel/devices/block_device_utils.hpp
@@ -9,7 +9,34 @@
namespace kernel::devices::block_device_utils
{
- auto read(kstd::shared_ptr<kapi::devices::device> const & device, void * buffer, size_t offset, size_t size) -> size_t;
+ /**
+ @brief Utility functions for block devices, such as reading/writing data at specific offsets. These functions handle
+ the necessary logic to interact with block devices, such as calculating block boundaries and ensuring proper access
+ patterns. They abstract away the details of block device interactions, providing a simple interface for reading and
+ writing data to block devices.
+ */
+
+ /**
+ @brief Reads data from a @p device into a @p buffer, starting at a specific @p offset and for a given @p size.
+ @warning Panics if @p buffer or @p device is null.
+ @param device The block device to read from.
+ @param buffer The buffer to read data into.
+ @param offset The offset on the block device to start reading from.
+ @param size The number of bytes to read.
+ @return The number of bytes actually read, which may be less than the requested size.
+ */
+ auto read(kstd::shared_ptr<kapi::devices::device> const & device, void * buffer, size_t offset, size_t size)
+ -> size_t;
+
+ /**
+ @brief Writes data from a @p buffer to a @p device, starting at a specific @p offset and for a given @p size.
+ @warning Panics if @p buffer or @p device is null.
+ @param device The block device to write to.
+ @param buffer The buffer to write data from.
+ @param offset The offset on the block device to start writing to.
+ @param size The number of bytes to write.
+ @return The number of bytes actually written, which may be less than the requested size.
+ */
auto write(kstd::shared_ptr<kapi::devices::device> const & device, void const * buffer, size_t offset, size_t size)
-> size_t;
} // namespace kernel::devices::block_device_utils
diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp
index fc85a7d..72d758f 100644
--- a/kernel/include/kernel/filesystem/dentry.hpp
+++ b/kernel/include/kernel/filesystem/dentry.hpp
@@ -12,23 +12,69 @@
namespace kernel::filesystem
{
+ /**
+ @brief Represents a directory entry (dentry) in the filesystem. A dentry is a node in the directory tree that
+ represents a file or directory. It contains a reference to its parent dentry, a reference to the associated real
+ filesystem inode, and a list of child dentries.
+ */
struct dentry
{
+ /**
+ @brief Flags for the dentry.
+ */
enum class dentry_flags : uint32_t
{
dcache_mounted = 1 << 15
};
+ /**
+ @brief Create a dentry with the given @p parent, associated @p node, and optional @p name. The dentry is initialized
+ with the provided parent and inode, and the name is stored for lookup purposes.
+ */
dentry(kstd::shared_ptr<dentry> const & parent, kstd::shared_ptr<inode> const & node, std::string_view name = {});
+ /**
+ @brief Get the associated inode.
+ @return A reference to the associated inode.
+ */
[[nodiscard]] auto get_inode() const -> kstd::shared_ptr<inode> const &;
+
+ /**
+ @brief Get the parent dentry.
+ @return A reference to the parent dentry.
+ */
[[nodiscard]] auto get_parent() const -> kstd::shared_ptr<dentry> const &;
+ /**
+ @brief Add a @p child dentry.
+ @param child The child dentry to add.
+ */
auto add_child(kstd::shared_ptr<dentry> const & child) -> void;
+
+ /**
+ @brief Find a child dentry by @p name.
+ @param name The name of the child dentry to find.
+ @return A pointer to the found child dentry, or a null pointer if not found.
+ */
[[nodiscard]] auto find_child(std::string_view name) const -> kstd::shared_ptr<dentry>;
+ /**
+ @brief Set a @p flag for the dentry.
+ @param flag The flag to set.
+ */
auto set_flag(dentry_flags flag) -> void;
+
+ /**
+ @brief Unset a @p flag for the dentry.
+ @param flag The flag to unset.
+ */
auto unset_flag(dentry_flags flag) -> void;
+
+ /**
+ @brief Check if the dentry has a specific @p flag.
+ @param flag The flag to check.
+ @return True if the dentry has the flag, false otherwise.
+ */
[[nodiscard]] auto has_flag(dentry_flags flag) const -> bool;
private:
diff --git a/kernel/include/kernel/filesystem/devfs/filesystem.hpp b/kernel/include/kernel/filesystem/devfs/filesystem.hpp
index 3edeabb..60c39cf 100644
--- a/kernel/include/kernel/filesystem/devfs/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/devfs/filesystem.hpp
@@ -13,9 +13,27 @@
namespace kernel::filesystem::devfs
{
+ /**
+ @brief A filesystem for managing device nodes in the virtual filesystem. This filesystem provides a way to represent
+ devices as files in the /dev directory, allowing user-space applications to interact with devices using standard file
+ operations. The devfs filesystem dynamically creates inodes for devices registered in the system, enabling seamless
+ access to device functionality through the filesystem interface.
+ */
struct filesystem : kernel::filesystem::filesystem
{
+ /**
+ @brief Initializes the devfs instance and builds the device inode table.
+ @param device Backing device passed by the generic filesystem interface (not required by devfs).
+ @return 0 on success, -1 on failure.
+ */
auto mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int override;
+
+ /**
+ @brief Looks up an inode by @p name within a @p parent directory.
+ @param parent The parent directory inode.
+ @param name The name of the inode to look up.
+ @return A pointer to the found inode, or a null pointer if not found.
+ */
auto lookup(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
-> kstd::shared_ptr<kernel::filesystem::inode> override;
diff --git a/kernel/include/kernel/filesystem/devfs/inode.hpp b/kernel/include/kernel/filesystem/devfs/inode.hpp
index 9c11edf..c117bd2 100644
--- a/kernel/include/kernel/filesystem/devfs/inode.hpp
+++ b/kernel/include/kernel/filesystem/devfs/inode.hpp
@@ -7,11 +7,33 @@
namespace kernel::filesystem::devfs
{
+ /**
+ @brief Inode implementation for the devfs filesystem.
+ This inode represents root device node in the /dev directory.
+ */
struct inode : kernel::filesystem::inode
{
+ /**
+ @brief Create a devfs inode. The inode is initialized with the appropriate kind (directory).
+ */
inode();
+ /**
+ @brief Reads from the devfs directory inode.
+ @param buffer Destination buffer.
+ @param offset Read offset in bytes.
+ @param size Number of bytes requested.
+ @return Number of bytes read (always 0 because this inode does not expose file data).
+ */
auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
+
+ /**
+ @brief Writes to the devfs directory inode.
+ @param buffer Source buffer.
+ @param offset Write offset in bytes.
+ @param size Number of bytes requested.
+ @return Number of bytes written (always 0 because writes are not supported for this inode).
+ */
auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
};
} // namespace kernel::filesystem::devfs
diff --git a/kernel/include/kernel/filesystem/device_inode.hpp b/kernel/include/kernel/filesystem/device_inode.hpp
index 18a98f5..c33be2a 100644
--- a/kernel/include/kernel/filesystem/device_inode.hpp
+++ b/kernel/include/kernel/filesystem/device_inode.hpp
@@ -2,6 +2,7 @@
#define TEACH_OS_KERNEL_FILESYSTEM_DEVICE_INODE_HPP
#include "kapi/devices/device.hpp"
+
#include "kernel/filesystem/inode.hpp"
#include <kstd/memory>
@@ -10,13 +11,43 @@
namespace kernel::filesystem
{
+ /**
+ @brief Inode implementation for device inodes in the filesystem. This inode represents a device file that provides
+ access to a device registered in the system. The device inode allows reading from and writing to the associated
+ device.
+ */
struct device_inode : inode
{
+ /**
+ @brief Create a device inode with the given @p device.
+ @param device The device to associate with the inode.
+ */
explicit device_inode(kstd::shared_ptr<kapi::devices::device> const & device);
+ /**
+ @brief Read data from the device inode (and in the background from the associated device) into a @p buffer, starting
+ at @p offset and reading @p size bytes.
+ @param buffer The buffer to read data into.
+ @param offset The offset to read from.
+ @param size The number of bytes to read.
+ @return The number of bytes read.
+ */
auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
+
+ /**
+ @brief Write data to the device inode (and in the background from the associated device) from a @p buffer, starting
+ at @p offset and writing @p size bytes.
+ @param buffer The buffer containing data to write.
+ @param offset The offset to write to.
+ @param size The number of bytes to write.
+ @return The number of bytes written.
+ */
auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
+ /**
+ @brief Get the associated device.
+ @return A reference to the associated device.
+ */
[[nodiscard]] auto device() const -> kstd::shared_ptr<kapi::devices::device> const &;
private:
diff --git a/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp b/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp
index 2ff91d9..7fbba3f 100644
--- a/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp
+++ b/kernel/include/kernel/filesystem/ext2/block_group_descriptor.hpp
@@ -6,6 +6,9 @@
namespace kernel::filesystem::ext2
{
+ /**
+ @brief Represents a block group descriptor in the ext2 filesystem.
+ */
struct [[gnu::packed]] block_group_descriptor
{
uint32_t block_bitmap;
diff --git a/kernel/include/kernel/filesystem/ext2/filesystem.hpp b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
index abab0a6..32374dc 100644
--- a/kernel/include/kernel/filesystem/ext2/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/ext2/filesystem.hpp
@@ -18,13 +18,40 @@
namespace kernel::filesystem::ext2
{
+ /**
+ @brief A filesystem implementation for the ext2 filesystem format. This class provides methods for mounting an ext2
+ filesystem, and looking up inodes.
+ */
struct filesystem : kernel::filesystem::filesystem
{
+ /**
+ @brief Initializes the ext2 filesystem with the given @p device.
+ @param device The device to mount.
+ @return 0 on success, negative error code on failure.
+ */
auto mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int override;
+
+ /**
+ @brief Looks up an inode by @p name within a @p parent directory.
+ @param parent The parent directory inode.
+ @param name The name of the inode to look up.
+ @return A pointer to the found inode, or a null pointer if not found.
+ */
auto lookup(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
-> kstd::shared_ptr<kernel::filesystem::inode> override;
+ /**
+ @brief Gets the size of a block in the filesystem.
+ @return The size of a block in bytes.
+ */
auto get_block_size() -> size_t;
+
+ /**
+ @brief Maps an inode block index to a global block number.
+ @param inode_block_index The index of the block within the inode.
+ @param data The inode data.
+ @return The global block number.
+ */
auto map_inode_block_index_to_global_block_number(uint32_t inode_block_index, inode_data data) -> uint32_t;
private:
@@ -34,7 +61,7 @@ namespace kernel::filesystem::ext2
auto get_inode_size() -> size_t;
auto get_inode_block_count(inode_data const & data) -> uint32_t;
- superblock m_superblock; // TODO BA-FS26 initialize
+ superblock m_superblock{};
kstd::vector<block_group_descriptor> m_block_group_descriptors;
};
} // namespace kernel::filesystem::ext2
diff --git a/kernel/include/kernel/filesystem/ext2/inode.hpp b/kernel/include/kernel/filesystem/ext2/inode.hpp
index 9318008..a1645cd 100644
--- a/kernel/include/kernel/filesystem/ext2/inode.hpp
+++ b/kernel/include/kernel/filesystem/ext2/inode.hpp
@@ -13,6 +13,9 @@ namespace kernel::filesystem::ext2
{
struct filesystem;
+ /**
+ @brief Represents the data associated with an ext2 inode.
+ */
struct [[gnu::packed]] inode_data
{
uint16_t mode;
@@ -37,12 +40,36 @@ namespace kernel::filesystem::ext2
struct inode : kernel::filesystem::inode
{
+ /**
+ @brief Create an ext2 inode associated with the given filesystem.
+ */
explicit inode(filesystem * fs);
+ /**
+ @brief Reads from the ext2 inode into a @p buffer, starting at the specified @p offset and for a given @p size.
+ @param buffer Destination buffer.
+ @param offset Read offset in bytes.
+ @param size Number of bytes requested.
+ @return Number of bytes read.
+ */
auto read(void * buffer, size_t offset, size_t size) const -> size_t override;
+
+ /**
+ @brief Writes to the ext2 inode into a @p buffer, starting at the specified @p offset and for a given @p size.
+ @warning This method is not implemented yet and will panic if called.
+ @param buffer Source buffer.
+ @param offset Write offset in bytes.
+ @param size Number of bytes requested.
+ @return Number of bytes written.
+ */
auto write(void const * buffer, size_t offset, size_t size) -> size_t override;
+ /**
+ @brief The raw inode data as read from the disk.
+ */
inode_data m_data{};
+
+ private:
filesystem * m_filesystem;
};
} // namespace kernel::filesystem::ext2
diff --git a/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp b/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp
index 76eb6f5..4097cbb 100644
--- a/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp
+++ b/kernel/include/kernel/filesystem/ext2/linked_directory_entry.hpp
@@ -6,6 +6,9 @@
namespace kernel::filesystem::ext2
{
+ /**
+ @brief Represents a linked directory entry in the ext2 filesystem.
+ */
struct [[gnu::packed]] linked_directory_entry
{
uint32_t inode;
diff --git a/kernel/include/kernel/filesystem/ext2/superblock.hpp b/kernel/include/kernel/filesystem/ext2/superblock.hpp
index 8e57ae7..41ad935 100644
--- a/kernel/include/kernel/filesystem/ext2/superblock.hpp
+++ b/kernel/include/kernel/filesystem/ext2/superblock.hpp
@@ -6,6 +6,9 @@
namespace kernel::filesystem::ext2
{
+ /**
+ @brief Represents the superblock in the ext2 filesystem.
+ */
struct [[gnu::packed]] superblock
{
uint32_t inodes_count;
diff --git a/kernel/include/kernel/filesystem/file_descriptor_table.hpp b/kernel/include/kernel/filesystem/file_descriptor_table.hpp
index 91e2960..5d52c19 100644
--- a/kernel/include/kernel/filesystem/file_descriptor_table.hpp
+++ b/kernel/include/kernel/filesystem/file_descriptor_table.hpp
@@ -8,15 +8,49 @@
namespace kernel::filesystem
{
+ /**
+ @brief A table for managing file descriptors in the filesystem. This class provides methods for adding, retrieving,
+ and removing open file descriptions.
+ */
struct file_descriptor_table
{
+ /**
+ @brief Initialize the global file descriptor table. This method creates the singleton instance of the file
+ descriptor table.
+ @warning Panics if called more than once.
+ */
auto static init() -> void;
+
+ /**
+ @brief Get the global file descriptor table instance.
+ @return A reference to the global file descriptor table.
+ @warning Panics if the file descriptor table has not been initialized.
+ */
auto static get() -> file_descriptor_table &;
+ /**
+ @brief Destructor for the file descriptor table.
+ */
~file_descriptor_table() = default;
+ /**
+ @brief Add a file to the descriptor table.
+ @param f The file description to add.
+ @return The file descriptor index assigned to the file, or -1 on failure.
+ */
auto add_file(kstd::shared_ptr<open_file_description> const & f) -> int;
+
+ /**
+ @brief Get a file from the descriptor table.
+ @param fd The file descriptor index to retrieve.
+ @return A pointer to the requested file description, or a null pointer if not found.
+ */
[[nodiscard]] auto get_file(int fd) const -> kstd::shared_ptr<open_file_description>;
+
+ /**
+ @brief Remove a file from the descriptor table.
+ @param fd The file descriptor index to remove.
+ */
auto remove_file(int fd) -> void;
private:
diff --git a/kernel/include/kernel/filesystem/filesystem.hpp b/kernel/include/kernel/filesystem/filesystem.hpp
index 0f9de9f..f855380 100644
--- a/kernel/include/kernel/filesystem/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/filesystem.hpp
@@ -12,16 +12,53 @@
namespace kernel::filesystem
{
+ /**
+ @brief A base class for implementing filesystems in the kernel. This class provides a common interface for managing
+ files and directories within the virtual filesystem.
+ */
struct filesystem
{
+ /**
+ @brief Virtual destructor for the filesystem.
+ */
virtual ~filesystem() = default;
+ /**
+ @brief Probes the given @p device to determine if it contains a recognizable filesystem, and if so, mounts it and
+ returns a pointer to the mounted filesystem instance. This method iterates through known filesystem types and
+ attempts to initialize it with the device until the mount was successful or all types have been tried.
+ @param device The device to probe and mount.
+ @return A pointer to the mounted filesystem instance if successful, or a null pointer if no recognizable filesystem
+ is found on the device.
+ @warning Panics if @p device is null.
+ */
auto static probe_and_mount(kstd::shared_ptr<kapi::devices::device> const & device) -> kstd::shared_ptr<filesystem>;
+ /**
+ @brief Initializes the filesystem with the given @p device.
+ @param device The device to mount.
+ @return 0 on success, or a negative error code on failure.
+ */
virtual auto mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int;
+
+ /**
+ @brief Looks up a child inode within the given @p parent inode with the specified @p name. This method must be
+ implemented by concrete filesystem subclasses to provide the logic for traversing the filesystem structure and
+ finding the requested inode.
+ @param parent The parent inode.
+ @param name The name of the child inode to look up.
+ @return A pointer to the requested child inode, or a null pointer if not found.
+ */
virtual auto lookup(kstd::shared_ptr<inode> const & parent, std::string_view name) -> kstd::shared_ptr<inode> = 0;
+ /**
+ @brief Returns a reference to the root inode of the filesystem.
+ */
[[nodiscard]] auto root_inode() const -> kstd::shared_ptr<inode> const &;
+
+ /**
+ @brief Returns a reference to the device associated with the filesystem.
+ */
[[nodiscard]] auto device() const -> kstd::shared_ptr<kapi::devices::device> const &;
protected:
diff --git a/kernel/include/kernel/filesystem/inode.hpp b/kernel/include/kernel/filesystem/inode.hpp
index 59207df..7237184 100644
--- a/kernel/include/kernel/filesystem/inode.hpp
+++ b/kernel/include/kernel/filesystem/inode.hpp
@@ -5,8 +5,14 @@
namespace kernel::filesystem
{
+ /**
+ @brief Represents an inode in the filesystem.
+ */
struct inode
{
+ /**
+ @brief Represents the kind of an inode.
+ */
enum class inode_kind
{
regular,
@@ -14,15 +20,53 @@ namespace kernel::filesystem
device
};
+ /**
+ @brief Create an inode with the given @p kind.
+ @param kind The kind of the inode.
+ */
explicit inode(inode_kind kind);
+ /**
+ @brief Virtual destructor for the inode.
+ */
virtual ~inode() = default;
+ /**
+ @brief Reads from the inode into a @p buffer, starting at the specified @p offset and for a given @p size. This
+ method must be implemented by concrete inode subclasses.
+ @param buffer Destination buffer.
+ @param offset Read offset in bytes.
+ @param size Number of bytes requested.
+ @return Number of bytes read.
+ */
virtual auto read(void * buffer, size_t offset, size_t size) const -> size_t = 0;
+
+ /**
+ @brief Writes to the inode into a @p buffer, starting at the specified @p offset and for a given @p size. This
+ method must be implemented by concrete inode subclasses.
+ @param buffer Source buffer.
+ @param offset Write offset in bytes.
+ @param size Number of bytes to write.
+ @return Number of bytes written.
+ */
virtual auto write(void const * buffer, size_t offset, size_t size) -> size_t = 0;
+ /**
+ @brief Returns whether the inode is a directory.
+ @return true if the inode is a directory, false otherwise.
+ */
[[nodiscard]] auto is_directory() const -> bool;
+
+ /**
+ @brief Returns whether the inode is a regular file.
+ @return true if the inode is a regular file, false otherwise.
+ */
[[nodiscard]] auto is_regular() const -> bool;
+
+ /**
+ @brief Returns whether the inode is a device.
+ @return true if the inode is a device, false otherwise.
+ */
[[nodiscard]] auto is_device() const -> bool;
// TODO BA-FS26 improve inode_kind really needed?
diff --git a/kernel/include/kernel/filesystem/mount.hpp b/kernel/include/kernel/filesystem/mount.hpp
index a054750..3e3c69f 100644
--- a/kernel/include/kernel/filesystem/mount.hpp
+++ b/kernel/include/kernel/filesystem/mount.hpp
@@ -11,15 +11,41 @@
namespace kernel::filesystem
{
+ /**
+ @brief Represents a mounted filesystem in the kernel.
+ */
struct mount
{
+ /**
+ @brief Creates a mount for the given @p filesystem at the specified @p mount_path. The @p mount_dentry represents
+ the dentry where the filesystem is mounted, and the @p root_dentry represents the root dentry of the mounted
+ filesystem.
+ @param mount_dentry The dentry where the filesystem is mounted.
+ @param root_dentry The root dentry of the mounted filesystem.
+ @param fs The filesystem instance being mounted.
+ @param mount_path The path at which the filesystem is mounted.
+ */
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>;
+ /**
+ @brief Get the dentry where the filesystem is mounted.
+ */
+ [[nodiscard]] auto get_mount_dentry() const -> kstd::shared_ptr<dentry> const &;
+
+ /**
+ @brief Get the root dentry of the mounted filesystem.
+ */
[[nodiscard]] auto root_dentry() const -> kstd::shared_ptr<dentry> const &;
+ /**
+ @brief Get the filesystem instance being mounted.
+ */
[[nodiscard]] auto get_filesystem() const -> kstd::shared_ptr<filesystem> const &;
+
+ /**
+ @brief Get the path at which the filesystem is mounted.
+ */
[[nodiscard]] auto get_mount_path() const -> std::string_view;
private:
diff --git a/kernel/include/kernel/filesystem/mount_table.hpp b/kernel/include/kernel/filesystem/mount_table.hpp
index 6dc2218..a8ef59e 100644
--- a/kernel/include/kernel/filesystem/mount_table.hpp
+++ b/kernel/include/kernel/filesystem/mount_table.hpp
@@ -10,11 +10,23 @@
namespace kernel::filesystem
{
+ /**
+ @brief A table for managing mounted filesystems in the kernel.
+ */
struct mount_table
{
- public:
- void add_mount(kstd::shared_ptr<mount>);
+ /**
+ @brief Adds a mount to the table.
+ @param mount The mount to add.
+ */
+ void add_mount(kstd::shared_ptr<mount> const & mount);
+ /**
+ @brief Finds the mount with the longest prefix matching the given @p path. This method is used to determine which
+ mounted filesystem should handle a given path lookup.
+ @param path The path to match against the mount paths in the table.
+ @return A pointer to the mount with the longest matching prefix, or a null pointer if no mount matches the path.
+ */
[[nodiscard]] auto find_longest_prefix_mount(std::string_view path) const -> kstd::shared_ptr<mount>;
private:
diff --git a/kernel/include/kernel/filesystem/open_file_description.hpp b/kernel/include/kernel/filesystem/open_file_description.hpp
index 45719cf..ed878a7 100644
--- a/kernel/include/kernel/filesystem/open_file_description.hpp
+++ b/kernel/include/kernel/filesystem/open_file_description.hpp
@@ -9,13 +9,41 @@
namespace kernel::filesystem
{
+ /**
+ @brief Represents an open file description in the filesystem. This class encapsulates the state of an open file,
+ including a reference to the associated inode and the current file offset.
+ */
struct open_file_description
{
+ /**
+ @brief Constructs an open file description for the given @p inode.
+ @param inode The inode to associate with the open file description.
+ */
explicit open_file_description(kstd::shared_ptr<inode> const & inode);
+ /**
+ @brief Destructor for the open file description.
+ */
~open_file_description() = default;
+ /**
+ @brief Reads data from the open file description into a @p buffer, starting at the current file offset and for a
+ given
+ @p size. The file offset is advanced by the number of bytes read.
+ @param buffer The buffer to read data into.
+ @param size The number of bytes to read.
+ @return The number of bytes read.
+ */
auto read(void * buffer, size_t size) -> size_t;
+
+ /**
+ @brief Writes data to the open file description from a @p buffer, starting at the current file offset and for a
+ given
+ @p size. The file offset is advanced by the number of bytes written.
+ @param buffer The buffer to write data from.
+ @param size The number of bytes to write.
+ @return The number of bytes written.
+ */
auto write(void const * buffer, size_t size) -> size_t;
private:
diff --git a/kernel/include/kernel/filesystem/rootfs/filesystem.hpp b/kernel/include/kernel/filesystem/rootfs/filesystem.hpp
index 7931d87..b7e7c6f 100644
--- a/kernel/include/kernel/filesystem/rootfs/filesystem.hpp
+++ b/kernel/include/kernel/filesystem/rootfs/filesystem.hpp
@@ -14,9 +14,27 @@
namespace kernel::filesystem::rootfs
{
+ /**
+ @brief A filesystem for the root filesystem. This filesystem provides access to the root directory and its contents,
+ which are typically populated by the init process during system startup. The rootfs filesystem serves as the top-level
+ directory in the filesystem hierarchy. It is responsible for providing a stable and consistent interface to the root
+ directory.
+ */
struct filesystem : kernel::filesystem::filesystem
{
+ /**
+ @brief Initializes the rootfs filesystem with the given @p device.
+ @param device The device to mount (not required by rootfs).
+ @return 0 on success, negative error code on failure.
+ */
auto mount(kstd::shared_ptr<kapi::devices::device> const & device) -> int override;
+
+ /**
+ @brief Looks up an inode by @p name within a @p parent directory.
+ @param parent The parent directory inode.
+ @param name The name of the inode to look up.
+ @return A pointer to the found inode, or a null pointer if not found.
+ */
auto lookup(kstd::shared_ptr<kernel::filesystem::inode> const & parent, std::string_view name)
-> kstd::shared_ptr<kernel::filesystem::inode> override;
};
diff --git a/kernel/include/kernel/filesystem/rootfs/inode.hpp b/kernel/include/kernel/filesystem/rootfs/inode.hpp
index 24d3e6b..469e47a 100644
--- a/kernel/include/kernel/filesystem/rootfs/inode.hpp
+++ b/