diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index fef6d3b151..69945ba800 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -154,11 +154,12 @@ bool Inode::unbind_socket() return true; } -void Inode::register_watcher(Badge, InodeWatcher& watcher) +ErrorOr Inode::register_watcher(Badge, InodeWatcher& watcher) { MutexLocker locker(m_inode_lock); VERIFY(!m_watchers.contains(&watcher)); - m_watchers.set(&watcher); + TRY(m_watchers.try_set(&watcher)); + return {}; } void Inode::unregister_watcher(Badge, InodeWatcher& watcher) diff --git a/Kernel/FileSystem/Inode.h b/Kernel/FileSystem/Inode.h index c773e488c6..1a074c3591 100644 --- a/Kernel/FileSystem/Inode.h +++ b/Kernel/FileSystem/Inode.h @@ -91,7 +91,7 @@ public: bool has_watchers() const { return !m_watchers.is_empty(); } - void register_watcher(Badge, InodeWatcher&); + ErrorOr register_watcher(Badge, InodeWatcher&); void unregister_watcher(Badge, InodeWatcher&); ErrorOr> fifo(); diff --git a/Kernel/FileSystem/InodeWatcher.cpp b/Kernel/FileSystem/InodeWatcher.cpp index e85dff86fd..e3563f599b 100644 --- a/Kernel/FileSystem/InodeWatcher.cpp +++ b/Kernel/FileSystem/InodeWatcher.cpp @@ -124,13 +124,19 @@ ErrorOr InodeWatcher::register_inode(Inode& inode, unsigned event_mask) auto description = TRY(WatchDescription::create(wd, inode, event_mask)); TRY(m_inode_to_watches.try_set(inode.identifier(), description.ptr())); - auto result = m_wd_to_watches.try_set(wd, move(description)); - if (result.is_error()) { + auto set_result = m_wd_to_watches.try_set(wd, move(description)); + if (set_result.is_error()) { m_inode_to_watches.remove(inode.identifier()); - return result.release_error(); + return set_result.release_error(); + } + + auto register_result = inode.register_watcher({}, *this); + if (register_result.is_error()) { + m_inode_to_watches.remove(inode.identifier()); + m_wd_to_watches.remove(wd); + return register_result.release_error(); } - inode.register_watcher({}, *this); return wd; }