diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/device_inode.cpp | 21 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/device_inode.tests.cpp | 15 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/error.hpp | 5 |
3 files changed, 24 insertions, 17 deletions
diff --git a/kernel/kernel/filesystem/device_inode.cpp b/kernel/kernel/filesystem/device_inode.cpp index 4bff415a..d2444ef0 100644 --- a/kernel/kernel/filesystem/device_inode.cpp +++ b/kernel/kernel/filesystem/device_inode.cpp @@ -1,6 +1,7 @@ #include <kernel/filesystem/device_inode.hpp> #include <kernel/devices/block_device_utils.hpp> +#include <kernel/filesystem/error.hpp> #include <kapi/devices.hpp> #include <kapi/devices/device.hpp> @@ -24,27 +25,23 @@ namespace kernel::filesystem auto device_inode::read(void * buffer, kstd::units::bytes offset, kstd::units::bytes size) const -> kstd::result<kstd::units::bytes> { - if (m_device->is_a<kapi::devices::block_device>()) + if (auto block_device = m_device->as<kapi::devices::block_device>()) { - return devices::block_device_utils::read(*m_device->as<kapi::devices::block_device>(), buffer, offset, size); - } - else - { - kapi::system::panic("[FILESYSTEM] device_file::read called on non-block device."); + return devices::block_device_utils::read(*block_device, buffer, offset, size); } + + return kstd::failure(vfs_errc::no_such_device); } auto device_inode::write(void const * buffer, kstd::units::bytes offset, kstd::units::bytes size) -> kstd::result<kstd::units::bytes> { - if (m_device->is_a<kapi::devices::block_device>()) + if (auto block_device = m_device->as<kapi::devices::block_device>()) { - return devices::block_device_utils::write(*m_device->as<kapi::devices::block_device>(), buffer, offset, size); - } - else - { - kapi::system::panic("[FILESYSTEM] device_file::write called on non-block device."); + return devices::block_device_utils::write(*block_device, buffer, offset, size); } + + return kstd::failure(vfs_errc::no_such_device); } auto device_inode::device() const -> kstd::shared_ptr<kapi::devices::device> const & diff --git a/kernel/kernel/filesystem/device_inode.tests.cpp b/kernel/kernel/filesystem/device_inode.tests.cpp index 2a0b22db..b0d0659f 100644 --- a/kernel/kernel/filesystem/device_inode.tests.cpp +++ b/kernel/kernel/filesystem/device_inode.tests.cpp @@ -6,6 +6,7 @@ #include <kstd/memory.hpp> #include <kstd/print.hpp> +#include <kstd/system_error.hpp> #include <kstd/units.hpp> #include <kstd/vector.hpp> @@ -94,20 +95,24 @@ SCENARIO("Device inode read/write with a non-block device", "[filesystem][device WHEN("reading from the device inode") { kstd::vector<uint8_t> read_buffer(512); - THEN("the system panics") + + THEN("the result is an error") { - REQUIRE_THROWS_AS(inode.read(read_buffer.data(), 0_B, kstd::units::bytes{read_buffer.size()}), - kernel::tests::cpu::halt); + auto result = inode.read(read_buffer.data(), 0_B, kstd::units::bytes{read_buffer.size()}); + REQUIRE(!result); + REQUIRE(result.error() == kstd::errc::no_such_device); } } WHEN("writing to the device inode") { kstd::vector<uint8_t> write_buffer(512); + THEN("the system panics") { - REQUIRE_THROWS_AS(inode.write(write_buffer.data(), 0_B, kstd::units::bytes{write_buffer.size()}), - kernel::tests::cpu::halt); + auto result = inode.write(write_buffer.data(), 0_B, kstd::units::bytes{write_buffer.size()}); + REQUIRE(!result); + REQUIRE(result.error() == kstd::errc::no_such_device); } } } diff --git a/kernel/kernel/filesystem/error.hpp b/kernel/kernel/filesystem/error.hpp index 584bf261..286d7a24 100644 --- a/kernel/kernel/filesystem/error.hpp +++ b/kernel/kernel/filesystem/error.hpp @@ -26,6 +26,7 @@ namespace kernel::filesystem is_a_directory, read_only_file_system, file_exists, + no_such_device, }; namespace detail @@ -71,6 +72,8 @@ namespace kernel::filesystem 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"; } @@ -105,6 +108,8 @@ namespace kernel::filesystem 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}; } |
