1bf31ee39SPawel Dziepak /* 2bf31ee39SPawel Dziepak * Copyright 2012 Haiku, Inc. All rights reserved. 3bf31ee39SPawel Dziepak * Distributed under the terms of the MIT License. 4bf31ee39SPawel Dziepak * 5bf31ee39SPawel Dziepak * Authors: 6bf31ee39SPawel Dziepak * Paweł Dziepak, pdziepak@quarnos.org 7bf31ee39SPawel Dziepak */ 8bf31ee39SPawel Dziepak #ifndef INODE_H 9bf31ee39SPawel Dziepak #define INODE_H 10bf31ee39SPawel Dziepak 11bf31ee39SPawel Dziepak 127efb4c9bSPawel Dziepak #include "MetadataCache.h" 130dbff361SPawel Dziepak #include "NFS4Inode.h" 14eeabdab1SPawel Dziepak #include "OpenState.h" 15bf31ee39SPawel Dziepak 16bf31ee39SPawel Dziepak 1752aaad17SPawel Dziepak class Delegation; 1852aaad17SPawel Dziepak 190dbff361SPawel Dziepak class Inode : public NFS4Inode { 20bf31ee39SPawel Dziepak public: 2100a8558cSPawel Dziepak static status_t CreateInode(FileSystem* fs, const FileInfo& fi, 220792abe0SPawel Dziepak Inode** inode); 2387c6b832SPawel Dziepak ~Inode(); 24bf31ee39SPawel Dziepak 25bf31ee39SPawel Dziepak inline ino_t ID() const; 26d38e98d8SPawel Dziepak inline mode_t Type() const; 2796b7b14aSPawel Dziepak inline const char* Name() const; 2800a8558cSPawel Dziepak inline FileSystem* GetFileSystem() const; 29bf31ee39SPawel Dziepak 3052aaad17SPawel Dziepak inline void SetOpenState(OpenState* state); 3152aaad17SPawel Dziepak 320bc98afdSPawel Dziepak inline void* FileCache(); 3313a90e37SPawel Dziepak status_t RevalidateFileCache(); 3413a90e37SPawel Dziepak 35e743e243SPawel Dziepak inline uint64 MaxFileSize(); 36e743e243SPawel Dziepak 37224d6022SPawel Dziepak inline uint64 Change(); 38224d6022SPawel Dziepak inline bool Dirty(); 39224d6022SPawel Dziepak 404a153753SPawel Dziepak void SetDelegation(Delegation* delegation); 414a153753SPawel Dziepak void RecallDelegation(bool truncate = false); 42cde3994eSPawel Dziepak void RecallReadDelegation(); 434a153753SPawel Dziepak 440dbff361SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 450dbff361SPawel Dziepak 460dbff361SPawel Dziepak status_t Access(int mode); 4775fe7b90SPawel Dziepak 4836577ed5SPawel Dziepak status_t Commit(); 49e2e5f06dSPawel Dziepak status_t SyncAndCommit(bool force = false); 5036577ed5SPawel Dziepak 510dbff361SPawel Dziepak status_t CreateObject(const char* name, const char* path, 520dbff361SPawel Dziepak int mode, FileType type); 53f5baf2efSPawel Dziepak 54f5baf2efSPawel Dziepak status_t CreateLink(const char* name, const char* path, 55f5baf2efSPawel Dziepak int mode); 56f5baf2efSPawel Dziepak 57c0de7acaSPawel Dziepak status_t Link(Inode* dir, const char* name); 58cf511f24SPawel Dziepak status_t Remove(const char* name, FileType type); 591ec6b0c1SPawel Dziepak static status_t Rename(Inode* from, Inode* to, 601ec6b0c1SPawel Dziepak const char* fromName, const char* toName); 61abba2fddSPawel Dziepak 62212de720SPawel Dziepak status_t Stat(struct stat* st); 63abba2fddSPawel Dziepak status_t WriteStat(const struct stat* st, uint32 mask); 647bfa4fe8SPawel Dziepak 6520bd3ee1SPawel Dziepak status_t Create(const char* name, int mode, int perms, 662c36184fSPawel Dziepak OpenFileCookie* cookie, 672c36184fSPawel Dziepak OpenDelegationData* data, ino_t* id); 682a292557SPawel Dziepak status_t Open(int mode, OpenFileCookie* cookie); 6960a8140dSPawel Dziepak status_t Close(OpenFileCookie* cookie); 702f2e57d0SPawel Dziepak status_t Read(OpenFileCookie* cookie, off_t pos, 71e743e243SPawel Dziepak void* buffer, size_t* length); 72e36a5442SPawel Dziepak status_t Write(OpenFileCookie* cookie, off_t pos, 7386d2cab3SPawel Dziepak const void* buffer, size_t *_length); 742a292557SPawel Dziepak 75e743e243SPawel Dziepak status_t ReadDirect(OpenFileCookie* cookie, off_t pos, 76e743e243SPawel Dziepak void* buffer, size_t* length, bool* eof); 77e743e243SPawel Dziepak status_t WriteDirect(OpenFileCookie* cookie, off_t pos, 78e743e243SPawel Dziepak const void* buffer, size_t *_length); 79e743e243SPawel Dziepak 8069adfb6dSPawel Dziepak status_t CreateDir(const char* name, int mode); 81be4c74eaSPawel Dziepak status_t OpenDir(OpenDirCookie* cookie); 824b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 83be4c74eaSPawel Dziepak uint32* count, OpenDirCookie* cookie); 84212de720SPawel Dziepak 85f7c35cf4SPawel Dziepak status_t OpenAttrDir(OpenDirCookie* cookie); 86f7c35cf4SPawel Dziepak 877d0b8c97SPawel Dziepak status_t TestLock(OpenFileCookie* cookie, 887d0b8c97SPawel Dziepak struct flock* lock); 897d0b8c97SPawel Dziepak status_t AcquireLock(OpenFileCookie* cookie, 907d0b8c97SPawel Dziepak const struct flock* lock, bool wait); 917d0b8c97SPawel Dziepak status_t ReleaseLock(OpenFileCookie* cookie, 927d0b8c97SPawel Dziepak const struct flock* lock); 937d0b8c97SPawel Dziepak status_t ReleaseAllLocks(OpenFileCookie* cookie); 947d0b8c97SPawel Dziepak 953ae5e813SPawel Dziepak status_t GetDirSnapshot(DirectoryCacheSnapshot** 963ae5e813SPawel Dziepak _snapshot, OpenDirCookie* cookie, 97*2314d073SPawel Dziepak uint64* _change, bool attribute); 983ae5e813SPawel Dziepak 992f03ff09SPawel Dziepak protected: 1000792abe0SPawel Dziepak Inode(); 1010792abe0SPawel Dziepak 10249935f9bSPawel Dziepak void ReleaseOpenState(); 10349935f9bSPawel Dziepak 104eeabdab1SPawel Dziepak status_t CreateState(const char* name, int mode, 1052c36184fSPawel Dziepak int perms, OpenState* state, 1062c36184fSPawel Dziepak OpenDelegationData* data); 107eeabdab1SPawel Dziepak 108cde3994eSPawel Dziepak void ReturnDelegation(bool truncate); 109cde3994eSPawel Dziepak 1100dbff361SPawel Dziepak status_t ReadDirUp(struct dirent* de, uint32 pos, 111ed517d6cSPawel Dziepak uint32 size); 1120dbff361SPawel Dziepak status_t FillDirEntry(struct dirent* de, ino_t id, 1130dbff361SPawel Dziepak const char* name, uint32 pos, uint32 size); 1144b48348fSPawel Dziepak 1150dbff361SPawel Dziepak status_t ChildAdded(const char* name, uint64 fileID, 116df6a5eaeSPawel Dziepak const FileHandle& fileHandle); 117df6a5eaeSPawel Dziepak 1187efb4c9bSPawel Dziepak status_t GetStat(struct stat* st); 11989f05134SPawel Dziepak 1200dbff361SPawel Dziepak static inline status_t CheckLockType(short ltype, uint32 mode); 1210dbff361SPawel Dziepak 1220dbff361SPawel Dziepak static inline ino_t FileIdToInoT(uint64 fileid); 1230dbff361SPawel Dziepak 12452aaad17SPawel Dziepak private: 1250dbff361SPawel Dziepak uint32 fType; 1264b48348fSPawel Dziepak 1277efb4c9bSPawel Dziepak MetadataCache fMetaCache; 12875fe7b90SPawel Dziepak DirectoryCache* fCache; 129f7c35cf4SPawel Dziepak DirectoryCache* fAttrCache; 13013a90e37SPawel Dziepak 13152aaad17SPawel Dziepak rw_lock fDelegationLock; 13252aaad17SPawel Dziepak Delegation* fDelegation; 13352aaad17SPawel Dziepak 13413a90e37SPawel Dziepak uint64 fChange; 1350bc98afdSPawel Dziepak void* fFileCache; 13613a90e37SPawel Dziepak mutex fFileCacheLock; 137e743e243SPawel Dziepak uint64 fMaxFileSize; 138d4a75b9cSPawel Dziepak 13952aaad17SPawel Dziepak OpenState* fOpenState; 140eeabdab1SPawel Dziepak mutex fStateLock; 141eeabdab1SPawel Dziepak 142d4a75b9cSPawel Dziepak bool fWriteDirty; 143bf31ee39SPawel Dziepak }; 144bf31ee39SPawel Dziepak 145bf31ee39SPawel Dziepak 146bf31ee39SPawel Dziepak inline ino_t 1470dbff361SPawel Dziepak Inode::FileIdToInoT(uint64 fileid) 1484b48348fSPawel Dziepak { 1494b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 1504b48348fSPawel Dziepak return fileid; 1514b48348fSPawel Dziepak else 1524b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 1534b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 1544b48348fSPawel Dziepak } 1554b48348fSPawel Dziepak 1564b48348fSPawel Dziepak 1574b48348fSPawel Dziepak inline ino_t 158bf31ee39SPawel Dziepak Inode::ID() const 159bf31ee39SPawel Dziepak { 1600dbff361SPawel Dziepak return FileIdToInoT(fInfo.fFileId); 161bf31ee39SPawel Dziepak } 162bf31ee39SPawel Dziepak 163bf31ee39SPawel Dziepak 164d38e98d8SPawel Dziepak inline mode_t 165d38e98d8SPawel Dziepak Inode::Type() const 166d38e98d8SPawel Dziepak { 167d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 168d38e98d8SPawel Dziepak } 169d38e98d8SPawel Dziepak 170d38e98d8SPawel Dziepak 17196b7b14aSPawel Dziepak inline const char* 17296b7b14aSPawel Dziepak Inode::Name() const 17396b7b14aSPawel Dziepak { 174a28e8732SPawel Dziepak return fInfo.fName; 17596b7b14aSPawel Dziepak } 17696b7b14aSPawel Dziepak 17796b7b14aSPawel Dziepak 17800a8558cSPawel Dziepak inline FileSystem* 17900a8558cSPawel Dziepak Inode::GetFileSystem() const 180be4c74eaSPawel Dziepak { 18100a8558cSPawel Dziepak return fFileSystem; 182be4c74eaSPawel Dziepak } 183be4c74eaSPawel Dziepak 184be4c74eaSPawel Dziepak 1850bc98afdSPawel Dziepak inline void* 1860bc98afdSPawel Dziepak Inode::FileCache() 1870bc98afdSPawel Dziepak { 1880bc98afdSPawel Dziepak return fFileCache; 1890bc98afdSPawel Dziepak } 1900bc98afdSPawel Dziepak 1910bc98afdSPawel Dziepak 19252aaad17SPawel Dziepak inline void 19352aaad17SPawel Dziepak Inode::SetOpenState(OpenState* state) 19452aaad17SPawel Dziepak { 19552aaad17SPawel Dziepak MutexLocker _(fStateLock); 19652aaad17SPawel Dziepak fOpenState = state; 19752aaad17SPawel Dziepak } 19852aaad17SPawel Dziepak 19952aaad17SPawel Dziepak 200e743e243SPawel Dziepak inline uint64 201e743e243SPawel Dziepak Inode::MaxFileSize() 202e743e243SPawel Dziepak { 203e743e243SPawel Dziepak return fMaxFileSize; 204e743e243SPawel Dziepak } 205e743e243SPawel Dziepak 206e743e243SPawel Dziepak 207224d6022SPawel Dziepak inline uint64 208224d6022SPawel Dziepak Inode::Change() 209224d6022SPawel Dziepak { 210224d6022SPawel Dziepak return fChange; 211224d6022SPawel Dziepak } 212224d6022SPawel Dziepak 213224d6022SPawel Dziepak 214224d6022SPawel Dziepak inline bool 215224d6022SPawel Dziepak Inode::Dirty() 216224d6022SPawel Dziepak { 217224d6022SPawel Dziepak return fWriteDirty; 218224d6022SPawel Dziepak } 219224d6022SPawel Dziepak 220224d6022SPawel Dziepak 221bf31ee39SPawel Dziepak #endif // INODE_H 222bf31ee39SPawel Dziepak 223