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 374a153753SPawel Dziepak void SetDelegation(Delegation* delegation); 384a153753SPawel Dziepak void RecallDelegation(bool truncate = false); 39*cde3994eSPawel Dziepak void RecallReadDelegation(); 404a153753SPawel Dziepak 410dbff361SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 420dbff361SPawel Dziepak 430dbff361SPawel Dziepak status_t Access(int mode); 4475fe7b90SPawel Dziepak 4536577ed5SPawel Dziepak status_t Commit(); 46e2e5f06dSPawel Dziepak status_t SyncAndCommit(bool force = false); 4736577ed5SPawel Dziepak 480dbff361SPawel Dziepak status_t CreateObject(const char* name, const char* path, 490dbff361SPawel Dziepak int mode, FileType type); 50f5baf2efSPawel Dziepak 51f5baf2efSPawel Dziepak status_t CreateLink(const char* name, const char* path, 52f5baf2efSPawel Dziepak int mode); 53f5baf2efSPawel Dziepak 54c0de7acaSPawel Dziepak status_t Link(Inode* dir, const char* name); 55cf511f24SPawel Dziepak status_t Remove(const char* name, FileType type); 561ec6b0c1SPawel Dziepak static status_t Rename(Inode* from, Inode* to, 571ec6b0c1SPawel Dziepak const char* fromName, const char* toName); 58abba2fddSPawel Dziepak 59212de720SPawel Dziepak status_t Stat(struct stat* st); 60abba2fddSPawel Dziepak status_t WriteStat(const struct stat* st, uint32 mask); 617bfa4fe8SPawel Dziepak 6220bd3ee1SPawel Dziepak status_t Create(const char* name, int mode, int perms, 632c36184fSPawel Dziepak OpenFileCookie* cookie, 642c36184fSPawel Dziepak OpenDelegationData* data, ino_t* id); 652a292557SPawel Dziepak status_t Open(int mode, OpenFileCookie* cookie); 6660a8140dSPawel Dziepak status_t Close(OpenFileCookie* cookie); 672f2e57d0SPawel Dziepak status_t Read(OpenFileCookie* cookie, off_t pos, 68e743e243SPawel Dziepak void* buffer, size_t* length); 69e36a5442SPawel Dziepak status_t Write(OpenFileCookie* cookie, off_t pos, 7086d2cab3SPawel Dziepak const void* buffer, size_t *_length); 712a292557SPawel Dziepak 72e743e243SPawel Dziepak status_t ReadDirect(OpenFileCookie* cookie, off_t pos, 73e743e243SPawel Dziepak void* buffer, size_t* length, bool* eof); 74e743e243SPawel Dziepak status_t WriteDirect(OpenFileCookie* cookie, off_t pos, 75e743e243SPawel Dziepak const void* buffer, size_t *_length); 76e743e243SPawel Dziepak 7769adfb6dSPawel Dziepak status_t CreateDir(const char* name, int mode); 78be4c74eaSPawel Dziepak status_t OpenDir(OpenDirCookie* cookie); 794b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 80be4c74eaSPawel Dziepak uint32* count, OpenDirCookie* cookie); 81212de720SPawel Dziepak 827d0b8c97SPawel Dziepak status_t TestLock(OpenFileCookie* cookie, 837d0b8c97SPawel Dziepak struct flock* lock); 847d0b8c97SPawel Dziepak status_t AcquireLock(OpenFileCookie* cookie, 857d0b8c97SPawel Dziepak const struct flock* lock, bool wait); 867d0b8c97SPawel Dziepak status_t ReleaseLock(OpenFileCookie* cookie, 877d0b8c97SPawel Dziepak const struct flock* lock); 887d0b8c97SPawel Dziepak status_t ReleaseAllLocks(OpenFileCookie* cookie); 897d0b8c97SPawel Dziepak 902f03ff09SPawel Dziepak protected: 910792abe0SPawel Dziepak Inode(); 920792abe0SPawel Dziepak 93eeabdab1SPawel Dziepak status_t CreateState(const char* name, int mode, 942c36184fSPawel Dziepak int perms, OpenState* state, 952c36184fSPawel Dziepak OpenDelegationData* data); 96eeabdab1SPawel Dziepak 97*cde3994eSPawel Dziepak void ReturnDelegation(bool truncate); 98*cde3994eSPawel Dziepak 990dbff361SPawel Dziepak status_t ReadDirUp(struct dirent* de, uint32 pos, 100ed517d6cSPawel Dziepak uint32 size); 1010dbff361SPawel Dziepak status_t FillDirEntry(struct dirent* de, ino_t id, 1020dbff361SPawel Dziepak const char* name, uint32 pos, uint32 size); 1030dbff361SPawel Dziepak status_t GetDirSnapshot(DirectoryCacheSnapshot** 10409dbdd36SPawel Dziepak _snapshot, OpenDirCookie* cookie, 10509dbdd36SPawel Dziepak uint64* _change); 1064b48348fSPawel Dziepak 1070dbff361SPawel Dziepak status_t ChildAdded(const char* name, uint64 fileID, 108df6a5eaeSPawel Dziepak const FileHandle& fileHandle); 109df6a5eaeSPawel Dziepak 1107efb4c9bSPawel Dziepak status_t GetStat(struct stat* st); 11189f05134SPawel Dziepak 1120dbff361SPawel Dziepak static inline status_t CheckLockType(short ltype, uint32 mode); 1130dbff361SPawel Dziepak 1140dbff361SPawel Dziepak static inline ino_t FileIdToInoT(uint64 fileid); 1150dbff361SPawel Dziepak 11652aaad17SPawel Dziepak private: 1170dbff361SPawel Dziepak uint32 fType; 1184b48348fSPawel Dziepak 1197efb4c9bSPawel Dziepak MetadataCache fMetaCache; 12075fe7b90SPawel Dziepak DirectoryCache* fCache; 12113a90e37SPawel Dziepak 12252aaad17SPawel Dziepak rw_lock fDelegationLock; 12352aaad17SPawel Dziepak Delegation* fDelegation; 12452aaad17SPawel Dziepak 12513a90e37SPawel Dziepak uint64 fChange; 1260bc98afdSPawel Dziepak void* fFileCache; 12713a90e37SPawel Dziepak mutex fFileCacheLock; 128e743e243SPawel Dziepak uint64 fMaxFileSize; 129d4a75b9cSPawel Dziepak 13052aaad17SPawel Dziepak OpenState* fOpenState; 131eeabdab1SPawel Dziepak mutex fStateLock; 132eeabdab1SPawel Dziepak 133d4a75b9cSPawel Dziepak bool fWriteDirty; 134bf31ee39SPawel Dziepak }; 135bf31ee39SPawel Dziepak 136bf31ee39SPawel Dziepak 137bf31ee39SPawel Dziepak inline ino_t 1380dbff361SPawel Dziepak Inode::FileIdToInoT(uint64 fileid) 1394b48348fSPawel Dziepak { 1404b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 1414b48348fSPawel Dziepak return fileid; 1424b48348fSPawel Dziepak else 1434b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 1444b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 1454b48348fSPawel Dziepak } 1464b48348fSPawel Dziepak 1474b48348fSPawel Dziepak 1484b48348fSPawel Dziepak inline ino_t 149bf31ee39SPawel Dziepak Inode::ID() const 150bf31ee39SPawel Dziepak { 1510dbff361SPawel Dziepak return FileIdToInoT(fInfo.fFileId); 152bf31ee39SPawel Dziepak } 153bf31ee39SPawel Dziepak 154bf31ee39SPawel Dziepak 155d38e98d8SPawel Dziepak inline mode_t 156d38e98d8SPawel Dziepak Inode::Type() const 157d38e98d8SPawel Dziepak { 158d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 159d38e98d8SPawel Dziepak } 160d38e98d8SPawel Dziepak 161d38e98d8SPawel Dziepak 16296b7b14aSPawel Dziepak inline const char* 16396b7b14aSPawel Dziepak Inode::Name() const 16496b7b14aSPawel Dziepak { 165a28e8732SPawel Dziepak return fInfo.fName; 16696b7b14aSPawel Dziepak } 16796b7b14aSPawel Dziepak 16896b7b14aSPawel Dziepak 16900a8558cSPawel Dziepak inline FileSystem* 17000a8558cSPawel Dziepak Inode::GetFileSystem() const 171be4c74eaSPawel Dziepak { 17200a8558cSPawel Dziepak return fFileSystem; 173be4c74eaSPawel Dziepak } 174be4c74eaSPawel Dziepak 175be4c74eaSPawel Dziepak 1760bc98afdSPawel Dziepak inline void* 1770bc98afdSPawel Dziepak Inode::FileCache() 1780bc98afdSPawel Dziepak { 1790bc98afdSPawel Dziepak return fFileCache; 1800bc98afdSPawel Dziepak } 1810bc98afdSPawel Dziepak 1820bc98afdSPawel Dziepak 18352aaad17SPawel Dziepak inline void 18452aaad17SPawel Dziepak Inode::SetOpenState(OpenState* state) 18552aaad17SPawel Dziepak { 18652aaad17SPawel Dziepak MutexLocker _(fStateLock); 18752aaad17SPawel Dziepak fOpenState = state; 18852aaad17SPawel Dziepak } 18952aaad17SPawel Dziepak 19052aaad17SPawel Dziepak 191e743e243SPawel Dziepak inline uint64 192e743e243SPawel Dziepak Inode::MaxFileSize() 193e743e243SPawel Dziepak { 194e743e243SPawel Dziepak return fMaxFileSize; 195e743e243SPawel Dziepak } 196e743e243SPawel Dziepak 197e743e243SPawel Dziepak 198bf31ee39SPawel Dziepak #endif // INODE_H 199bf31ee39SPawel Dziepak 200