aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystem/device_inode.cpp21
-rw-r--r--kernel/kernel/filesystem/device_inode.tests.cpp15
-rw-r--r--kernel/kernel/filesystem/error.hpp5
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};
}