From c62c00e7db38321e4b1e9fa3f3650e94e3b83fad Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 12 Feb 2021 13:33:58 +0100 Subject: [PATCH] Ext2FS: Make Ext2FS::GroupIndex a distinct integer type --- Kernel/FileSystem/Ext2FileSystem.cpp | 31 ++++++++++++++-------------- Kernel/FileSystem/Ext2FileSystem.h | 3 ++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index e121ef68fe3..e22fd471c00 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -97,7 +97,8 @@ const ext2_group_desc& Ext2FS::group_descriptor(GroupIndex group_index) const { // FIXME: Should this fail gracefully somehow? ASSERT(group_index <= m_block_group_count); - return block_group_descriptors()[group_index - 1]; + ASSERT(group_index > 0); + return block_group_descriptors()[group_index.value() - 1]; } bool Ext2FS::initialize() @@ -1143,7 +1144,7 @@ auto Ext2FS::allocate_blocks(GroupIndex preferred_group_index, size_t count) -> dbgln_if(EXT2_DEBUG, "Ext2FS: allocate_blocks:"); blocks.ensure_capacity(count); - GroupIndex group_index = preferred_group_index; + auto group_index = preferred_group_index; if (!group_descriptor(preferred_group_index).bg_free_blocks_count) { group_index = 1; @@ -1157,7 +1158,7 @@ auto Ext2FS::allocate_blocks(GroupIndex preferred_group_index, size_t count) -> } else { if (group_index == preferred_group_index) group_index = 1; - for (; group_index <= m_block_group_count; ++group_index) { + for (; group_index <= m_block_group_count; group_index = GroupIndex { group_index.value() + 1 }) { if (group_descriptor(group_index).bg_free_blocks_count) { found_a_group = true; break; @@ -1172,7 +1173,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); auto block_bitmap = Bitmap::wrap(cached_bitmap.buffer.data(), blocks_in_group); - BlockIndex first_block_in_group = (group_index - 1) * blocks_per_group() + first_block_index().value(); + BlockIndex first_block_in_group = (group_index.value() - 1) * blocks_per_group() + first_block_index().value(); 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); ASSERT(first_unset_bit_index.has_value()); @@ -1194,16 +1195,16 @@ InodeIndex Ext2FS::find_a_free_inode(GroupIndex preferred_group) LOCKER(m_lock); dbgln_if(EXT2_DEBUG, "Ext2FS: find_a_free_inode(preferred_group: {})", preferred_group); - unsigned group_index = 0; + GroupIndex group_index; // FIXME: We shouldn't refuse to allocate an inode if there is no group that can house the whole thing. // In those cases we should just spread it across multiple groups. - auto is_suitable_group = [this](GroupIndex group_index) { + auto is_suitable_group = [this](auto group_index) { auto& bgd = group_descriptor(group_index); return bgd.bg_free_inodes_count && bgd.bg_free_blocks_count >= 1; }; - if (preferred_group && is_suitable_group(preferred_group)) { + if (preferred_group.value() && is_suitable_group(preferred_group)) { group_index = preferred_group; } else { for (unsigned i = 1; i <= m_block_group_count; ++i) { @@ -1223,7 +1224,7 @@ InodeIndex Ext2FS::find_a_free_inode(GroupIndex preferred_group) unsigned inodes_in_group = min(inodes_per_group(), super_block().s_inodes_count); InodeIndex first_free_inode_in_group = 0; - InodeIndex first_inode_in_group = (group_index - 1) * inodes_per_group() + 1; + InodeIndex first_inode_in_group = (group_index.value() - 1) * inodes_per_group() + 1; auto& cached_bitmap = get_bitmap_block(bgd.bg_inode_bitmap); auto inode_bitmap = Bitmap::wrap(cached_bitmap.buffer.data(), inodes_in_group); @@ -1253,7 +1254,7 @@ Ext2FS::GroupIndex Ext2FS::group_index_from_block_index(BlockIndex block_index) return (block_index.value() - 1) / blocks_per_group() + 1; } -unsigned Ext2FS::group_index_from_inode(InodeIndex inode) const +auto Ext2FS::group_index_from_inode(InodeIndex inode) const -> GroupIndex { if (!inode) return 0; @@ -1265,9 +1266,9 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const LOCKER(m_lock); if (index == 0) return true; - unsigned group_index = group_index_from_inode(index); + auto group_index = group_index_from_inode(index); auto& bgd = group_descriptor(group_index); - unsigned index_in_group = index.value() - ((group_index - 1) * inodes_per_group()); + unsigned index_in_group = index.value() - ((group_index.value() - 1) * inodes_per_group()); unsigned bit_index = (index_in_group - 1) % inodes_per_group(); auto& cached_bitmap = const_cast(*this).get_bitmap_block(bgd.bg_inode_bitmap); @@ -1277,9 +1278,9 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const bool Ext2FS::set_inode_allocation_state(InodeIndex inode_index, bool new_state) { LOCKER(m_lock); - unsigned group_index = group_index_from_inode(inode_index); + auto group_index = group_index_from_inode(inode_index); auto& bgd = group_descriptor(group_index); - unsigned index_in_group = inode_index.value() - ((group_index - 1) * inodes_per_group()); + unsigned index_in_group = inode_index.value() - ((group_index.value() - 1) * inodes_per_group()); unsigned bit_index = (index_in_group - 1) % inodes_per_group(); auto& cached_bitmap = get_bitmap_block(bgd.bg_inode_bitmap); @@ -1338,9 +1339,9 @@ bool Ext2FS::set_block_allocation_state(BlockIndex block_index, bool new_state) ASSERT(block_index != 0); LOCKER(m_lock); - GroupIndex group_index = group_index_from_block_index(block_index); + auto group_index = group_index_from_block_index(block_index); auto& bgd = group_descriptor(group_index); - unsigned index_in_group = (block_index.value() - first_block_index().value()) - ((group_index - 1) * blocks_per_group()); + unsigned index_in_group = (block_index.value() - first_block_index().value()) - ((group_index.value() - 1) * blocks_per_group()); unsigned bit_index = index_in_group % blocks_per_group(); auto& cached_bitmap = get_bitmap_block(bgd.bg_block_bitmap); diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index a6261a887ff..39f8a13954a 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -113,7 +113,8 @@ public: virtual u8 internal_file_type_to_directory_entry_type(const DirectoryEntryView& entry) const override; private: - typedef unsigned GroupIndex; + TYPEDEF_DISTINCT_ORDERED_ID(unsigned, GroupIndex); + explicit Ext2FS(FileDescription&); const ext2_super_block& super_block() const { return m_super_block; }