1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 08:48:11 +00:00

Kernel: Make a copy of the dirty inode list before iterating in sync().

This commit is contained in:
Andreas Kling 2019-02-28 21:51:59 +01:00
parent bff5b71467
commit 6b581aff77
6 changed files with 18 additions and 8 deletions

View file

@ -25,7 +25,8 @@ HashTable<Inode*>& all_inodes()
}
FS::FS()
: m_fsid(++s_lastFileSystemID)
: m_lock("FS")
, m_fsid(++s_lastFileSystemID)
{
all_fses().set(m_fsid, this);
}
@ -143,9 +144,18 @@ int Inode::decrement_link_count()
void FS::sync()
{
for (auto* inode : all_inodes()) {
if (inode->is_metadata_dirty())
inode->flush_metadata();
Vector<Retained<Inode>> inodes;
{
InterruptDisabler disabler;
for (auto* inode : all_inodes()) {
if (inode->is_metadata_dirty())
inodes.unchecked_append(*inode);
}
}
for (auto& inode : inodes) {
ASSERT(inode->is_metadata_dirty());
inode->flush_metadata();
}
}