1 /*
2 * Copyright 2012 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Paweł Dziepak, pdziepak@quarnos.org
7 */
8 #ifndef FILESYSTEM_H
9 #define FILESYSTEM_H
10
11
12 #include "Delegation.h"
13 #include "InodeIdMap.h"
14 #include "NFS4Defs.h"
15 #include "NFS4Server.h"
16
17
18 class Inode;
19 class RootInode;
20
21 struct MountConfiguration {
22 bool fHard;
23 int fRetryLimit;
24 bigtime_t fRequestTimeout;
25
26 bool fEmulateNamedAttrs;
27 bool fCacheMetadata;
28
29 bigtime_t fDirectoryCacheTime;
30 };
31
32 class FileSystem : public DoublyLinkedListLinkImpl<FileSystem> {
33 public:
34 static status_t Mount(FileSystem** pfs, RPC::Server* serv,
35 const char* serverName, const char* path,
36 dev_t id,
37 const MountConfiguration& configuration);
38 ~FileSystem();
39
40 status_t GetInode(ino_t id, Inode** inode);
41 inline RootInode* Root();
42
43 status_t Migrate(const RPC::Server* serv);
44
45 DoublyLinkedList<OpenState>& OpenFilesLock();
46 void OpenFilesUnlock();
47 inline uint32 OpenFilesCount();
48 void AddOpenFile(OpenState* state);
49 void RemoveOpenFile(OpenState* state);
50
51 DoublyLinkedList<Delegation>& DelegationsLock();
52 void DelegationsUnlock();
53 void AddDelegation(Delegation* delegation);
54 void RemoveDelegation(Delegation* delegation);
55 Delegation* GetDelegation(const FileHandle& handle);
56
57 inline bool IsAttrSupported(Attribute attr) const;
58 inline uint32 ExpireType() const;
59
60 inline RPC::Server* Server();
61 inline NFS4Server* NFSServer();
62
63 inline const char** Path() const;
64 inline const FileSystemId& FsId() const;
65
66 inline uint64 AllocFileId();
67
68 inline dev_t DevId() const;
69 inline InodeIdMap* InoIdMap();
70
71 inline uint64 OpenOwner() const;
72 inline uint32 OpenOwnerSequenceLock();
73 inline void OpenOwnerSequenceUnlock(uint32 sequence);
74
75 inline bool NamedAttrs();
76 inline void SetNamedAttrs(bool attrs);
77
78 inline const MountConfiguration& GetConfiguration();
79
80 inline mutex& CreateFileLock();
81 private:
82 FileSystem(const MountConfiguration& config);
83
84 static status_t _ParsePath(RequestBuilder& req, uint32& count,
85 const char* _path);
86
87 mutex fCreateFileLock;
88
89 mutex fDelegationLock;
90 DoublyLinkedList<Delegation> fDelegationList;
91 AVLTreeMap<FileHandle, Delegation*> fHandleToDelegation;
92
93 DoublyLinkedList<OpenState> fOpenFiles;
94 uint32 fOpenCount;
95 mutex fOpenLock;
96
97 uint64 fOpenOwner;
98 uint32 fOpenOwnerSequence;
99 mutex fOpenOwnerLock;
100
101 uint32 fExpireType;
102 uint32 fSupAttrs[2];
103 bool fNamedAttrs;
104
105 FileSystemId fFsId;
106 const char** fPath;
107
108 RootInode* fRoot;
109
110 RPC::Server* fServer;
111
112 int64 fId;
113 dev_t fDevId;
114
115 InodeIdMap fInoIdMap;
116
117 MountConfiguration fConfiguration;
118 };
119
120
121 inline RootInode*
Root()122 FileSystem::Root()
123 {
124 return fRoot;
125 }
126
127
128 inline uint32
OpenFilesCount()129 FileSystem::OpenFilesCount()
130 {
131 return fOpenCount;
132 }
133
134
135 inline bool
IsAttrSupported(Attribute attr)136 FileSystem::IsAttrSupported(Attribute attr) const
137 {
138 return sIsAttrSet(attr, fSupAttrs, 2);
139 }
140
141
142 inline uint32
ExpireType()143 FileSystem::ExpireType() const
144 {
145 return fExpireType;
146 }
147
148
149 inline RPC::Server*
Server()150 FileSystem::Server()
151 {
152 ASSERT(fServer != NULL);
153 return fServer;
154 }
155
156
157 inline NFS4Server*
NFSServer()158 FileSystem::NFSServer()
159 {
160 ASSERT(fServer->PrivateData() != NULL);
161 return reinterpret_cast<NFS4Server*>(fServer->PrivateData());
162 }
163
164
165 inline const char**
Path()166 FileSystem::Path() const
167 {
168 ASSERT(fPath != NULL);
169 return fPath;
170 }
171
172
173 inline const FileSystemId&
FsId()174 FileSystem::FsId() const
175 {
176 return fFsId;
177 }
178
179
180 inline uint64
AllocFileId()181 FileSystem::AllocFileId()
182 {
183 return atomic_add64(&fId, 1);
184 }
185
186
187 inline dev_t
DevId()188 FileSystem::DevId() const
189 {
190 return fDevId;
191 }
192
193
194 inline InodeIdMap*
InoIdMap()195 FileSystem::InoIdMap()
196 {
197 return &fInoIdMap;
198 }
199
200
201 inline uint64
OpenOwner()202 FileSystem::OpenOwner() const
203 {
204 return fOpenOwner;
205 }
206
207
208 inline uint32
OpenOwnerSequenceLock()209 FileSystem::OpenOwnerSequenceLock()
210 {
211 mutex_lock(&fOpenOwnerLock);
212 return fOpenOwnerSequence;
213 }
214
215
216 inline void
OpenOwnerSequenceUnlock(uint32 sequence)217 FileSystem::OpenOwnerSequenceUnlock(uint32 sequence)
218 {
219 fOpenOwnerSequence = sequence;
220 mutex_unlock(&fOpenOwnerLock);
221 }
222
223
224 inline bool
NamedAttrs()225 FileSystem::NamedAttrs()
226 {
227 return fNamedAttrs;
228 }
229
230
231 inline void
SetNamedAttrs(bool attrs)232 FileSystem::SetNamedAttrs(bool attrs)
233 {
234 fNamedAttrs = attrs;
235 }
236
237
238 inline const MountConfiguration&
GetConfiguration()239 FileSystem::GetConfiguration()
240 {
241 return fConfiguration;
242 }
243
244
245 inline mutex&
CreateFileLock()246 FileSystem::CreateFileLock()
247 {
248 return fCreateFileLock;
249 }
250
251
252 #endif // FILESYSTEM_H
253
254