aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-05-30 22:34:09 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-14 20:18:24 +0200
commit08e84e373004e46ed00173b63ba16be123faf4b8 (patch)
tree64871fa2e311a6f5f083c3475e595df00fe42672
parentc26d681e88905726d6521b4fbfaeb63603db8faf (diff)
downloadkernel-08e84e373004e46ed00173b63ba16be123faf4b8.tar.xz
kernel-08e84e373004e46ed00173b63ba16be123faf4b8.zip
add another ext2 inode tests, it panics if not enough free blocks available
-rw-r--r--kernel/kernel/filesystem/ext2/inode.tests.cpp86
1 files changed, 46 insertions, 40 deletions
diff --git a/kernel/kernel/filesystem/ext2/inode.tests.cpp b/kernel/kernel/filesystem/ext2/inode.tests.cpp
index 35f54fea..7b00dae1 100644
--- a/kernel/kernel/filesystem/ext2/inode.tests.cpp
+++ b/kernel/kernel/filesystem/ext2/inode.tests.cpp
@@ -332,58 +332,58 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, "Ext2 in
SCENARIO("Ext2 inode write across block boundaries", "[filesystem][ext2][inode]")
{
auto const block_size = 1024uz;
- GIVEN("an ext2 inode with two direct blocks")
- {
- auto device = kstd::make_shared<kernel::tests::devices::block_device>(0, 0, "mock", block_size, 64 * block_size);
- REQUIRE(device != nullptr);
- auto superblock = kernel::filesystem::ext2::superblock{};
- superblock.magic = kernel::filesystem::ext2::constants::magic_number;
- superblock.log_block_size = 0;
- superblock.blocks_count = 64;
- superblock.blocks_per_group = 64;
- superblock.inodes_per_group = 32;
- superblock.inode_size = 128;
- superblock.rev_level = 1;
- superblock.free_blocks_count = 64 - 15;
+ auto device = kstd::make_shared<kernel::tests::devices::block_device>(0, 0, "mock", block_size, 128 * block_size);
+ REQUIRE(device != nullptr);
+
+ auto superblock = kernel::filesystem::ext2::superblock{};
+ superblock.magic = kernel::filesystem::ext2::constants::magic_number;
+ superblock.log_block_size = 0;
+ superblock.blocks_count = 64;
+ superblock.blocks_per_group = 64;
+ superblock.inodes_per_group = 32;
+ superblock.inode_size = 128;
+ superblock.rev_level = 1;
+ superblock.free_blocks_count = 64 - 15;
- auto block_group_descriptor = kernel::filesystem::ext2::block_group_descriptor{};
- block_group_descriptor.inode_table = 5;
- block_group_descriptor.free_blocks_count = 64 - 15;
- block_group_descriptor.block_bitmap = 10;
+ auto block_group_descriptor = kernel::filesystem::ext2::block_group_descriptor{};
+ block_group_descriptor.inode_table = 5;
+ block_group_descriptor.free_blocks_count = 64 - 15;
+ block_group_descriptor.block_bitmap = 10;
- kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device, superblock, block_group_descriptor);
+ kernel::tests::filesystem::ext2::setup_mock_ext2_layout(*device, superblock, block_group_descriptor);
- auto dev_inode = kstd::make_shared<kernel::filesystem::device_inode>(device);
+ auto dev_inode = kstd::make_shared<kernel::filesystem::device_inode>(device);
- auto block_bitmap = std::vector<std::byte>(block_size, std::byte{0x00});
- block_bitmap[0] = std::byte{0b1111'1111};
- block_bitmap[1] = std::byte{0b1111'1111};
- block_bitmap[2] = std::byte{0b0011'0000};
+ auto block_bitmap = std::vector<std::byte>(block_size, std::byte{0x00});
+ block_bitmap[0] = std::byte{0b1111'1111};
+ block_bitmap[1] = std::byte{0b1111'1111};
+ block_bitmap[2] = std::byte{0b0011'0000};
- REQUIRE(dev_inode->write(block_bitmap.data(), block_group_descriptor.block_bitmap * block_size, block_size));
+ REQUIRE(dev_inode->write(block_bitmap.data(), block_group_descriptor.block_bitmap * block_size, block_size));
- auto fs = kernel::filesystem::ext2::filesystem{};
- REQUIRE(fs.mount(dev_inode));
+ auto fs = kernel::filesystem::ext2::filesystem{};
+ REQUIRE(fs.mount(dev_inode));
- auto inode_data = kernel::filesystem::ext2::inode_data{};
- inode_data.size = 5;
- inode_data.blocks = 2 * block_size / 512;
- inode_data.block[0] = 20;
- inode_data.block[1] = 21;
- inode_data.mode = kernel::filesystem::ext2::constants::mode_regular;
+ auto inode_data = kernel::filesystem::ext2::inode_data{};
+ inode_data.size = 5;
+ inode_data.blocks = 2 * block_size / 512;
+ inode_data.block[0] = 20;
+ inode_data.block[1] = 21;
+ inode_data.mode = kernel::filesystem::ext2::constants::mode_regular;
- uint32_t inode_number = 3;
- auto const inode_data_offset =
- block_group_descriptor.inode_table * block_size + (inode_number - 1) * fs.inode_size();
+ uint32_t inode_number = 3;
+ auto const inode_data_offset = block_group_descriptor.inode_table * block_size + (inode_number - 1) * fs.inode_size();
- auto inode = kernel::filesystem::ext2::inode{&fs, inode_number, inode_data};
- REQUIRE(dev_inode->write(&inode, inode_data_offset, sizeof(kernel::filesystem::ext2::inode_data)));
+ auto inode = kernel::filesystem::ext2::inode{&fs, inode_number, inode_data};
+ REQUIRE(dev_inode->write(&inode, inode_data_offset, sizeof(kernel::filesystem::ext2::inode_data)));
- auto buffer = kstd::vector<std::byte>{std::byte{'H'}, std::byte{'e'}, std::byte{'l'}, std::byte{'l'},
- std::byte{'o'}, std::byte{' '}, std::byte{'W'}, std::byte{'o'},
- std::byte{'r'}, std::byte{'l'}, std::byte{'d'}, std::byte{'!'}};
+ auto const buffer = kstd::vector<std::byte>{std::byte{'H'}, std::byte{'e'}, std::byte{'l'}, std::byte{'l'},
+ std::byte{'o'}, std::byte{' '}, std::byte{'W'}, std::byte{'o'},
+ std::byte{'r'}, std::byte{'l'}, std::byte{'d'}, std::byte{'!'}};
+ GIVEN("mocked ext2 filesystem")
+ {
auto do_read_inode = [&]() {
auto inode_data = kernel::filesystem::ext2::inode_data{};
REQUIRE(dev_inode->read(&inode_data, inode_data_offset, sizeof(kernel::filesystem::ext2::inode_data)));
@@ -463,6 +463,12 @@ SCENARIO("Ext2 inode write across block boundaries", "[filesystem][ext2][inode]"
auto const read_blocks = read_inode.data().block;
REQUIRE(expected_blocks == read_blocks);
}
+
+ THEN("writing over the current size and over the number of free blocks")
+ {
+ auto const offset = 65 * block_size;
+ REQUIRE_THROWS_AS(inode.write(buffer.data(), offset, buffer.size()), kernel::tests::cpu::halt);
+ }
}
}