The Pedigree Project 0.1
RamFs.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef RAMFS_H
21#define RAMFS_H
22
28#include "pedigree/kernel/Atomic.h"
29#include "pedigree/kernel/compiler.h"
30#include "pedigree/kernel/process/Mutex.h"
31#include "pedigree/kernel/processor/types.h"
32#include "pedigree/kernel/utilities/Cache.h"
33#include "pedigree/kernel/utilities/String.h"
34
35#include "modules/system/vfs/Directory.h"
36#include "modules/system/vfs/File.h"
37#include "modules/system/vfs/Filesystem.h"
38#include "modules/system/vfs/MemoryExtendedAttributes.h"
39
40class Disk;
41
42class EXPORTED_PUBLIC RamFile : public File {
43 public:
44 RamFile(const String& name, uintptr_t inode, Filesystem* pParentFS, File* pParent);
45
46 virtual ~RamFile();
47
48 virtual Attributes getAttributes() const override;
49
50 bool addLink();
51 void removeLink();
52
53 XattrStatus getExtendedAttribute(const StringView& name, void* buffer, size_t capacity,
54 size_t& required) override;
55 XattrStatus listExtendedAttributes(void* buffer, size_t capacity, size_t& required) override;
56 XattrStatus setExtendedAttribute(const StringView& name, const void* value, size_t length,
57 unsigned flags) override;
58 XattrStatus removeExtendedAttribute(const StringView& name) override;
59
60 virtual void truncate() override;
61
62 bool canWrite();
63
64 protected:
65 virtual bool resizeFile(size_t size) override;
66 virtual bool allocateFileRange(size_t offset, size_t length) override;
67 virtual bool prepareShrink(const ShrinkContext& context,
68 UniquePointer<PreparedShrink>& prepared) override;
69 virtual uintptr_t readBlock(uint64_t location) override;
70
71 virtual bool pinBlock(uint64_t location) override;
72 uintptr_t acquireCachedBlock(uint64_t location, bool retryChanged) override;
73
74 virtual void unpinBlock(uint64_t location) override;
75
76 private:
77 class ShrinkPlan;
78 Cache m_FileBlocks;
79 mutable Mutex m_FileBlocksLock;
80 Vector<uint64_t> m_BlockOffsets;
81
82 size_t m_nOwnerPid;
83 Atomic<size_t> m_LinkCount;
84 MemoryExtendedAttributes m_ExtendedAttributes;
85};
86
88class EXPORTED_PUBLIC RamDir : public Directory {
89 private:
90 RamDir(const RamDir&);
91 RamDir& operator=(const RamDir&);
92
93 public:
94 RamDir(const String& name, size_t inode, class Filesystem* pFs, File* pParent);
95 virtual ~RamDir();
96
97 XattrStatus getExtendedAttribute(const StringView& name, void* buffer, size_t capacity,
98 size_t& required) override;
99 XattrStatus listExtendedAttributes(void* buffer, size_t capacity, size_t& required) override;
100 XattrStatus setExtendedAttribute(const StringView& name, const void* value, size_t length,
101 unsigned flags) override;
102 XattrStatus removeExtendedAttribute(const StringView& name) override;
103
104 virtual void cacheDirectoryContents() override {}
105
106 virtual bool addEntry(String filename, File* pFile);
107
108 virtual bool removeEntry(const String& filename, File* pFile);
109
110 bool removeFromParent(RamDir* parent, const String& filename);
111
112 private:
113 Mutex m_DirectoryLock;
114 MemoryExtendedAttributes m_ExtendedAttributes;
115};
116
118class EXPORTED_PUBLIC RamFs : public Filesystem {
119 public:
120 RamFs();
121 virtual ~RamFs();
122
123 virtual bool initialise(Disk* pDisk) override;
124
125 SyncStatus sync() override;
126
127 void setProcessOwnership(bool bEnable) {
128 m_bProcessOwners = bEnable;
129 }
130
131 bool getProcessOwnership() const {
132 return m_bProcessOwners;
133 }
134
135 virtual File* getRoot() const override {
136 return m_pRoot;
137 }
138 virtual const String& getVolumeLabel() const override {
139 return m_VolumeLabel;
140 }
141
142 protected:
143 virtual bool createFile(File* parent, const String& filename, uint32_t mask) override;
144 virtual bool createDirectory(File* parent, const String& filename, uint32_t mask) override;
145 virtual bool createSymlink(File* parent, const String& filename, const String& value) override;
146 virtual bool createLink(File* parent, const String& filename, File* target) override;
147 virtual bool removeNode(File* parent, const String& filename, File* file) override;
148 virtual bool renameNode(Directory* oldParent, const String& oldName, File* source,
149 Directory* newParent, const String& newName, File* replaced) override;
150
151 RamFs(const RamFs&);
152 void operator=(const RamFs&);
153
154 uintptr_t allocateInode();
155
156 static String m_VolumeLabel;
157
160
161 bool m_bProcessOwners;
162
163 // Never recycle an identity while an unlinked node may still be open.
164 Atomic<uintptr_t> m_NextInode;
165};
166
167#endif
Definition Cache.h:207
Definition Disk.h:35
Definition File.h:74
virtual XattrStatus getExtendedAttribute(const StringView &name, void *buffer, size_t capacity, size_t &required)
Definition File.cc:1008
virtual uintptr_t readBlock(uint64_t location)
Definition File.cc:1276
virtual void unpinBlock(uint64_t location)
Definition File.cc:1327
virtual bool allocateFileRange(size_t offset, size_t length)
virtual bool sync()
Definition File.cc:548
virtual MUST_USE_RESULT uintptr_t acquireCachedBlock(uint64_t location, bool retryChanged)
Definition File.cc:1312
virtual void truncate()
Definition File.cc:1054
virtual MUST_USE_RESULT bool pinBlock(uint64_t location)
Definition File.cc:1308
Definition Mutex.h:56
Definition RamFs.h:88
virtual void cacheDirectoryContents() override
Definition RamFs.h:104
Definition RamFs.h:118
File * m_pRoot
Definition RamFs.h:159
virtual const String & getVolumeLabel() const override
Definition RamFs.h:138
virtual File * getRoot() const override
Definition RamFs.h:135
A vector / dynamic array.
Definition Vector.h:33