summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem/Inode.cpp
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-08-17 01:05:06 +0200
committerAndreas Kling <kling@serenityos.org>2021-08-17 01:21:47 +0200
commitea092943518991e4f0325ef3df154c9c46189d2c (patch)
tree40b3b83f704c4eadaf6b8f944ad178ec27aa54f5 /Kernel/FileSystem/Inode.cpp
parentb70b3a9b92b9104ed0b1273178644e3e24759416 (diff)
downloadserenity-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.cpp24
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());
}