xref: /haiku/src/add-ons/kernel/file_systems/nfs4/FileSystem.h (revision bfa20379a3d5756dda6f3ebab0dcf52b6f4ca749)
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 
33*bfa20379SPawel Dziepak 			OpenState*			OpenFilesLock();
3400a8558cSPawel Dziepak 			void				OpenFilesUnlock();
3500a8558cSPawel Dziepak 	inline	uint32				OpenFilesCount();
36*bfa20379SPawel Dziepak 			void				AddOpenFile(OpenState* state);
37*bfa20379SPawel Dziepak 			void				RemoveOpenFile(OpenState* state);
3800a8558cSPawel Dziepak 
394a153753SPawel Dziepak 			void				AddDelegation(Delegation* delegation);
404a153753SPawel Dziepak 			void				RemoveDelegation(Delegation* delegation);
414a153753SPawel Dziepak 			Delegation*			GetDelegation(const FileHandle& handle);
424a153753SPawel Dziepak 
4375fe7b90SPawel Dziepak 	inline	CacheRevalidator&	Revalidator();
4475fe7b90SPawel Dziepak 
4500a8558cSPawel Dziepak 	inline	bool				IsAttrSupported(Attribute attr) const;
4600a8558cSPawel Dziepak 	inline	uint32				ExpireType() const;
4700a8558cSPawel Dziepak 
4800a8558cSPawel Dziepak 	inline	RPC::Server*		Server();
4900a8558cSPawel Dziepak 	inline	NFS4Server*			NFSServer();
5000a8558cSPawel Dziepak 
5100a8558cSPawel Dziepak 	inline	const char*			Path() const;
5200a8558cSPawel Dziepak 	inline	const FileSystemId&	FsId() const;
5300a8558cSPawel Dziepak 
5400a8558cSPawel Dziepak 	inline	uint64				AllocFileId();
5500a8558cSPawel Dziepak 
5600a8558cSPawel Dziepak 	inline	dev_t				DevId() const;
5700a8558cSPawel Dziepak 	inline	InodeIdMap*			InoIdMap();
5800a8558cSPawel Dziepak 
5999092223SPawel Dziepak 	inline	uint64				OpenOwner() const;
6099092223SPawel Dziepak 	inline	uint32				OpenOwnerSequenceLock();
6199092223SPawel Dziepak 	inline	void				OpenOwnerSequenceUnlock(bool increment = true);
6299092223SPawel Dziepak 
6300a8558cSPawel Dziepak 			FileSystem*			fNext;
6400a8558cSPawel Dziepak 			FileSystem*			fPrev;
6500a8558cSPawel Dziepak private:
6600a8558cSPawel Dziepak 								FileSystem();
6700a8558cSPawel Dziepak 
6875fe7b90SPawel Dziepak 			CacheRevalidator	fCacheRevalidator;
6975fe7b90SPawel Dziepak 
704a153753SPawel Dziepak 			mutex				fDelegationLock;
714a153753SPawel Dziepak 			AVLTreeMap<FileHandle, Delegation*> fHandleToDelegation;
724a153753SPawel Dziepak 
73*bfa20379SPawel Dziepak 			OpenState*			fOpenFiles;
7400a8558cSPawel Dziepak 			uint32				fOpenCount;
7500a8558cSPawel Dziepak 			mutex				fOpenLock;
7600a8558cSPawel Dziepak 
7799092223SPawel Dziepak 			uint64				fOpenOwner;
7899092223SPawel Dziepak 			uint32				fOpenOwnerSequence;
7999092223SPawel Dziepak 			mutex				fOpenOwnerLock;
8099092223SPawel Dziepak 
8100a8558cSPawel Dziepak 			uint32				fExpireType;
8200a8558cSPawel Dziepak 			uint32				fSupAttrs[2];
8300a8558cSPawel Dziepak 
8400a8558cSPawel Dziepak 			FileSystemId		fFsId;
8500a8558cSPawel Dziepak 			const char*			fPath;
8600a8558cSPawel Dziepak 
8700a8558cSPawel Dziepak 			RootInode*			fRoot;
8800a8558cSPawel Dziepak 
8900a8558cSPawel Dziepak 			RPC::Server*		fServer;
9000a8558cSPawel Dziepak 
9100a8558cSPawel Dziepak 			vint64				fId;
9200a8558cSPawel Dziepak 			dev_t				fDevId;
9300a8558cSPawel Dziepak 
9400a8558cSPawel Dziepak 			InodeIdMap			fInoIdMap;
9500a8558cSPawel Dziepak };
9600a8558cSPawel Dziepak 
9700a8558cSPawel Dziepak 
9875fe7b90SPawel Dziepak inline CacheRevalidator&
9975fe7b90SPawel Dziepak FileSystem::Revalidator()
10075fe7b90SPawel Dziepak {
10175fe7b90SPawel Dziepak 	return fCacheRevalidator;
10275fe7b90SPawel Dziepak }
10375fe7b90SPawel Dziepak 
10475fe7b90SPawel Dziepak 
10578fc85a6SPawel Dziepak inline RootInode*
10600a8558cSPawel Dziepak FileSystem::Root()
10700a8558cSPawel Dziepak {
10878fc85a6SPawel Dziepak 	return fRoot;
10900a8558cSPawel Dziepak }
11000a8558cSPawel Dziepak 
11100a8558cSPawel Dziepak 
11200a8558cSPawel Dziepak inline uint32
11300a8558cSPawel Dziepak FileSystem::OpenFilesCount()
11400a8558cSPawel Dziepak {
11500a8558cSPawel Dziepak 	return fOpenCount;
11600a8558cSPawel Dziepak }
11700a8558cSPawel Dziepak 
11800a8558cSPawel Dziepak 
11900a8558cSPawel Dziepak inline bool
12000a8558cSPawel Dziepak FileSystem::IsAttrSupported(Attribute attr) const
12100a8558cSPawel Dziepak {
12200a8558cSPawel Dziepak 	return sIsAttrSet(attr, fSupAttrs, 2);
12300a8558cSPawel Dziepak }
12400a8558cSPawel Dziepak 
12500a8558cSPawel Dziepak 
12600a8558cSPawel Dziepak inline uint32
12700a8558cSPawel Dziepak FileSystem::ExpireType() const
12800a8558cSPawel Dziepak {
12900a8558cSPawel Dziepak 	return fExpireType;
13000a8558cSPawel Dziepak }
13100a8558cSPawel Dziepak 
13200a8558cSPawel Dziepak 
13300a8558cSPawel Dziepak inline RPC::Server*
13400a8558cSPawel Dziepak FileSystem::Server()
13500a8558cSPawel Dziepak {
13600a8558cSPawel Dziepak 	return fServer;
13700a8558cSPawel Dziepak }
13800a8558cSPawel Dziepak 
13900a8558cSPawel Dziepak 
14000a8558cSPawel Dziepak inline NFS4Server*
14100a8558cSPawel Dziepak FileSystem::NFSServer()
14200a8558cSPawel Dziepak {
14300a8558cSPawel Dziepak 	return reinterpret_cast<NFS4Server*>(fServer->PrivateData());
14400a8558cSPawel Dziepak }
14500a8558cSPawel Dziepak 
14600a8558cSPawel Dziepak 
14700a8558cSPawel Dziepak inline const char*
14800a8558cSPawel Dziepak FileSystem::Path() const
14900a8558cSPawel Dziepak {
15000a8558cSPawel Dziepak 	return fPath;
15100a8558cSPawel Dziepak }
15200a8558cSPawel Dziepak 
15300a8558cSPawel Dziepak 
15400a8558cSPawel Dziepak inline const FileSystemId&
15500a8558cSPawel Dziepak FileSystem::FsId() const
15600a8558cSPawel Dziepak {
15700a8558cSPawel Dziepak 	return fFsId;
15800a8558cSPawel Dziepak }
15900a8558cSPawel Dziepak 
16000a8558cSPawel Dziepak 
16100a8558cSPawel Dziepak inline uint64
16200a8558cSPawel Dziepak FileSystem::AllocFileId()
16300a8558cSPawel Dziepak {
16400a8558cSPawel Dziepak 	return atomic_add64(&fId, 1);
16500a8558cSPawel Dziepak }
16600a8558cSPawel Dziepak 
16700a8558cSPawel Dziepak 
16800a8558cSPawel Dziepak inline dev_t
16900a8558cSPawel Dziepak FileSystem::DevId() const
17000a8558cSPawel Dziepak {
17100a8558cSPawel Dziepak 	return fDevId;
17200a8558cSPawel Dziepak }
17300a8558cSPawel Dziepak 
17400a8558cSPawel Dziepak 
17500a8558cSPawel Dziepak inline InodeIdMap*
17600a8558cSPawel Dziepak FileSystem::InoIdMap()
17700a8558cSPawel Dziepak {
17800a8558cSPawel Dziepak 	return &fInoIdMap;
17900a8558cSPawel Dziepak }
18000a8558cSPawel Dziepak 
18100a8558cSPawel Dziepak 
18299092223SPawel Dziepak inline uint64
18399092223SPawel Dziepak FileSystem::OpenOwner() const
18499092223SPawel Dziepak {
18599092223SPawel Dziepak 	return fOpenOwner;
18699092223SPawel Dziepak }
18799092223SPawel Dziepak 
18899092223SPawel Dziepak 
18999092223SPawel Dziepak inline uint32
19099092223SPawel Dziepak FileSystem::OpenOwnerSequenceLock()
19199092223SPawel Dziepak {
19299092223SPawel Dziepak 	mutex_lock(&fOpenOwnerLock);
19399092223SPawel Dziepak 	return fOpenOwnerSequence;
19499092223SPawel Dziepak }
19599092223SPawel Dziepak 
19699092223SPawel Dziepak 
19799092223SPawel Dziepak inline void
19899092223SPawel Dziepak FileSystem::OpenOwnerSequenceUnlock(bool increment = true)
19999092223SPawel Dziepak {
20099092223SPawel Dziepak 	if (increment)
20199092223SPawel Dziepak 		fOpenOwnerSequence++;
20299092223SPawel Dziepak 	mutex_unlock(&fOpenOwnerLock);
20399092223SPawel Dziepak }
20499092223SPawel Dziepak 
20599092223SPawel Dziepak 
20600a8558cSPawel Dziepak #endif	// FILESYSTEM_H
20700a8558cSPawel Dziepak 
208