mirror of
https://github.com/RGBCube/serenity
synced 2025-05-30 14:28:11 +00:00
Kernel/Ext2: Extract common calculations to functions
This also makes it easier to understand and reference where these (sometimes rather arbitrary) calculations come from. This also fixes a bug where group_index_from_block_index assumed 1KiB blocks.
This commit is contained in:
parent
6a17a30e2e
commit
cc1cb72fb5
2 changed files with 16 additions and 4 deletions
|
@ -95,7 +95,7 @@ ErrorOr<void> Ext2FS::initialize_while_locked()
|
||||||
}
|
}
|
||||||
|
|
||||||
auto blocks_to_read = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size());
|
auto blocks_to_read = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size());
|
||||||
BlockIndex first_block_of_bgdt = block_size() == 1024 ? 2 : 1;
|
BlockIndex first_block_of_bgdt = first_block_of_block_group_descriptors();
|
||||||
m_cached_group_descriptor_table = TRY(KBuffer::try_create_with_size("Ext2FS: Block group descriptors"sv, block_size() * blocks_to_read, Memory::Region::Access::ReadWrite));
|
m_cached_group_descriptor_table = TRY(KBuffer::try_create_with_size("Ext2FS: Block group descriptors"sv, block_size() * blocks_to_read, Memory::Region::Access::ReadWrite));
|
||||||
auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_group_descriptor_table->data());
|
auto buffer = UserOrKernelBuffer::for_kernel_buffer(m_cached_group_descriptor_table->data());
|
||||||
TRY(read_blocks(first_block_of_bgdt, blocks_to_read, buffer));
|
TRY(read_blocks(first_block_of_bgdt, blocks_to_read, buffer));
|
||||||
|
@ -271,7 +271,7 @@ auto Ext2FS::allocate_blocks(GroupIndex preferred_group_index, size_t count) ->
|
||||||
int blocks_in_group = min(blocks_per_group(), super_block().s_blocks_count);
|
int blocks_in_group = min(blocks_per_group(), super_block().s_blocks_count);
|
||||||
auto block_bitmap = cached_bitmap->bitmap(blocks_in_group);
|
auto block_bitmap = cached_bitmap->bitmap(blocks_in_group);
|
||||||
|
|
||||||
BlockIndex first_block_in_group = (group_index.value() - 1) * blocks_per_group() + first_block_index().value();
|
BlockIndex first_block_in_group = first_block_of_group(group_index);
|
||||||
size_t free_region_size = 0;
|
size_t free_region_size = 0;
|
||||||
auto first_unset_bit_index = block_bitmap.find_longest_range_of_unset_bits(count - blocks.size(), free_region_size);
|
auto first_unset_bit_index = block_bitmap.find_longest_range_of_unset_bits(count - blocks.size(), free_region_size);
|
||||||
VERIFY(first_unset_bit_index.has_value());
|
VERIFY(first_unset_bit_index.has_value());
|
||||||
|
@ -352,7 +352,17 @@ Ext2FS::GroupIndex Ext2FS::group_index_from_block_index(BlockIndex block_index)
|
||||||
{
|
{
|
||||||
if (!block_index)
|
if (!block_index)
|
||||||
return 0;
|
return 0;
|
||||||
return (block_index.value() - 1) / blocks_per_group() + 1;
|
return (block_index.value() - first_block_index().value()) / blocks_per_group() + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ext2FS::BlockIndex Ext2FS::first_block_of_group(GroupIndex group_index) const
|
||||||
|
{
|
||||||
|
return (group_index.value() - 1) * blocks_per_group() + first_block_index().value();
|
||||||
|
}
|
||||||
|
|
||||||
|
Ext2FS::BlockIndex Ext2FS::first_block_of_block_group_descriptors() const
|
||||||
|
{
|
||||||
|
return block_size() == 1024 ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Ext2FS::group_index_from_inode(InodeIndex inode) const -> GroupIndex
|
auto Ext2FS::group_index_from_inode(InodeIndex inode) const -> GroupIndex
|
||||||
|
@ -612,7 +622,7 @@ void Ext2FS::flush_block_group_descriptor_table()
|
||||||
{
|
{
|
||||||
MutexLocker locker(m_lock);
|
MutexLocker locker(m_lock);
|
||||||
auto blocks_to_write = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size());
|
auto blocks_to_write = ceil_div(m_block_group_count * sizeof(ext2_group_desc), block_size());
|
||||||
auto first_block_of_bgdt = block_size() == 1024 ? 2 : 1;
|
auto first_block_of_bgdt = first_block_of_block_group_descriptors();
|
||||||
auto buffer = UserOrKernelBuffer::for_kernel_buffer((u8*)block_group_descriptors());
|
auto buffer = UserOrKernelBuffer::for_kernel_buffer((u8*)block_group_descriptors());
|
||||||
if (auto result = write_blocks(first_block_of_bgdt, blocks_to_write, buffer); result.is_error())
|
if (auto result = write_blocks(first_block_of_bgdt, blocks_to_write, buffer); result.is_error())
|
||||||
dbgln("Ext2FS[{}]::flush_block_group_descriptor_table(): Failed to write blocks: {}", fsid(), result.error());
|
dbgln("Ext2FS[{}]::flush_block_group_descriptor_table(): Failed to write blocks: {}", fsid(), result.error());
|
||||||
|
|
|
@ -77,10 +77,12 @@ private:
|
||||||
virtual void flush_writes() override;
|
virtual void flush_writes() override;
|
||||||
|
|
||||||
BlockIndex first_block_index() const;
|
BlockIndex first_block_index() const;
|
||||||
|
BlockIndex first_block_of_block_group_descriptors() const;
|
||||||
ErrorOr<InodeIndex> allocate_inode(GroupIndex preferred_group = 0);
|
ErrorOr<InodeIndex> allocate_inode(GroupIndex preferred_group = 0);
|
||||||
ErrorOr<Vector<BlockIndex>> allocate_blocks(GroupIndex preferred_group_index, size_t count);
|
ErrorOr<Vector<BlockIndex>> allocate_blocks(GroupIndex preferred_group_index, size_t count);
|
||||||
GroupIndex group_index_from_inode(InodeIndex) const;
|
GroupIndex group_index_from_inode(InodeIndex) const;
|
||||||
GroupIndex group_index_from_block_index(BlockIndex) const;
|
GroupIndex group_index_from_block_index(BlockIndex) const;
|
||||||
|
BlockIndex first_block_of_group(GroupIndex) const;
|
||||||
|
|
||||||
ErrorOr<bool> get_inode_allocation_state(InodeIndex) const;
|
ErrorOr<bool> get_inode_allocation_state(InodeIndex) const;
|
||||||
ErrorOr<void> set_inode_allocation_state(InodeIndex, bool);
|
ErrorOr<void> set_inode_allocation_state(InodeIndex, bool);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue