diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/error.cpp | 103 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/error.hpp | 94 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/error.cpp | 92 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/error.hpp | 81 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/open_file_descriptor.cpp | 2 |
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) |
