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