diff options
author | Andreas Kling <kling@serenityos.org> | 2021-08-17 01:05:06 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-17 01:21:47 +0200 |
commit | ea092943518991e4f0325ef3df154c9c46189d2c (patch) | |
tree | 40b3b83f704c4eadaf6b8f944ad178ec27aa54f5 /Kernel/FileSystem/Inode.cpp | |
parent | b70b3a9b92b9104ed0b1273178644e3e24759416 (diff) | |
download | serenity-ea092943518991e4f0325ef3df154c9c46189d2c.zip |
Kernel: Port Inode to ListedRefCounted
This consolidates the lock+list combo into a SpinLockProtectedValue
and closes yet another unref() race. :^)
Diffstat (limited to 'Kernel/FileSystem/Inode.cpp')
-rw-r--r-- | Kernel/FileSystem/Inode.cpp | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index 2b0943a238..bab4ade7e5 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> * Copyright (c) 2021, sin-ack <sin-ack@protonmail.com> * * SPDX-License-Identifier: BSD-2-Clause @@ -22,26 +22,22 @@ namespace Kernel { -static SpinLock s_all_inodes_lock; -static Singleton<Inode::List> s_list; +static Singleton<SpinLockProtectedValue<Inode::AllInstancesList>> s_all_instances; -static Inode::List& all_with_lock() +SpinLockProtectedValue<Inode::AllInstancesList>& Inode::all_instances() { - VERIFY(s_all_inodes_lock.is_locked()); - - return *s_list; + return s_all_instances; } void Inode::sync() { NonnullRefPtrVector<Inode, 32> inodes; - { - ScopedSpinLock all_inodes_lock(s_all_inodes_lock); - for (auto& inode : all_with_lock()) { + Inode::all_instances().with([&](auto& all_inodes) { + for (auto& inode : all_inodes) { if (inode.is_metadata_dirty()) inodes.append(inode); } - } + }); for (auto& inode : inodes) { VERIFY(inode.is_metadata_dirty()); @@ -95,15 +91,11 @@ Inode::Inode(FileSystem& fs, InodeIndex index) : m_file_system(fs) , m_index(index) { - ScopedSpinLock all_inodes_lock(s_all_inodes_lock); - all_with_lock().append(*this); + Inode::all_instances().with([&](auto& all_inodes) { all_inodes.append(*this); }); } Inode::~Inode() { - ScopedSpinLock all_inodes_lock(s_all_inodes_lock); - all_with_lock().remove(*this); - for (auto& watcher : m_watchers) { watcher->unregister_by_inode({}, identifier()); } |