aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/CMakeLists.txt2
-rw-r--r--kernel/kernel/filesystem/error.cpp103
-rw-r--r--kernel/kernel/filesystem/error.hpp94
-rw-r--r--kernel/kernel/filesystem/ext2/error.cpp92
-rw-r--r--kernel/kernel/filesystem/ext2/error.hpp81
-rw-r--r--kernel/kernel/filesystem/open_file_descriptor.cpp2
6 files changed, 199 insertions, 175 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 1f7f66c4..7ada841d 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -47,6 +47,7 @@ target_sources("kernel_lib" PRIVATE
# Filesystem Subsystem
"kernel/filesystem/dentry.cpp"
"kernel/filesystem/device_inode.cpp"
+ "kernel/filesystem/error.cpp"
"kernel/filesystem/filesystem.cpp"
"kernel/filesystem/inode.cpp"
"kernel/filesystem/mount_table.cpp"
@@ -61,6 +62,7 @@ target_sources("kernel_lib" PRIVATE
"kernel/filesystem/devfs/inode.cpp"
# ext2 Filesystem
+ "kernel/filesystem/ext2/error.cpp"
"kernel/filesystem/ext2/filesystem.cpp"
"kernel/filesystem/ext2/inode.cpp"
diff --git a/kernel/kernel/filesystem/error.cpp b/kernel/kernel/filesystem/error.cpp
new file mode 100644
index 00000000..5512a5af
--- /dev/null
+++ b/kernel/kernel/filesystem/error.cpp
@@ -0,0 +1,103 @@
+#include <kernel/filesystem/error.hpp>
+
+#include <kstd/system_error.hpp>
+
+#include <string_view>
+
+namespace kernel::filesystem
+{
+
+ namespace
+ {
+ struct vfs_category_t final : kstd::error_category
+ {
+ [[nodiscard]] constexpr auto name() const noexcept -> std::string_view override
+ {
+ return "vfs";
+ }
+
+ [[nodiscard]] constexpr auto message(int value) const noexcept -> std::string_view override
+ {
+ switch (static_cast<vfs_errc>(value))
+ {
+ case vfs_errc::invalid_path:
+ return "invalid path";
+ case vfs_errc::no_such_file_or_directory:
+ return "no such file or directory";
+ case vfs_errc::mount_point_not_found:
+ return "mount point not found";
+ case vfs_errc::mount_busy:
+ return "mount point is busy";
+ case vfs_errc::has_child_mounts:
+ return "mount point has child mounts";
+ case vfs_errc::invalid_filesystem:
+ return "invalid filesystem";
+ case vfs_errc::unmount_failed:
+ return "unmount failed";
+ case vfs_errc::too_many_symbolic_link_levels:
+ return "too many symbolic link levels";
+ case vfs_errc::unsupported_filesystem:
+ return "unsupported filesystem";
+ case vfs_errc::invalid_file_descriptor:
+ return "invalid file descriptor";
+ case vfs_errc::invalid_inode:
+ return "invalid inode";
+ case vfs_errc::not_a_directory:
+ return "not a directory";
+ case vfs_errc::is_a_directory:
+ return "is a directory";
+ case vfs_errc::read_only_file_system:
+ return "readonly filesystem";
+ case vfs_errc::file_exists:
+ return "file already exists";
+ case vfs_errc::no_such_device:
+ return "no such device";
+ default:
+ return "unknown VFS error";
+ }
+ }
+
+ [[nodiscard]] constexpr auto default_error_condition(int value) const noexcept -> kstd::error_condition override
+ {
+ switch (static_cast<vfs_errc>(value))
+ {
+ case vfs_errc::invalid_path:
+ case vfs_errc::invalid_filesystem:
+ case vfs_errc::invalid_inode:
+ return make_error_condition(kstd::errc::invalid_argument);
+ case vfs_errc::no_such_file_or_directory:
+ case vfs_errc::mount_point_not_found:
+ return make_error_condition(kstd::errc::no_such_file_or_directory);
+ case kernel::filesystem::vfs_errc::mount_busy:
+ case kernel::filesystem::vfs_errc::has_child_mounts:
+ case vfs_errc::unmount_failed:
+ return make_error_condition(kstd::errc::device_or_resource_busy);
+ case vfs_errc::too_many_symbolic_link_levels:
+ return make_error_condition(kstd::errc::too_many_symbolic_link_levels);
+ case vfs_errc::unsupported_filesystem:
+ return make_error_condition(kstd::errc::not_supported);
+ case vfs_errc::invalid_file_descriptor:
+ return make_error_condition(kstd::errc::bad_file_descriptor);
+ case vfs_errc::not_a_directory:
+ return make_error_condition(kstd::errc::not_a_directory);
+ case vfs_errc::is_a_directory:
+ return make_error_condition(kstd::errc::is_a_directory);
+ case vfs_errc::read_only_file_system:
+ return make_error_condition(kstd::errc::read_only_file_system);
+ case vfs_errc::file_exists:
+ return make_error_condition(kstd::errc::file_exists);
+ case vfs_errc::no_such_device:
+ return make_error_condition(kstd::errc::no_such_device);
+ default:
+ return kstd::error_condition{value, *this};
+ }
+ }
+ } constexpr vfs_category_instance{};
+ } // namespace
+
+ [[nodiscard]] auto vfs_category() noexcept -> kstd::error_category const &
+ {
+ return vfs_category_instance;
+ }
+
+} // namespace kernel::filesystem
diff --git a/kernel/kernel/filesystem/error.hpp b/kernel/kernel/filesystem/error.hpp
index 286d7a24..8c9d9e0b 100644
--- a/kernel/kernel/filesystem/error.hpp
+++ b/kernel/kernel/filesystem/error.hpp
@@ -3,7 +3,6 @@
#include <kstd/system_error.hpp>
-#include <string_view>
#include <type_traits>
namespace kernel::filesystem
@@ -29,98 +28,7 @@ namespace kernel::filesystem
no_such_device,
};
- namespace detail
- {
- struct vfs_category_t final : kstd::error_category
- {
- [[nodiscard]] constexpr auto name() const noexcept -> std::string_view override
- {
- return "vfs";
- }
-
- [[nodiscard]] constexpr auto message(int value) const noexcept -> std::string_view override
- {
- switch (static_cast<vfs_errc>(value))
- {
- case vfs_errc::invalid_path:
- return "invalid path";
- case vfs_errc::no_such_file_or_directory:
- return "no such file or directory";
- case vfs_errc::mount_point_not_found:
- return "mount point not found";
- case vfs_errc::mount_busy:
- return "mount point is busy";
- case vfs_errc::has_child_mounts:
- return "mount point has child mounts";
- case vfs_errc::invalid_filesystem:
- return "invalid filesystem";
- case vfs_errc::unmount_failed:
- return "unmount failed";
- case vfs_errc::too_many_symbolic_link_levels:
- return "too many symbolic link levels";
- case vfs_errc::unsupported_filesystem:
- return "unsupported filesystem";
- case vfs_errc::invalid_file_descriptor:
- return "invalid file descriptor";
- case vfs_errc::invalid_inode:
- return "invalid inode";
- case vfs_errc::not_a_directory:
- return "not a directory";
- case vfs_errc::is_a_directory:
- return "is a directory";
- case vfs_errc::read_only_file_system:
- return "readonly filesystem";
- case vfs_errc::file_exists:
- return "file already exists";
- case vfs_errc::no_such_device:
- return "no such device";
- default:
- return "unknown VFS error";
- }
- }
-
- [[nodiscard]] constexpr auto default_error_condition(int value) const noexcept -> kstd::error_condition override
- {
- switch (static_cast<vfs_errc>(value))
- {
- case vfs_errc::invalid_path:
- case vfs_errc::invalid_filesystem:
- case vfs_errc::invalid_inode:
- return make_error_condition(kstd::errc::invalid_argument);
- case vfs_errc::no_such_file_or_directory:
- case vfs_errc::mount_point_not_found:
- return make_error_condition(kstd::errc::no_such_file_or_directory);
- case kernel::filesystem::vfs_errc::mount_busy:
- case kernel::filesystem::vfs_errc::has_child_mounts:
- case vfs_errc::unmount_failed:
- return make_error_condition(kstd::errc::device_or_resource_busy);
- case vfs_errc::too_many_symbolic_link_levels:
- return make_error_condition(kstd::errc::too_many_symbolic_link_levels);
- case vfs_errc::unsupported_filesystem:
- return make_error_condition(kstd::errc::not_supported);
- case vfs_errc::invalid_file_descriptor:
- return make_error_condition(kstd::errc::bad_file_descriptor);
- case vfs_errc::not_a_directory:
- return make_error_condition(kstd::errc::not_a_directory);
- case vfs_errc::is_a_directory:
- return make_error_condition(kstd::errc::is_a_directory);
- case vfs_errc::read_only_file_system:
- return make_error_condition(kstd::errc::read_only_file_system);
- case vfs_errc::file_exists:
- return make_error_condition(kstd::errc::file_exists);
- case vfs_errc::no_such_device:
- return make_error_condition(kstd::errc::no_such_device);
- default:
- return kstd::error_condition{value, *this};
- }
- }
- } constexpr inline vfs_category_instance{};
- } // namespace detail
-
- [[nodiscard]] constexpr auto inline vfs_category() noexcept -> kstd::error_category const &
- {
- return detail::vfs_category_instance;
- }
+ [[nodiscard]] auto vfs_category() noexcept -> kstd::error_category const &;
[[nodiscard]] constexpr auto inline make_error_code(vfs_errc error) noexcept -> kstd::error_code
{
diff --git a/kernel/kernel/filesystem/ext2/error.cpp b/kernel/kernel/filesystem/ext2/error.cpp
new file mode 100644
index 00000000..1da4ef36
--- /dev/null
+++ b/kernel/kernel/filesystem/ext2/error.cpp
@@ -0,0 +1,92 @@
+#include <kernel/filesystem/ext2/error.hpp>
+
+#include <kernel/filesystem/error.hpp>
+
+#include <kstd/system_error.hpp>
+
+#include <string_view>
+
+namespace kernel::filesystem::ext2
+{
+
+ namespace
+ {
+ struct ext2_category_t final : kstd::error_category
+ {
+ [[nodiscard]] constexpr auto name() const noexcept -> std::string_view override
+ {
+ return "ext2";
+ }
+
+ [[nodiscard]] constexpr auto message(int value) const noexcept -> std::string_view override
+ {
+ switch (static_cast<ext2_errc>(value))
+ {
+ case ext2_errc::invalid_magic_number:
+ return "invalid filesystem magic";
+ case ext2_errc::invalid_root_inode:
+ return "invalid root inode";
+ case ext2_errc::invalid_block_group_index:
+ return "block group index out of bounds";
+ case ext2_errc::invalid_block_index:
+ return "block index out of bounds";
+ case ext2_errc::invalid_block_number:
+ return "block number out of bounds";
+ case ext2_errc::failed_to_read_superblock:
+ return "failed to read superblock";
+ case ext2_errc::failed_to_read_block_group_descriptors:
+ return "failed to read block group descriptors";
+ case ext2_errc::not_enough_free_blocks:
+ return "not enough free blocks";
+ case ext2_errc::not_enough_inodes:
+ return "not enough inodes";
+ default:
+ return "unknown ext2 error";
+ };
+ }
+
+ [[nodiscard]] constexpr auto equivalent(int code, kstd::error_condition const & condition) const noexcept
+ -> bool override
+ {
+ switch (static_cast<ext2_errc>(code))
+ {
+ case ext2_errc::invalid_magic_number:
+ case ext2_errc::invalid_root_inode:
+ if (condition.category() == kernel::filesystem::vfs_category())
+ {
+ return condition.value() == static_cast<int>(kernel::filesystem::vfs_errc::invalid_filesystem);
+ }
+ else if (condition.category() == kstd::generic_category())
+ {
+ return condition.value() == static_cast<int>(kstd::errc::invalid_argument);
+ }
+ break;
+ case ext2_errc::invalid_block_group_index:
+ case ext2_errc::invalid_block_index:
+ case ext2_errc::invalid_block_number:
+ case ext2_errc::failed_to_read_superblock:
+ case ext2_errc::failed_to_read_block_group_descriptors:
+ if (condition.category() == kstd::generic_category())
+ {
+ return condition.value() == static_cast<int>(kstd::errc::io_error);
+ }
+ break;
+ case ext2_errc::not_enough_free_blocks:
+ case ext2_errc::not_enough_inodes:
+ if (condition.category() == kstd::generic_category())
+ {
+ return condition.value() == static_cast<int>(kstd::errc::no_space_on_device);
+ }
+ break;
+ }
+ return kstd::error_category::equivalent(code, condition);
+ }
+ } constexpr inline ext2_category_instance{};
+ } // namespace
+
+ [[nodiscard]] auto ext2_category() noexcept -> kstd::error_category const &
+ {
+ return ext2_category_instance;
+ }
+
+} // namespace kernel::filesystem::ext2
diff --git a/kernel/kernel/filesystem/ext2/error.hpp b/kernel/kernel/filesystem/ext2/error.hpp
index 7de3b24b..dcdf7295 100644
--- a/kernel/kernel/filesystem/ext2/error.hpp
+++ b/kernel/kernel/filesystem/ext2/error.hpp
@@ -5,7 +5,6 @@
#include <kstd/system_error.hpp>
-#include <string_view>
#include <type_traits>
namespace kernel::filesystem::ext2
@@ -24,85 +23,7 @@ namespace kernel::filesystem::ext2
not_enough_inodes
};
- namespace detail
- {
- struct ext2_category_t final : kstd::error_category
- {
- [[nodiscard]] constexpr auto name() const noexcept -> std::string_view override
- {
- return "ext2";
- }
-
- [[nodiscard]] constexpr auto message(int value) const noexcept -> std::string_view override
- {
- switch (static_cast<ext2_errc>(value))
- {
- case ext2_errc::invalid_magic_number:
- return "invalid filesystem magic";
- case ext2_errc::invalid_root_inode:
- return "invalid root inode";
- case ext2_errc::invalid_block_group_index:
- return "block group index out of bounds";
- case ext2_errc::invalid_block_index:
- return "block index out of bounds";
- case ext2_errc::invalid_block_number:
- return "block number out of bounds";
- case ext2_errc::failed_to_read_superblock:
- return "failed to read superblock";
- case ext2_errc::failed_to_read_block_group_descriptors:
- return "failed to read block group descriptors";
- case ext2_errc::not_enough_free_blocks:
- return "not enough free blocks";
- case ext2_errc::not_enough_inodes:
- return "not enough inodes";
- default:
- return "unknown ext2 error";
- };
- }
-
- [[nodiscard]] constexpr auto equivalent(int code, kstd::error_condition const & condition) const noexcept
- -> bool override
- {
- switch (static_cast<ext2_errc>(code))
- {
- case ext2_errc::invalid_magic_number:
- case ext2_errc::invalid_root_inode:
- if (condition.category() == kernel::filesystem::vfs_category())
- {
- return condition.value() == static_cast<int>(kernel::filesystem::vfs_errc::invalid_filesystem);
- }
- else if (condition.category() == kstd::generic_category())
- {
- return condition.value() == static_cast<int>(kstd::errc::invalid_argument);
- }
- break;
- case ext2_errc::invalid_block_group_index:
- case ext2_errc::invalid_block_index:
- case ext2_errc::invalid_block_number:
- case ext2_errc::failed_to_read_superblock:
- case ext2_errc::failed_to_read_block_group_descriptors:
- if (condition.category() == kstd::generic_category())
- {
- return condition.value() == static_cast<int>(kstd::errc::io_error);
- }
- break;
- case ext2_errc::not_enough_free_blocks:
- case ext2_errc::not_enough_inodes:
- if (condition.category() == kstd::generic_category())
- {
- return condition.value() == static_cast<int>(kstd::errc::no_space_on_device);
- }
- break;
- }
- return kstd::error_category::equivalent(code, condition);
- }
- } constexpr inline ext2_category_instance{};
- } // namespace detail
-
- [[nodiscard]] constexpr auto inline ext2_category() noexcept -> kstd::error_category const &
- {
- return detail::ext2_category_instance;
- }
+ [[nodiscard]] auto ext2_category() noexcept -> kstd::error_category const &;
[[nodiscard]] constexpr auto inline make_error_code(ext2_errc error) noexcept -> kstd::error_code
{
diff --git a/kernel/kernel/filesystem/open_file_descriptor.cpp b/kernel/kernel/filesystem/open_file_descriptor.cpp
index 6277d0b6..e233b5da 100644
--- a/kernel/kernel/filesystem/open_file_descriptor.cpp
+++ b/kernel/kernel/filesystem/open_file_descriptor.cpp
@@ -7,8 +7,6 @@
#include <kstd/result.hpp>
#include <kstd/units.hpp>
-#include <cstddef>
-
namespace kernel::filesystem
{
open_file_descriptor::open_file_descriptor(kstd::shared_ptr<dentry> const & dentry)