Prechádzať zdrojové kódy

Kernel: Port Inode to ListedRefCounted

This consolidates the lock+list combo into a SpinLockProtectedValue
and closes yet another unref() race. :^)
Andreas Kling 4 rokov pred
rodič
commit
ea09294351
2 zmenil súbory, kde vykonal 13 pridanie a 20 odobranie
  1. 8 16
      Kernel/FileSystem/Inode.cpp
  2. 5 4
      Kernel/FileSystem/Inode.h

+ 8 - 16
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());
     }

+ 5 - 4
Kernel/FileSystem/Inode.h

@@ -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
@@ -10,7 +10,6 @@
 #include <AK/Function.h>
 #include <AK/HashTable.h>
 #include <AK/IntrusiveList.h>
-#include <AK/RefCounted.h>
 #include <AK/String.h>
 #include <AK/WeakPtr.h>
 #include <Kernel/FileSystem/FIFO.h>
@@ -19,11 +18,12 @@
 #include <Kernel/FileSystem/InodeMetadata.h>
 #include <Kernel/Forward.h>
 #include <Kernel/KResult.h>
+#include <Kernel/Library/ListedRefCounted.h>
 #include <Kernel/Locking/Mutex.h>
 
 namespace Kernel {
 
-class Inode : public RefCounted<Inode> {
+class Inode : public ListedRefCounted<Inode> {
     friend class VirtualFileSystem;
     friend class FileSystem;
 
@@ -134,7 +134,8 @@ private:
     Vector<Flock> m_flocks;
 
 public:
-    using List = IntrusiveList<Inode, RawPtr<Inode>, &Inode::m_inode_list_node>;
+    using AllInstancesList = IntrusiveList<Inode, RawPtr<Inode>, &Inode::m_inode_list_node>;
+    static SpinLockProtectedValue<Inode::AllInstancesList>& all_instances();
 };
 
 }