mirror of
https://github.com/RGBCube/serenity
synced 2025-06-29 09:52:12 +00:00
Kernel: Remove temporary Vector from Ext2FS::flush_writes()
Previously we were using this vector to store the inodes as we iterated. However, we don't need to store all of them, just the previous inode, as we know it will be safe to remove it once we've iterated past that element.
This commit is contained in:
parent
aa77c2ca58
commit
4b4cf06069
1 changed files with 13 additions and 5 deletions
|
@ -700,26 +700,34 @@ void Ext2FS::flush_writes()
|
|||
// Uncache Inodes that are only kept alive by the index-to-inode lookup cache.
|
||||
// We don't uncache Inodes that are being watched by at least one InodeWatcher.
|
||||
|
||||
Optional<InodeIndex> last_index {};
|
||||
auto remove_previous_entry_from_cache = [&]() {
|
||||
if (last_index.has_value()) {
|
||||
m_inode_cache.remove(last_index.value());
|
||||
last_index.clear();
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: It would be better to keep a capped number of Inodes around.
|
||||
// The problem is that they are quite heavy objects, and use a lot of heap memory
|
||||
// for their (child name lookup) and (block list) caches.
|
||||
Vector<InodeIndex> unused_inodes;
|
||||
for (auto& it : m_inode_cache) {
|
||||
remove_previous_entry_from_cache();
|
||||
|
||||
// NOTE: If we're asked to look up an inode by number (via get_inode) and it turns out
|
||||
// to not exist, we remember the fact that it doesn't exist by caching a nullptr.
|
||||
// This seems like a reasonable time to uncache ideas about unknown inodes, so do that.
|
||||
if (!it.value) {
|
||||
MUST(unused_inodes.try_append(it.key));
|
||||
last_index = it.key;
|
||||
continue;
|
||||
}
|
||||
if (it.value->ref_count() != 1)
|
||||
continue;
|
||||
if (it.value->has_watchers())
|
||||
continue;
|
||||
MUST(unused_inodes.try_append(it.key));
|
||||
last_index = it.key;
|
||||
}
|
||||
for (auto index : unused_inodes)
|
||||
uncache_inode(index);
|
||||
remove_previous_entry_from_cache();
|
||||
}
|
||||
|
||||
BlockBasedFileSystem::flush_writes();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue