Serenity Operating System
1/*
2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <AK/RefPtr.h>
10#include <Kernel/FileSystem/Custody.h>
11#include <Kernel/FileSystem/FileSystem.h>
12#include <Kernel/FileSystem/Inode.h>
13#include <Kernel/Forward.h>
14#include <Kernel/Library/NonnullLockRefPtr.h>
15
16namespace Kernel {
17
18class VirtualFileSystem;
19class Mount {
20 friend class VirtualFileSystem;
21
22public:
23 Mount(FileSystem&, Custody* host_custody, int flags);
24 Mount(Inode& source, Custody& host_custody, int flags);
25
26 RefPtr<Inode const> host() const;
27 RefPtr<Inode> host();
28
29 Inode const& guest() const { return *m_guest; }
30 Inode& guest() { return *m_guest; }
31
32 FileSystem const& guest_fs() const { return *m_guest_fs; }
33 FileSystem& guest_fs() { return *m_guest_fs; }
34
35 ErrorOr<NonnullOwnPtr<KString>> absolute_path() const;
36
37 int flags() const { return m_flags; }
38 void set_flags(int flags) { m_flags = flags; }
39
40private:
41 NonnullRefPtr<Inode> m_guest;
42 NonnullLockRefPtr<FileSystem> m_guest_fs;
43 SpinlockProtected<RefPtr<Custody>, LockRank::None> m_host_custody;
44 int m_flags;
45
46 IntrusiveListNode<Mount> m_vfs_list_node;
47};
48
49}