xref: /haiku/src/add-ons/kernel/file_systems/nfs4/FileSystem.h (revision b6d5fa9204f9e7e12f557544770d7040382664e1)
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 
1275fe7b90SPawel Dziepak #include "CacheRevalidator.h"
134a153753SPawel Dziepak #include "Delegation.h"
1400a8558cSPawel Dziepak #include "InodeIdMap.h"
1500a8558cSPawel Dziepak #include "NFS4Defs.h"
1600a8558cSPawel Dziepak #include "NFS4Server.h"
1700a8558cSPawel Dziepak 
1800a8558cSPawel Dziepak 
1900a8558cSPawel Dziepak class Inode;
2000a8558cSPawel Dziepak class RootInode;
2100a8558cSPawel Dziepak 
2200a8558cSPawel Dziepak class FileSystem {
2300a8558cSPawel Dziepak public:
2400a8558cSPawel Dziepak 	static	status_t			Mount(FileSystem** pfs, RPC::Server* serv,
2500a8558cSPawel Dziepak 									const char* path, dev_t id);
2600a8558cSPawel Dziepak 								~FileSystem();
2700a8558cSPawel Dziepak 
2800a8558cSPawel Dziepak 			status_t			GetInode(ino_t id, Inode** inode);
2978fc85a6SPawel Dziepak 	inline	RootInode*			Root();
3000a8558cSPawel Dziepak 
3100a8558cSPawel Dziepak 			status_t			Migrate(const RPC::Server* serv);
3200a8558cSPawel Dziepak 
33b1fd656dSPawel Dziepak 			DoublyLinkedList<OpenState>&	OpenFilesLock();
3400a8558cSPawel Dziepak 			void				OpenFilesUnlock();
3500a8558cSPawel Dziepak 	inline	uint32				OpenFilesCount();
36bfa20379SPawel Dziepak 			void				AddOpenFile(OpenState* state);
37bfa20379SPawel Dziepak 			void				RemoveOpenFile(OpenState* state);
3800a8558cSPawel Dziepak 
390dff48c7SPawel Dziepak 			DoublyLinkedList<Delegation>&	DelegationsLock();
400dff48c7SPawel Dziepak 			void				DelegationsUnlock();
414a153753SPawel Dziepak 			void				AddDelegation(Delegation* delegation);
424a153753SPawel Dziepak 			void				RemoveDelegation(Delegation* delegation);
434a153753SPawel Dziepak 			Delegation*			GetDelegation(const FileHandle& handle);
444a153753SPawel Dziepak 
4575fe7b90SPawel Dziepak 	inline	CacheRevalidator&	Revalidator();
4675fe7b90SPawel Dziepak 
4700a8558cSPawel Dziepak 	inline	bool				IsAttrSupported(Attribute attr) const;
4800a8558cSPawel Dziepak 	inline	uint32				ExpireType() const;
4900a8558cSPawel Dziepak 
5000a8558cSPawel Dziepak 	inline	RPC::Server*		Server();
5100a8558cSPawel Dziepak 	inline	NFS4Server*			NFSServer();
5200a8558cSPawel Dziepak 
5300a8558cSPawel Dziepak 	inline	const char*			Path() const;
5400a8558cSPawel Dziepak 	inline	const FileSystemId&	FsId() const;
5500a8558cSPawel Dziepak 
5600a8558cSPawel Dziepak 	inline	uint64				AllocFileId();
5700a8558cSPawel Dziepak 
5800a8558cSPawel Dziepak 	inline	dev_t				DevId() const;
5900a8558cSPawel Dziepak 	inline	InodeIdMap*			InoIdMap();
6000a8558cSPawel Dziepak 
6199092223SPawel Dziepak 	inline	uint64				OpenOwner() const;
6299092223SPawel Dziepak 	inline	uint32				OpenOwnerSequenceLock();
63*b6d5fa92SPawel Dziepak 	inline	void				OpenOwnerSequenceUnlock(uint32 sequence);
6499092223SPawel Dziepak 
6500a8558cSPawel Dziepak 			FileSystem*			fNext;
6600a8558cSPawel Dziepak 			FileSystem*			fPrev;
6700a8558cSPawel Dziepak private:
6800a8558cSPawel Dziepak 								FileSystem();
6900a8558cSPawel Dziepak 
7075fe7b90SPawel Dziepak 			CacheRevalidator	fCacheRevalidator;
7175fe7b90SPawel Dziepak 
724a153753SPawel Dziepak 			mutex				fDelegationLock;
730dff48c7SPawel Dziepak 			DoublyLinkedList<Delegation>	fDelegationList;
744a153753SPawel Dziepak 			AVLTreeMap<FileHandle, Delegation*> fHandleToDelegation;
754a153753SPawel Dziepak 
76b1fd656dSPawel Dziepak 			DoublyLinkedList<OpenState>		fOpenFiles;
7700a8558cSPawel Dziepak 			uint32				fOpenCount;
7800a8558cSPawel Dziepak 			mutex				fOpenLock;
7900a8558cSPawel Dziepak 
8099092223SPawel Dziepak 			uint64				fOpenOwner;
8199092223SPawel Dziepak 			uint32				fOpenOwnerSequence;
8299092223SPawel Dziepak 			mutex				fOpenOwnerLock;
8399092223SPawel Dziepak 
8400a8558cSPawel Dziepak 			uint32				fExpireType;
8500a8558cSPawel Dziepak 			uint32				fSupAttrs[2];
8600a8558cSPawel Dziepak 
8700a8558cSPawel Dziepak 			FileSystemId		fFsId;
8800a8558cSPawel Dziepak 			const char*			fPath;
8900a8558cSPawel Dziepak 
9000a8558cSPawel Dziepak 			RootInode*			fRoot;
9100a8558cSPawel Dziepak 
9200a8558cSPawel Dziepak 			RPC::Server*		fServer;
9300a8558cSPawel Dziepak 
9400a8558cSPawel Dziepak 			vint64				fId;
9500a8558cSPawel Dziepak 			dev_t				fDevId;
9600a8558cSPawel Dziepak 
9700a8558cSPawel Dziepak 			InodeIdMap			fInoIdMap;
9800a8558cSPawel Dziepak };
9900a8558cSPawel Dziepak 
10000a8558cSPawel Dziepak 
10175fe7b90SPawel Dziepak inline CacheRevalidator&
10275fe7b90SPawel Dziepak FileSystem::Revalidator()
10375fe7b90SPawel Dziepak {
10475fe7b90SPawel Dziepak 	return fCacheRevalidator;
10575fe7b90SPawel Dziepak }
10675fe7b90SPawel Dziepak 
10775fe7b90SPawel Dziepak 
10878fc85a6SPawel Dziepak inline RootInode*
10900a8558cSPawel Dziepak FileSystem::Root()
11000a8558cSPawel Dziepak {
11178fc85a6SPawel Dziepak 	return fRoot;
11200a8558cSPawel Dziepak }
11300a8558cSPawel Dziepak 
11400a8558cSPawel Dziepak 
11500a8558cSPawel Dziepak inline uint32
11600a8558cSPawel Dziepak FileSystem::OpenFilesCount()
11700a8558cSPawel Dziepak {
11800a8558cSPawel Dziepak 	return fOpenCount;
11900a8558cSPawel Dziepak }
12000a8558cSPawel Dziepak 
12100a8558cSPawel Dziepak 
12200a8558cSPawel Dziepak inline bool
12300a8558cSPawel Dziepak FileSystem::IsAttrSupported(Attribute attr) const
12400a8558cSPawel Dziepak {
12500a8558cSPawel Dziepak 	return sIsAttrSet(attr, fSupAttrs, 2);
12600a8558cSPawel Dziepak }
12700a8558cSPawel Dziepak 
12800a8558cSPawel Dziepak 
12900a8558cSPawel Dziepak inline uint32
13000a8558cSPawel Dziepak FileSystem::ExpireType() const
13100a8558cSPawel Dziepak {
13200a8558cSPawel Dziepak 	return fExpireType;
13300a8558cSPawel Dziepak }
13400a8558cSPawel Dziepak 
13500a8558cSPawel Dziepak 
13600a8558cSPawel Dziepak inline RPC::Server*
13700a8558cSPawel Dziepak FileSystem::Server()
13800a8558cSPawel Dziepak {
13900a8558cSPawel Dziepak 	return fServer;
14000a8558cSPawel Dziepak }
14100a8558cSPawel Dziepak 
14200a8558cSPawel Dziepak 
14300a8558cSPawel Dziepak inline NFS4Server*
14400a8558cSPawel Dziepak FileSystem::NFSServer()
14500a8558cSPawel Dziepak {
14600a8558cSPawel Dziepak 	return reinterpret_cast<NFS4Server*>(fServer->PrivateData());
14700a8558cSPawel Dziepak }
14800a8558cSPawel Dziepak 
14900a8558cSPawel Dziepak 
15000a8558cSPawel Dziepak inline const char*
15100a8558cSPawel Dziepak FileSystem::Path() const
15200a8558cSPawel Dziepak {
15300a8558cSPawel Dziepak 	return fPath;
15400a8558cSPawel Dziepak }
15500a8558cSPawel Dziepak 
15600a8558cSPawel Dziepak 
15700a8558cSPawel Dziepak inline const FileSystemId&
15800a8558cSPawel Dziepak FileSystem::FsId() const
15900a8558cSPawel Dziepak {
16000a8558cSPawel Dziepak 	return fFsId;
16100a8558cSPawel Dziepak }
16200a8558cSPawel Dziepak 
16300a8558cSPawel Dziepak 
16400a8558cSPawel Dziepak inline uint64
16500a8558cSPawel Dziepak FileSystem::AllocFileId()
16600a8558cSPawel Dziepak {
16700a8558cSPawel Dziepak 	return atomic_add64(&fId, 1);
16800a8558cSPawel Dziepak }
16900a8558cSPawel Dziepak 
17000a8558cSPawel Dziepak 
17100a8558cSPawel Dziepak inline dev_t
17200a8558cSPawel Dziepak FileSystem::DevId() const
17300a8558cSPawel Dziepak {
17400a8558cSPawel Dziepak 	return fDevId;
17500a8558cSPawel Dziepak }
17600a8558cSPawel Dziepak 
17700a8558cSPawel Dziepak 
17800a8558cSPawel Dziepak inline InodeIdMap*
17900a8558cSPawel Dziepak FileSystem::InoIdMap()
18000a8558cSPawel Dziepak {
18100a8558cSPawel Dziepak 	return &fInoIdMap;
18200a8558cSPawel Dziepak }
18300a8558cSPawel Dziepak 
18400a8558cSPawel Dziepak 
18599092223SPawel Dziepak inline uint64
18699092223SPawel Dziepak FileSystem::OpenOwner() const
18799092223SPawel Dziepak {
18899092223SPawel Dziepak 	return fOpenOwner;
18999092223SPawel Dziepak }
19099092223SPawel Dziepak 
19199092223SPawel Dziepak 
19299092223SPawel Dziepak inline uint32
19399092223SPawel Dziepak FileSystem::OpenOwnerSequenceLock()
19499092223SPawel Dziepak {
19599092223SPawel Dziepak 	mutex_lock(&fOpenOwnerLock);
19699092223SPawel Dziepak 	return fOpenOwnerSequence;
19799092223SPawel Dziepak }
19899092223SPawel Dziepak 
19999092223SPawel Dziepak 
20099092223SPawel Dziepak inline void
201*b6d5fa92SPawel Dziepak FileSystem::OpenOwnerSequenceUnlock(uint32 sequence)
20299092223SPawel Dziepak {
203*b6d5fa92SPawel Dziepak 	fOpenOwnerSequence = sequence;
20499092223SPawel Dziepak 	mutex_unlock(&fOpenOwnerLock);
20599092223SPawel Dziepak }
20699092223SPawel Dziepak 
20799092223SPawel Dziepak 
20800a8558cSPawel Dziepak #endif	// FILESYSTEM_H
20900a8558cSPawel Dziepak 
210