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