100a8558cSPawel Dziepak /*
200a8558cSPawel Dziepak * Copyright 2012 Haiku, Inc. All rights reserved.
300a8558cSPawel Dziepak * Distributed under the terms of the MIT License.
400a8558cSPawel Dziepak *
500a8558cSPawel Dziepak * Authors:
600a8558cSPawel Dziepak * Paweł Dziepak, pdziepak@quarnos.org
700a8558cSPawel Dziepak */
800a8558cSPawel Dziepak #ifndef FILESYSTEM_H
900a8558cSPawel Dziepak #define FILESYSTEM_H
1000a8558cSPawel Dziepak
1100a8558cSPawel Dziepak
124a153753SPawel Dziepak #include "Delegation.h"
1300a8558cSPawel Dziepak #include "InodeIdMap.h"
1400a8558cSPawel Dziepak #include "NFS4Defs.h"
1500a8558cSPawel Dziepak #include "NFS4Server.h"
1600a8558cSPawel Dziepak
1700a8558cSPawel Dziepak
1800a8558cSPawel Dziepak class Inode;
1900a8558cSPawel Dziepak class RootInode;
2000a8558cSPawel Dziepak
21060a4636SPawel Dziepak struct MountConfiguration {
22060a4636SPawel Dziepak bool fHard;
23060a4636SPawel Dziepak int fRetryLimit;
24ad1a84afSPawel Dziepak bigtime_t fRequestTimeout;
25060a4636SPawel Dziepak
26060a4636SPawel Dziepak bool fEmulateNamedAttrs;
27060a4636SPawel Dziepak bool fCacheMetadata;
283d064796SPawel Dziepak
293d064796SPawel Dziepak bigtime_t fDirectoryCacheTime;
30060a4636SPawel Dziepak };
31060a4636SPawel Dziepak
32332621d1SPawel Dziepak class FileSystem : public DoublyLinkedListLinkImpl<FileSystem> {
3300a8558cSPawel Dziepak public:
3400a8558cSPawel Dziepak static status_t Mount(FileSystem** pfs, RPC::Server* serv,
35*b18b18acSFredrik Holmqvist const char* serverName, const char* path,
362b66a08aSPawel Dziepak dev_t id,
37060a4636SPawel Dziepak const MountConfiguration& configuration);
3800a8558cSPawel Dziepak ~FileSystem();
3900a8558cSPawel Dziepak
4000a8558cSPawel Dziepak status_t GetInode(ino_t id, Inode** inode);
4178fc85a6SPawel Dziepak inline RootInode* Root();
4200a8558cSPawel Dziepak
4300a8558cSPawel Dziepak status_t Migrate(const RPC::Server* serv);
4400a8558cSPawel Dziepak
45b1fd656dSPawel Dziepak DoublyLinkedList<OpenState>& OpenFilesLock();
4600a8558cSPawel Dziepak void OpenFilesUnlock();
4700a8558cSPawel Dziepak inline uint32 OpenFilesCount();
48bfa20379SPawel Dziepak void AddOpenFile(OpenState* state);
49bfa20379SPawel Dziepak void RemoveOpenFile(OpenState* state);
5000a8558cSPawel Dziepak
510dff48c7SPawel Dziepak DoublyLinkedList<Delegation>& DelegationsLock();
520dff48c7SPawel Dziepak void DelegationsUnlock();
534a153753SPawel Dziepak void AddDelegation(Delegation* delegation);
544a153753SPawel Dziepak void RemoveDelegation(Delegation* delegation);
554a153753SPawel Dziepak Delegation* GetDelegation(const FileHandle& handle);
564a153753SPawel Dziepak
5700a8558cSPawel Dziepak inline bool IsAttrSupported(Attribute attr) const;
5800a8558cSPawel Dziepak inline uint32 ExpireType() const;
5900a8558cSPawel Dziepak
6000a8558cSPawel Dziepak inline RPC::Server* Server();
6100a8558cSPawel Dziepak inline NFS4Server* NFSServer();
6200a8558cSPawel Dziepak
63469f13fdSPawel Dziepak inline const char** Path() const;
6400a8558cSPawel Dziepak inline const FileSystemId& FsId() const;
6500a8558cSPawel Dziepak
6600a8558cSPawel Dziepak inline uint64 AllocFileId();
6700a8558cSPawel Dziepak
6800a8558cSPawel Dziepak inline dev_t DevId() const;
6900a8558cSPawel Dziepak inline InodeIdMap* InoIdMap();
7000a8558cSPawel Dziepak
7199092223SPawel Dziepak inline uint64 OpenOwner() const;
7299092223SPawel Dziepak inline uint32 OpenOwnerSequenceLock();
73b6d5fa92SPawel Dziepak inline void OpenOwnerSequenceUnlock(uint32 sequence);
7499092223SPawel Dziepak
75a5ae9b47SPawel Dziepak inline bool NamedAttrs();
76a5ae9b47SPawel Dziepak inline void SetNamedAttrs(bool attrs);
77a5ae9b47SPawel Dziepak
78060a4636SPawel Dziepak inline const MountConfiguration& GetConfiguration();
79060a4636SPawel Dziepak
80ce851e2bSPawel Dziepak inline mutex& CreateFileLock();
8100a8558cSPawel Dziepak private:
82060a4636SPawel Dziepak FileSystem(const MountConfiguration& config);
8300a8558cSPawel Dziepak
84469f13fdSPawel Dziepak static status_t _ParsePath(RequestBuilder& req, uint32& count,
85469f13fdSPawel Dziepak const char* _path);
86469f13fdSPawel Dziepak
87ce851e2bSPawel Dziepak mutex fCreateFileLock;
88ce851e2bSPawel Dziepak
894a153753SPawel Dziepak mutex fDelegationLock;
900dff48c7SPawel Dziepak DoublyLinkedList<Delegation> fDelegationList;
914a153753SPawel Dziepak AVLTreeMap<FileHandle, Delegation*> fHandleToDelegation;
924a153753SPawel Dziepak
93b1fd656dSPawel Dziepak DoublyLinkedList<OpenState> fOpenFiles;
9400a8558cSPawel Dziepak uint32 fOpenCount;
9500a8558cSPawel Dziepak mutex fOpenLock;
9600a8558cSPawel Dziepak
9799092223SPawel Dziepak uint64 fOpenOwner;
9899092223SPawel Dziepak uint32 fOpenOwnerSequence;
9999092223SPawel Dziepak mutex fOpenOwnerLock;
10099092223SPawel Dziepak
10100a8558cSPawel Dziepak uint32 fExpireType;
10200a8558cSPawel Dziepak uint32 fSupAttrs[2];
103a5ae9b47SPawel Dziepak bool fNamedAttrs;
10400a8558cSPawel Dziepak
10500a8558cSPawel Dziepak FileSystemId fFsId;
106469f13fdSPawel Dziepak const char** fPath;
10700a8558cSPawel Dziepak
10800a8558cSPawel Dziepak RootInode* fRoot;
10900a8558cSPawel Dziepak
11000a8558cSPawel Dziepak RPC::Server* fServer;
11100a8558cSPawel Dziepak
112077c84ebSPawel Dziepak int64 fId;
11300a8558cSPawel Dziepak dev_t fDevId;
11400a8558cSPawel Dziepak
11500a8558cSPawel Dziepak InodeIdMap fInoIdMap;
116060a4636SPawel Dziepak
117060a4636SPawel Dziepak MountConfiguration fConfiguration;
11800a8558cSPawel Dziepak };
11900a8558cSPawel Dziepak
12000a8558cSPawel Dziepak
12178fc85a6SPawel Dziepak inline RootInode*
Root()12200a8558cSPawel Dziepak FileSystem::Root()
12300a8558cSPawel Dziepak {
12478fc85a6SPawel Dziepak return fRoot;
12500a8558cSPawel Dziepak }
12600a8558cSPawel Dziepak
12700a8558cSPawel Dziepak
12800a8558cSPawel Dziepak inline uint32
OpenFilesCount()12900a8558cSPawel Dziepak FileSystem::OpenFilesCount()
13000a8558cSPawel Dziepak {
13100a8558cSPawel Dziepak return fOpenCount;
13200a8558cSPawel Dziepak }
13300a8558cSPawel Dziepak
13400a8558cSPawel Dziepak
13500a8558cSPawel Dziepak inline bool
IsAttrSupported(Attribute attr)13600a8558cSPawel Dziepak FileSystem::IsAttrSupported(Attribute attr) const
13700a8558cSPawel Dziepak {
13800a8558cSPawel Dziepak return sIsAttrSet(attr, fSupAttrs, 2);
13900a8558cSPawel Dziepak }
14000a8558cSPawel Dziepak
14100a8558cSPawel Dziepak
14200a8558cSPawel Dziepak inline uint32
ExpireType()14300a8558cSPawel Dziepak FileSystem::ExpireType() const
14400a8558cSPawel Dziepak {
14500a8558cSPawel Dziepak return fExpireType;
14600a8558cSPawel Dziepak }
14700a8558cSPawel Dziepak
14800a8558cSPawel Dziepak
14900a8558cSPawel Dziepak inline RPC::Server*
Server()15000a8558cSPawel Dziepak FileSystem::Server()
15100a8558cSPawel Dziepak {
1521e67a2cdSPawel Dziepak ASSERT(fServer != NULL);
15300a8558cSPawel Dziepak return fServer;
15400a8558cSPawel Dziepak }
15500a8558cSPawel Dziepak
15600a8558cSPawel Dziepak
15700a8558cSPawel Dziepak inline NFS4Server*
NFSServer()15800a8558cSPawel Dziepak FileSystem::NFSServer()
15900a8558cSPawel Dziepak {
1601e67a2cdSPawel Dziepak ASSERT(fServer->PrivateData() != NULL);
16100a8558cSPawel Dziepak return reinterpret_cast<NFS4Server*>(fServer->PrivateData());
16200a8558cSPawel Dziepak }
16300a8558cSPawel Dziepak
16400a8558cSPawel Dziepak
165469f13fdSPawel Dziepak inline const char**
Path()16600a8558cSPawel Dziepak FileSystem::Path() const
16700a8558cSPawel Dziepak {
1681e67a2cdSPawel Dziepak ASSERT(fPath != NULL);
16900a8558cSPawel Dziepak return fPath;
17000a8558cSPawel Dziepak }
17100a8558cSPawel Dziepak
17200a8558cSPawel Dziepak
17300a8558cSPawel Dziepak inline const FileSystemId&
FsId()17400a8558cSPawel Dziepak FileSystem::FsId() const
17500a8558cSPawel Dziepak {
17600a8558cSPawel Dziepak return fFsId;
17700a8558cSPawel Dziepak }
17800a8558cSPawel Dziepak
17900a8558cSPawel Dziepak
18000a8558cSPawel Dziepak inline uint64
AllocFileId()18100a8558cSPawel Dziepak FileSystem::AllocFileId()
18200a8558cSPawel Dziepak {
18300a8558cSPawel Dziepak return atomic_add64(&fId, 1);
18400a8558cSPawel Dziepak }
18500a8558cSPawel Dziepak
18600a8558cSPawel Dziepak
18700a8558cSPawel Dziepak inline dev_t
DevId()18800a8558cSPawel Dziepak FileSystem::DevId() const
18900a8558cSPawel Dziepak {
19000a8558cSPawel Dziepak return fDevId;
19100a8558cSPawel Dziepak }
19200a8558cSPawel Dziepak
19300a8558cSPawel Dziepak
19400a8558cSPawel Dziepak inline InodeIdMap*
InoIdMap()19500a8558cSPawel Dziepak FileSystem::InoIdMap()
19600a8558cSPawel Dziepak {
19700a8558cSPawel Dziepak return &fInoIdMap;
19800a8558cSPawel Dziepak }
19900a8558cSPawel Dziepak
20000a8558cSPawel Dziepak
20199092223SPawel Dziepak inline uint64
OpenOwner()20299092223SPawel Dziepak FileSystem::OpenOwner() const
20399092223SPawel Dziepak {
20499092223SPawel Dziepak return fOpenOwner;
20599092223SPawel Dziepak }
20699092223SPawel Dziepak
20799092223SPawel Dziepak
20899092223SPawel Dziepak inline uint32
OpenOwnerSequenceLock()20999092223SPawel Dziepak FileSystem::OpenOwnerSequenceLock()
21099092223SPawel Dziepak {
21199092223SPawel Dziepak mutex_lock(&fOpenOwnerLock);
21299092223SPawel Dziepak return fOpenOwnerSequence;
21399092223SPawel Dziepak }
21499092223SPawel Dziepak
21599092223SPawel Dziepak
21699092223SPawel Dziepak inline void
OpenOwnerSequenceUnlock(uint32 sequence)217b6d5fa92SPawel Dziepak FileSystem::OpenOwnerSequenceUnlock(uint32 sequence)
21899092223SPawel Dziepak {
219b6d5fa92SPawel Dziepak fOpenOwnerSequence = sequence;
22099092223SPawel Dziepak mutex_unlock(&fOpenOwnerLock);
22199092223SPawel Dziepak }
22299092223SPawel Dziepak
22399092223SPawel Dziepak
224a5ae9b47SPawel Dziepak inline bool
NamedAttrs()225a5ae9b47SPawel Dziepak FileSystem::NamedAttrs()
226a5ae9b47SPawel Dziepak {
227a5ae9b47SPawel Dziepak return fNamedAttrs;
228a5ae9b47SPawel Dziepak }
229a5ae9b47SPawel Dziepak
230a5ae9b47SPawel Dziepak
231a5ae9b47SPawel Dziepak inline void
SetNamedAttrs(bool attrs)232a5ae9b47SPawel Dziepak FileSystem::SetNamedAttrs(bool attrs)
233a5ae9b47SPawel Dziepak {
234a5ae9b47SPawel Dziepak fNamedAttrs = attrs;
235a5ae9b47SPawel Dziepak }
236a5ae9b47SPawel Dziepak
237a5ae9b47SPawel Dziepak
238060a4636SPawel Dziepak inline const MountConfiguration&
GetConfiguration()239060a4636SPawel Dziepak FileSystem::GetConfiguration()
240060a4636SPawel Dziepak {
241060a4636SPawel Dziepak return fConfiguration;
242060a4636SPawel Dziepak }
243060a4636SPawel Dziepak
244060a4636SPawel Dziepak
245ce851e2bSPawel Dziepak inline mutex&
CreateFileLock()246ce851e2bSPawel Dziepak FileSystem::CreateFileLock()
247ce851e2bSPawel Dziepak {
248ce851e2bSPawel Dziepak return fCreateFileLock;
249ce851e2bSPawel Dziepak }
250ce851e2bSPawel Dziepak
251ce851e2bSPawel Dziepak
25200a8558cSPawel Dziepak #endif // FILESYSTEM_H
25300a8558cSPawel Dziepak
254