xref: /haiku/src/add-ons/kernel/file_systems/nfs4/FileSystem.h (revision b18b18ac3ea404c98961626cccc62d5b3d814a7b)
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