From 08e84e373004e46ed00173b63ba16be123faf4b8 Mon Sep 17 00:00:00 2001 From: Lukas Oesch Date: Sat, 30 May 2026 22:34:09 +0200 Subject: add another ext2 inode tests, it panics if not enough free blocks available --- kernel/kernel/filesystem/ext2/inode.tests.cpp | 86 ++++++++++++++------------- 1 file changed, 46 insertions(+), 40 deletions(-) (limited to 'kernel') 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(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(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(device); + auto dev_inode = kstd::make_shared(device); - auto block_bitmap = std::vector(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(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{'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{'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); + } } } -- cgit v1.2.3