From facd18113b8a62671e8281a6dade0670589142da Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Wed, 10 Mar 2021 18:47:11 +0100 Subject: [PATCH] Kernel: Modify block lists in place for Ext2FSInode::resize() This significantly reduces the number of allocations/deallocations inside the kernel when growing files as well as reducing spam in the kernel logs. --- Kernel/FileSystem/Ext2FileSystem.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 4fadf8f70f..88e5580e8d 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -806,26 +806,23 @@ KResult Ext2FSInode::resize(u64 new_size) return ENOSPC; } - Vector block_list; - if (!m_block_list.is_empty()) - block_list = m_block_list; - else - block_list = this->compute_block_list(); + if (m_block_list.is_empty()) + m_block_list = this->compute_block_list(); if (blocks_needed_after > blocks_needed_before) { auto blocks_or_error = fs().allocate_blocks(fs().group_index_from_inode(index()), blocks_needed_after - blocks_needed_before); if (blocks_or_error.is_error()) return blocks_or_error.error(); - block_list.append(blocks_or_error.release_value()); + m_block_list.append(blocks_or_error.release_value()); } else if (blocks_needed_after < blocks_needed_before) { if constexpr (EXT2_DEBUG) { - dbgln("Ext2FS: Shrinking inode {}. Old block list is {} entries:", index(), block_list.size()); - for (auto block_index : block_list) { + dbgln("Ext2FS: Shrinking inode {}. Old block list is {} entries:", index(), m_block_list.size()); + for (auto block_index : m_block_list) { dbgln(" # {}", block_index); } } - while (block_list.size() != blocks_needed_after) { - auto block_index = block_list.take_last(); + while (m_block_list.size() != blocks_needed_after) { + auto block_index = m_block_list.take_last(); if (block_index.value()) { auto result = fs().set_block_allocation_state(block_index, false); if (result.is_error()) { @@ -836,8 +833,6 @@ KResult Ext2FSInode::resize(u64 new_size) } } - m_block_list = move(block_list); - auto result = flush_block_list(); if (result.is_error()) return result;