diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kapi/filesystem.tests.cpp | 16 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.cpp | 21 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.hpp | 1 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.tests.cpp | 3 |
4 files changed, 28 insertions, 13 deletions
diff --git a/kernel/kapi/filesystem.tests.cpp b/kernel/kapi/filesystem.tests.cpp index 2c2a8d1e..b339f19f 100644 --- a/kernel/kapi/filesystem.tests.cpp +++ b/kernel/kapi/filesystem.tests.cpp @@ -42,25 +42,25 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap THEN("files can be opened, written to, read from and closed again") { auto write_fd = kapi::filesystem::open("/information/info_1.txt"); - REQUIRE(write_fd >= 0); + REQUIRE(write_fd); auto write_buffer = std::vector<std::byte>{std::byte{'H'}, std::byte{'e'}}; - auto const bytes_written = kapi::filesystem::write(write_fd, write_buffer.data(), write_buffer.size()); + auto const bytes_written = kapi::filesystem::write(*write_fd, write_buffer.data(), write_buffer.size()); REQUIRE(bytes_written == 2); auto read_fd = kapi::filesystem::open("/information/info_1.txt"); - REQUIRE(read_fd >= 0); + REQUIRE(read_fd); auto read_buffer = std::vector<std::byte>(6); - auto const bytes_read = kapi::filesystem::read(read_fd, read_buffer.data(), read_buffer.size()); - REQUIRE(bytes_read >= 0); + auto const bytes_read = kapi::filesystem::read(*read_fd, read_buffer.data(), read_buffer.size()); + REQUIRE(bytes_read); - std::string_view buffer_as_str{reinterpret_cast<char *>(read_buffer.data()), static_cast<size_t>(bytes_read)}; + std::string_view buffer_as_str{reinterpret_cast<char *>(read_buffer.data()), static_cast<size_t>(*bytes_read)}; REQUIRE(buffer_as_str == "Hefo_1"); - REQUIRE(kapi::filesystem::close(write_fd) == 0); - REQUIRE(kapi::filesystem::close(read_fd) == 0); + REQUIRE(kapi::filesystem::close(*write_fd)); + REQUIRE(kapi::filesystem::close(*read_fd)); } THEN("files can be opened through absolute symbolic link, read and closed again") diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp index 2484d2f5..83db6ec6 100644 --- a/kernel/kernel/filesystem/ext2/inode.cpp +++ b/kernel/kernel/filesystem/ext2/inode.cpp @@ -105,8 +105,6 @@ namespace kernel::filesystem::ext2 } } - // TODO update inode size, ... - auto block_index = offset / m_filesystem->block_size(); auto in_block_offset = offset % m_filesystem->block_size(); @@ -136,7 +134,13 @@ namespace kernel::filesystem::ext2 bytes_written += write_result.value(); block_index++; - in_block_offset = 0; // After the first block, we always start at the beginning of the block + in_block_offset = 0; + } + + set_size(std::max(this->size(), offset + bytes_written)); + if (auto write_result = m_filesystem->write_inode(m_inode_number, m_data); !write_result) + { + return kstd::failure(write_result.error()); } return bytes_written; @@ -159,7 +163,7 @@ namespace kernel::filesystem::ext2 } m_filesystem->update_inode_block_count(m_data, count); - return m_filesystem->write_inode(m_inode_number, m_data).has_value(); + return true; } [[nodiscard]] auto inode::data() const -> inode_data const & @@ -194,4 +198,13 @@ namespace kernel::filesystem::ext2 return size; } + auto inode::set_size(uint64_t new_size) -> void + { + if (m_filesystem->revision_level() > constants::good_old_revision && is_regular()) + { + m_data.dir_acl = static_cast<uint32_t>(new_size >> 32); + } + m_data.size = static_cast<uint32_t>(new_size); + } + } // namespace kernel::filesystem::ext2 diff --git a/kernel/kernel/filesystem/ext2/inode.hpp b/kernel/kernel/filesystem/ext2/inode.hpp index 175264b3..6001c813 100644 --- a/kernel/kernel/filesystem/ext2/inode.hpp +++ b/kernel/kernel/filesystem/ext2/inode.hpp @@ -99,6 +99,7 @@ namespace kernel::filesystem::ext2 private: auto append_blocks(size_t count) -> bool; + auto set_size(uint64_t new_size) -> void; filesystem * m_filesystem; uint32_t m_inode_number{}; diff --git a/kernel/kernel/filesystem/ext2/inode.tests.cpp b/kernel/kernel/filesystem/ext2/inode.tests.cpp index 1998af28..65370bf5 100644 --- a/kernel/kernel/filesystem/ext2/inode.tests.cpp +++ b/kernel/kernel/filesystem/ext2/inode.tests.cpp @@ -320,7 +320,8 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, "Ext2 in THEN("writing to a an inode of type directory panics") { auto write_buffer = kstd::vector<std::byte>(12, std::byte{0xAA}); - REQUIRE_THROWS_AS(information->write(write_buffer.data(), 0, write_buffer.size()), kernel::tests::cpu::halt); + REQUIRE_THROWS_AS(information.value()->write(write_buffer.data(), 0, write_buffer.size()), + kernel::tests::cpu::halt); } } } |
