aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kapi/filesystem.tests.cpp16
-rw-r--r--kernel/kernel/filesystem/ext2/inode.cpp21
-rw-r--r--kernel/kernel/filesystem/ext2/inode.hpp1
-rw-r--r--kernel/kernel/filesystem/ext2/inode.tests.cpp3
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);
}
}
}