diff --git a/Kernel/FileSystem/DiskBackedFileSystem.cpp b/Kernel/FileSystem/DiskBackedFileSystem.cpp index c8c3be33a6..c7581b8fb1 100644 --- a/Kernel/FileSystem/DiskBackedFileSystem.cpp +++ b/Kernel/FileSystem/DiskBackedFileSystem.cpp @@ -15,12 +15,13 @@ struct CacheEntry { class DiskCache { public: - explicit DiskCache(size_t block_size) - : m_cached_block_data(KBuffer::create_with_size(m_entry_count * block_size)) + explicit DiskCache(DiskBackedFS& fs) + : m_fs(fs) + , m_cached_block_data(KBuffer::create_with_size(m_entry_count * m_fs.block_size())) { m_entries = (CacheEntry*)kmalloc_eternal(m_entry_count * sizeof(CacheEntry)); for (size_t i = 0; i < m_entry_count; ++i) { - m_entries[i].data = m_cached_block_data.data() + i * block_size; + m_entries[i].data = m_cached_block_data.data() + i * m_fs.block_size(); } } @@ -47,8 +48,11 @@ public: oldest_clean_entry = &entry; } } - // FIXME: What if every single entry was dirty though :( - ASSERT(oldest_clean_entry); + if (!oldest_clean_entry) { + // Not a single clean entry! Flush writes and try again. + m_fs.flush_writes(); + return get(block_index); + } // Replace the oldest clean entry. auto& new_entry = *oldest_clean_entry; @@ -66,6 +70,8 @@ public: callback(m_entries[i]); } +private: + DiskBackedFS& m_fs; size_t m_entry_count { 10000 }; KBuffer m_cached_block_data; CacheEntry* m_entries { nullptr }; @@ -160,6 +166,6 @@ void DiskBackedFS::flush_writes() DiskCache& DiskBackedFS::cache() const { if (!m_cache) - m_cache = make(block_size()); + m_cache = make(const_cast(*this)); return *m_cache; }