Serenity Operating System
at master 50 lines 1.5 kB view raw
1/* 2 * Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/Error.h> 10#include <AK/IntrusiveList.h> 11#include <AK/RefPtr.h> 12#include <Kernel/Forward.h> 13#include <Kernel/KString.h> 14#include <Kernel/Library/ListedRefCounted.h> 15#include <Kernel/Locking/SpinlockProtected.h> 16 17namespace Kernel { 18 19class Custody final : public ListedRefCounted<Custody, LockType::Spinlock> { 20public: 21 static ErrorOr<NonnullRefPtr<Custody>> try_create(Custody* parent, StringView name, Inode&, int mount_flags); 22 23 ~Custody(); 24 25 RefPtr<Custody> parent() { return m_parent; } 26 RefPtr<Custody const> parent() const { return m_parent; } 27 Inode& inode() { return *m_inode; } 28 Inode const& inode() const { return *m_inode; } 29 StringView name() const { return m_name->view(); } 30 ErrorOr<NonnullOwnPtr<KString>> try_serialize_absolute_path() const; 31 32 int mount_flags() const { return m_mount_flags; } 33 bool is_readonly() const; 34 35private: 36 Custody(Custody* parent, NonnullOwnPtr<KString> name, Inode&, int mount_flags); 37 38 RefPtr<Custody> m_parent; 39 NonnullOwnPtr<KString> m_name; 40 NonnullRefPtr<Inode> m_inode; 41 int m_mount_flags { 0 }; 42 43 mutable IntrusiveListNode<Custody> m_all_custodies_list_node; 44 45public: 46 using AllCustodiesList = IntrusiveList<&Custody::m_all_custodies_list_node>; 47 static SpinlockProtected<Custody::AllCustodiesList, LockRank::None>& all_instances(); 48}; 49 50}