From 6df87b51f7d0193f2f493dab5a6358bda480a72e Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 9 Jul 2020 13:51:58 -0600 Subject: [PATCH] Kernel: Protect Inode list with SpinLock (#2748) Fixes crashes when a context switch happens in the middle of modifying it, or when another thread on another processor modifies it at the same time. --- Kernel/FileSystem/Inode.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index aa1c97b4fa..ec410bcac3 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -36,8 +36,12 @@ namespace Kernel { +static SpinLock s_all_inodes_lock; + InlineLinkedList& all_inodes() { + ASSERT(s_all_inodes_lock.is_locked()); + static InlineLinkedList* list; if (!list) list = new InlineLinkedList; @@ -48,7 +52,7 @@ void Inode::sync() { NonnullRefPtrVector inodes; { - InterruptDisabler disabler; + ScopedSpinLock all_inodes_lock(s_all_inodes_lock); for (auto& inode : all_inodes()) { if (inode.is_metadata_dirty()) inodes.append(inode); @@ -111,11 +115,13 @@ Inode::Inode(FS& fs, unsigned index) : m_fs(fs) , m_index(index) { + ScopedSpinLock all_inodes_lock(s_all_inodes_lock); all_inodes().append(this); } Inode::~Inode() { + ScopedSpinLock all_inodes_lock(s_all_inodes_lock); all_inodes().remove(this); }