Ext2FS: Fix build with EXT2_DEBUG enabled, and tweak some variable names.

This commit is contained in:
Andreas Kling 2019-05-25 17:23:17 +02:00
parent 9cfd674a75
commit 728327df8a
Notes: sideshowbarker 2024-07-19 13:57:30 +09:00

View File

@ -51,9 +51,9 @@ bool Ext2FS::write_super_block(const ext2_super_block& sb)
return true; return true;
} }
unsigned Ext2FS::first_block_of_group(unsigned groupIndex) const unsigned Ext2FS::first_block_of_group(GroupIndex group_index) const
{ {
return super_block().s_first_data_block + (groupIndex * super_block().s_blocks_per_group); return super_block().s_first_data_block + (group_index * super_block().s_blocks_per_group);
} }
const ext2_super_block& Ext2FS::super_block() const const ext2_super_block& Ext2FS::super_block() const
@ -63,10 +63,10 @@ const ext2_super_block& Ext2FS::super_block() const
return *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer()); return *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
} }
const ext2_group_desc& Ext2FS::group_descriptor(unsigned groupIndex) const const ext2_group_desc& Ext2FS::group_descriptor(GroupIndex group_index) const
{ {
// FIXME: Should this fail gracefully somehow? // FIXME: Should this fail gracefully somehow?
ASSERT(groupIndex <= m_block_group_count); ASSERT(group_index <= m_block_group_count);
if (!m_cached_group_descriptor_table) { if (!m_cached_group_descriptor_table) {
LOCKER(m_lock); LOCKER(m_lock);
@ -78,7 +78,7 @@ const ext2_group_desc& Ext2FS::group_descriptor(unsigned groupIndex) const
#endif #endif
m_cached_group_descriptor_table = read_blocks(first_block_of_bgdt, blocks_to_read); m_cached_group_descriptor_table = read_blocks(first_block_of_bgdt, blocks_to_read);
} }
return reinterpret_cast<ext2_group_desc*>(m_cached_group_descriptor_table.pointer())[groupIndex - 1]; return reinterpret_cast<ext2_group_desc*>(m_cached_group_descriptor_table.pointer())[group_index - 1];
} }
bool Ext2FS::initialize() bool Ext2FS::initialize()
@ -262,29 +262,29 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
ASSERT_NOT_REACHED(); ASSERT_NOT_REACHED();
} }
Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool include_block_list_blocks) const Vector<Ext2FS::BlockIndex> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool include_block_list_blocks) const
{ {
LOCKER(m_lock); LOCKER(m_lock);
unsigned entries_per_block = EXT2_ADDR_PER_BLOCK(&super_block()); unsigned entries_per_block = EXT2_ADDR_PER_BLOCK(&super_block());
// NOTE: i_blocks is number of 512-byte blocks, not number of fs-blocks. // NOTE: i_blocks is number of 512-byte blocks, not number of fs-blocks.
unsigned block_count = e2inode.i_blocks / (block_size() / 512); unsigned block_count = e2inode.i_blocks / (block_size() / 512);
unsigned blocksRemaining = block_count; unsigned blocks_remaining = block_count;
Vector<unsigned> list; Vector<BlockIndex> list;
if (include_block_list_blocks) { if (include_block_list_blocks) {
// This seems like an excessive over-estimate but w/e. // This seems like an excessive over-estimate but w/e.
list.ensure_capacity(blocksRemaining * 2); list.ensure_capacity(blocks_remaining * 2);
} else { } else {
list.ensure_capacity(blocksRemaining); list.ensure_capacity(blocks_remaining);
} }
unsigned direct_count = min(block_count, (unsigned)EXT2_NDIR_BLOCKS); unsigned direct_count = min(block_count, (unsigned)EXT2_NDIR_BLOCKS);
for (unsigned i = 0; i < direct_count; ++i) { for (unsigned i = 0; i < direct_count; ++i) {
list.unchecked_append(e2inode.i_block[i]); list.unchecked_append(e2inode.i_block[i]);
--blocksRemaining; --blocks_remaining;
} }
if (!blocksRemaining) if (!blocks_remaining)
return list; return list;
auto process_block_array = [&] (unsigned array_block_index, auto&& callback) { auto process_block_array = [&] (unsigned array_block_index, auto&& callback) {
@ -293,14 +293,14 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
auto array_block = read_block(array_block_index); auto array_block = read_block(array_block_index);
ASSERT(array_block); ASSERT(array_block);
auto* array = reinterpret_cast<const __u32*>(array_block.pointer()); auto* array = reinterpret_cast<const __u32*>(array_block.pointer());
unsigned count = min(blocksRemaining, entries_per_block); unsigned count = min(blocks_remaining, entries_per_block);
for (unsigned i = 0; i < count; ++i) { for (unsigned i = 0; i < count; ++i) {
if (!array[i]) { if (!array[i]) {
blocksRemaining = 0; blocks_remaining = 0;
return; return;
} }
callback(array[i]); callback(array[i]);
--blocksRemaining; --blocks_remaining;
} }
}; };
@ -308,7 +308,7 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
list.unchecked_append(entry); list.unchecked_append(entry);
}); });
if (!blocksRemaining) if (!blocks_remaining)
return list; return list;
process_block_array(e2inode.i_block[EXT2_DIND_BLOCK], [&] (unsigned entry) { process_block_array(e2inode.i_block[EXT2_DIND_BLOCK], [&] (unsigned entry) {
@ -317,7 +317,7 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
}); });
}); });
if (!blocksRemaining) if (!blocks_remaining)
return list; return list;
process_block_array(e2inode.i_block[EXT2_TIND_BLOCK], [&] (unsigned entry) { process_block_array(e2inode.i_block[EXT2_TIND_BLOCK], [&] (unsigned entry) {
@ -535,6 +535,12 @@ bool Ext2FSInode::resize(qword new_size)
fs().set_block_allocation_state(new_block_index, true); fs().set_block_allocation_state(new_block_index, true);
block_list.append(move(new_blocks)); block_list.append(move(new_blocks));
} else if (blocks_needed_after < blocks_needed_before) { } else if (blocks_needed_after < blocks_needed_before) {
#ifdef EXT2_DEBUG
dbgprintf("Ext2FSInode::resize(): Shrinking. Old block list is %d entries:\n", block_list.size());
for (auto block_index : block_list) {
dbgprintf(" # %u\n", block_index);
}
#endif
while (block_list.size() != blocks_needed_after) { while (block_list.size() != blocks_needed_after) {
auto block_index = block_list.take_last(); auto block_index = block_list.take_last();
fs().set_block_allocation_state(block_index, false); fs().set_block_allocation_state(block_index, false);
@ -622,7 +628,7 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, ssize_t count, const byte* data,
memset(block.pointer() + padding_start, 0, padding_bytes); memset(block.pointer() + padding_start, 0, padding_bytes);
} }
#ifdef EXT2_DEBUG #ifdef EXT2_DEBUG
dbgprintf("Ext2FSInode::write_bytes: writing block %u (offset_into_block: %u)\n", block_list[bi], offset_into_block); dbgprintf("Ext2FSInode::write_bytes: writing block %u (offset_into_block: %u)\n", m_block_list[bi], offset_into_block);
#endif #endif
bool success = fs().write_block(m_block_list[bi], block); bool success = fs().write_block(m_block_list[bi], block);
if (!success) { if (!success) {
@ -636,7 +642,7 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, ssize_t count, const byte* data,
} }
#ifdef EXT2_DEBUG #ifdef EXT2_DEBUG
dbgprintf("Ext2FSInode::write_bytes: after write, i_size=%u, i_blocks=%u (%u blocks in list)\n", m_raw_inode.i_size, m_raw_inode.i_blocks, block_list.size()); dbgprintf("Ext2FSInode::write_bytes: after write, i_size=%u, i_blocks=%u (%u blocks in list)\n", m_raw_inode.i_size, m_raw_inode.i_blocks, m_block_list.size());
#endif #endif
if (old_size != new_size) if (old_size != new_size)
@ -746,10 +752,10 @@ KResult Ext2FSInode::remove_child(const String& name)
return KSuccess; return KSuccess;
} }
bool Ext2FS::write_directory_inode(unsigned directoryInode, Vector<DirectoryEntry>&& entries) bool Ext2FS::write_directory_inode(InodeIndex directory_inode_index, Vector<DirectoryEntry>&& entries)
{ {
LOCKER(m_lock); LOCKER(m_lock);
dbgprintf("Ext2FS: New directory inode %u contents to write:\n", directoryInode); dbgprintf("Ext2FS: New directory inode %u contents to write:\n", directory_inode_index);
int directory_size = 0; int directory_size = 0;
for (auto& entry : entries) { for (auto& entry : entries) {
@ -791,7 +797,7 @@ bool Ext2FS::write_directory_inode(unsigned directoryInode, Vector<DirectoryEntr
stream.fill_to_end(0); stream.fill_to_end(0);
auto directory_inode = get_inode({ fsid(), directoryInode }); auto directory_inode = get_inode({ fsid(), directory_inode_index });
ssize_t nwritten = directory_inode->write_bytes(0, directory_data.size(), directory_data.pointer(), nullptr); ssize_t nwritten = directory_inode->write_bytes(0, directory_data.size(), directory_data.pointer(), nullptr);
return nwritten == directory_data.size(); return nwritten == directory_data.size();
} }
@ -869,7 +875,7 @@ Vector<Ext2FS::BlockIndex> Ext2FS::allocate_blocks(GroupIndex group_index, int c
unsigned Ext2FS::allocate_inode(GroupIndex preferred_group, off_t expected_size) unsigned Ext2FS::allocate_inode(GroupIndex preferred_group, off_t expected_size)
{ {
LOCKER(m_lock); LOCKER(m_lock);
dbgprintf("Ext2FS: allocate_inode(preferredGroup: %u, expectedSize: %u)\n", preferred_group, expected_size); dbgprintf("Ext2FS: allocate_inode(preferredGroup: %u, expected_size: %u)\n", preferred_group, expected_size);
unsigned needed_blocks = ceil_div(expected_size, block_size()); unsigned needed_blocks = ceil_div(expected_size, block_size());
@ -877,8 +883,8 @@ unsigned Ext2FS::allocate_inode(GroupIndex preferred_group, off_t expected_size)
unsigned group_index = 0; unsigned group_index = 0;
auto is_suitable_group = [this, needed_blocks] (unsigned groupIndex) { auto is_suitable_group = [this, needed_blocks] (GroupIndex group_index) {
auto& bgd = group_descriptor(groupIndex); auto& bgd = group_descriptor(group_index);
return bgd.bg_free_inodes_count && bgd.bg_free_blocks_count >= needed_blocks; return bgd.bg_free_inodes_count && bgd.bg_free_blocks_count >= needed_blocks;
}; };
@ -957,32 +963,32 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const
return bitmap.get(bit_index); return bitmap.get(bit_index);
} }
bool Ext2FS::set_inode_allocation_state(unsigned index, bool newState) bool Ext2FS::set_inode_allocation_state(InodeIndex inode_index, bool new_state)
{ {
LOCKER(m_lock); LOCKER(m_lock);
unsigned group_index = group_index_from_inode(index); unsigned group_index = group_index_from_inode(inode_index);
auto& bgd = group_descriptor(group_index); auto& bgd = group_descriptor(group_index);
unsigned index_in_group = index - ((group_index - 1) * inodes_per_group()); unsigned index_in_group = inode_index - ((group_index - 1) * inodes_per_group());
unsigned bit_index = (index_in_group - 1) % inodes_per_group(); unsigned bit_index = (index_in_group - 1) % inodes_per_group();
auto block = read_block(bgd.bg_inode_bitmap); auto block = read_block(bgd.bg_inode_bitmap);
ASSERT(block); ASSERT(block);
auto bitmap = Bitmap::wrap(block.pointer(), inodes_per_group()); auto bitmap = Bitmap::wrap(block.pointer(), inodes_per_group());
bool current_state = bitmap.get(bit_index); bool current_state = bitmap.get(bit_index);
dbgprintf("Ext2FS: set_inode_allocation_state(%u) %u -> %u\n", index, current_state, newState); dbgprintf("Ext2FS: set_inode_allocation_state(%u) %u -> %u\n", inode_index, current_state, new_state);
if (current_state == newState) { if (current_state == new_state) {
ASSERT_NOT_REACHED(); ASSERT_NOT_REACHED();
return true; return true;
} }
bitmap.set(bit_index, newState); bitmap.set(bit_index, new_state);
bool success = write_block(bgd.bg_inode_bitmap, block); bool success = write_block(bgd.bg_inode_bitmap, block);
ASSERT(success); ASSERT(success);
// Update superblock // Update superblock
auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer()); auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
dbgprintf("Ext2FS: superblock free inode count %u -> %u\n", sb.s_free_inodes_count, sb.s_free_inodes_count - 1); dbgprintf("Ext2FS: superblock free inode count %u -> %u\n", sb.s_free_inodes_count, sb.s_free_inodes_count - 1);
if (newState) if (new_state)
--sb.s_free_inodes_count; --sb.s_free_inodes_count;
else else
++sb.s_free_inodes_count; ++sb.s_free_inodes_count;
@ -990,7 +996,7 @@ bool Ext2FS::set_inode_allocation_state(unsigned index, bool newState)
// Update BGD // Update BGD
auto& mutable_bgd = const_cast<ext2_group_desc&>(bgd); auto& mutable_bgd = const_cast<ext2_group_desc&>(bgd);
if (newState) if (new_state)
--mutable_bgd.bg_free_inodes_count; --mutable_bgd.bg_free_inodes_count;
else else
++mutable_bgd.bg_free_inodes_count; ++mutable_bgd.bg_free_inodes_count;