From 23c021912e3e550400d862de93cc152d5818a653 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Fri, 28 May 2021 05:41:05 -0700 Subject: [PATCH] Kernel: Move TmpFS towards OOM safety --- Kernel/FileSystem/TmpFS.cpp | 21 ++++++++++++--------- Kernel/FileSystem/TmpFS.h | 6 +++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Kernel/FileSystem/TmpFS.cpp b/Kernel/FileSystem/TmpFS.cpp index e56e310207..08cfb261bc 100644 --- a/Kernel/FileSystem/TmpFS.cpp +++ b/Kernel/FileSystem/TmpFS.cpp @@ -11,9 +11,9 @@ namespace Kernel { -NonnullRefPtr TmpFS::create() +RefPtr TmpFS::create() { - return adopt_ref(*new TmpFS); + return adopt_ref_if_nonnull(new TmpFS); } TmpFS::TmpFS() @@ -27,7 +27,7 @@ TmpFS::~TmpFS() bool TmpFS::initialize() { m_root_inode = TmpFSInode::create_root(*this); - return true; + return !m_root_inode.is_null(); } NonnullRefPtr TmpFS::root_inode() const @@ -84,14 +84,15 @@ TmpFSInode::~TmpFSInode() { } -NonnullRefPtr TmpFSInode::create(TmpFS& fs, InodeMetadata metadata, InodeIdentifier parent) +RefPtr TmpFSInode::create(TmpFS& fs, InodeMetadata metadata, InodeIdentifier parent) { - auto inode = adopt_ref(*new TmpFSInode(fs, metadata, parent)); - fs.register_inode(inode); + auto inode = adopt_ref_if_nonnull(new TmpFSInode(fs, metadata, parent)); + if (inode) + fs.register_inode(*inode); return inode; } -NonnullRefPtr TmpFSInode::create_root(TmpFS& fs) +RefPtr TmpFSInode::create_root(TmpFS& fs) { InodeMetadata metadata; auto now = kgettimeofday().to_truncated_seconds(); @@ -270,10 +271,12 @@ KResultOr> TmpFSInode::create_child(const String& name, mod metadata.mtime = now; auto child = TmpFSInode::create(fs(), metadata, identifier()); - auto result = add_child(child, name, mode); + if (!child) + return ENOMEM; + auto result = add_child(*child, name, mode); if (result.is_error()) return result; - return child; + return child.release_nonnull(); } KResult TmpFSInode::add_child(Inode& child, const StringView& name, mode_t) diff --git a/Kernel/FileSystem/TmpFS.h b/Kernel/FileSystem/TmpFS.h index 0557e00286..823a21c33c 100644 --- a/Kernel/FileSystem/TmpFS.h +++ b/Kernel/FileSystem/TmpFS.h @@ -21,7 +21,7 @@ class TmpFS final : public FS { public: virtual ~TmpFS() override; - static NonnullRefPtr create(); + static RefPtr create(); virtual bool initialize() override; virtual const char* class_name() const override { return "TmpFS"; } @@ -74,8 +74,8 @@ public: private: TmpFSInode(TmpFS& fs, InodeMetadata metadata, InodeIdentifier parent); - static NonnullRefPtr create(TmpFS&, InodeMetadata metadata, InodeIdentifier parent); - static NonnullRefPtr create_root(TmpFS&); + static RefPtr create(TmpFS&, InodeMetadata metadata, InodeIdentifier parent); + static RefPtr create_root(TmpFS&); void notify_watchers();