mirror of
https://github.com/RGBCube/serenity
synced 2025-05-20 18:05:07 +00:00
Kernel: Improve some low-memory situations with ext2
This commit is contained in:
parent
54c66b8f7b
commit
ae956edf6e
2 changed files with 9 additions and 7 deletions
|
@ -924,7 +924,6 @@ KResult Ext2FSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto buffer_or = read_entire();
|
auto buffer_or = read_entire();
|
||||||
ASSERT(!buffer_or.is_error());
|
|
||||||
if (buffer_or.is_error())
|
if (buffer_or.is_error())
|
||||||
return buffer_or.error();
|
return buffer_or.error();
|
||||||
|
|
||||||
|
@ -1537,11 +1536,11 @@ KResultOr<NonnullRefPtr<Inode>> Ext2FS::create_inode(InodeIdentifier parent_id,
|
||||||
return inode.release_nonnull();
|
return inode.release_nonnull();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ext2FSInode::populate_lookup_cache() const
|
bool Ext2FSInode::populate_lookup_cache() const
|
||||||
{
|
{
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
if (!m_lookup_cache.is_empty())
|
if (!m_lookup_cache.is_empty())
|
||||||
return;
|
return true;
|
||||||
HashMap<String, unsigned> children;
|
HashMap<String, unsigned> children;
|
||||||
|
|
||||||
KResult result = traverse_as_directory([&children](auto& entry) {
|
KResult result = traverse_as_directory([&children](auto& entry) {
|
||||||
|
@ -1549,17 +1548,20 @@ void Ext2FSInode::populate_lookup_cache() const
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
ASSERT(result.is_success());
|
if (!result.is_success())
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!m_lookup_cache.is_empty())
|
if (!m_lookup_cache.is_empty())
|
||||||
return;
|
return false;
|
||||||
m_lookup_cache = move(children);
|
m_lookup_cache = move(children);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
RefPtr<Inode> Ext2FSInode::lookup(StringView name)
|
RefPtr<Inode> Ext2FSInode::lookup(StringView name)
|
||||||
{
|
{
|
||||||
ASSERT(is_directory());
|
ASSERT(is_directory());
|
||||||
populate_lookup_cache();
|
if (!populate_lookup_cache())
|
||||||
|
return {};
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
auto it = m_lookup_cache.find(name.hash(), [&](auto& entry) { return entry.key == name; });
|
auto it = m_lookup_cache.find(name.hash(), [&](auto& entry) { return entry.key == name; });
|
||||||
if (it != m_lookup_cache.end())
|
if (it != m_lookup_cache.end())
|
||||||
|
|
|
@ -78,7 +78,7 @@ private:
|
||||||
virtual KResult truncate(u64) override;
|
virtual KResult truncate(u64) override;
|
||||||
|
|
||||||
bool write_directory(const Vector<Ext2FSDirectoryEntry>&);
|
bool write_directory(const Vector<Ext2FSDirectoryEntry>&);
|
||||||
void populate_lookup_cache() const;
|
bool populate_lookup_cache() const;
|
||||||
KResult resize(u64);
|
KResult resize(u64);
|
||||||
|
|
||||||
static u8 file_type_for_directory_entry(const ext2_dir_entry_2&);
|
static u8 file_type_for_directory_entry(const ext2_dir_entry_2&);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue