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); 394a153753SPawel Dziepak 400dbff361SPawel Dziepak status_t LookUp(const char* name, ino_t* id); 410dbff361SPawel Dziepak 420dbff361SPawel Dziepak status_t Access(int mode); 4375fe7b90SPawel Dziepak 4436577ed5SPawel Dziepak status_t Commit(); 45*e2e5f06dSPawel Dziepak status_t SyncAndCommit(bool force = false); 4636577ed5SPawel Dziepak 470dbff361SPawel Dziepak status_t CreateObject(const char* name, const char* path, 480dbff361SPawel Dziepak int mode, FileType type); 49f5baf2efSPawel Dziepak 50f5baf2efSPawel Dziepak status_t CreateLink(const char* name, const char* path, 51f5baf2efSPawel Dziepak int mode); 52f5baf2efSPawel Dziepak 53c0de7acaSPawel Dziepak status_t Link(Inode* dir, const char* name); 54cf511f24SPawel Dziepak status_t Remove(const char* name, FileType type); 551ec6b0c1SPawel Dziepak static status_t Rename(Inode* from, Inode* to, 561ec6b0c1SPawel Dziepak const char* fromName, const char* toName); 57abba2fddSPawel Dziepak 58212de720SPawel Dziepak status_t Stat(struct stat* st); 59abba2fddSPawel Dziepak status_t WriteStat(const struct stat* st, uint32 mask); 607bfa4fe8SPawel Dziepak 6120bd3ee1SPawel Dziepak status_t Create(const char* name, int mode, int perms, 6220bd3ee1SPawel Dziepak OpenFileCookie* cookie, ino_t* id); 632a292557SPawel Dziepak status_t Open(int mode, OpenFileCookie* cookie); 6460a8140dSPawel Dziepak status_t Close(OpenFileCookie* cookie); 652f2e57d0SPawel Dziepak status_t Read(OpenFileCookie* cookie, off_t pos, 66e743e243SPawel Dziepak void* buffer, size_t* length); 67e36a5442SPawel Dziepak status_t Write(OpenFileCookie* cookie, off_t pos, 6886d2cab3SPawel Dziepak const void* buffer, size_t *_length); 692a292557SPawel Dziepak 70e743e243SPawel Dziepak status_t ReadDirect(OpenFileCookie* cookie, off_t pos, 71e743e243SPawel Dziepak void* buffer, size_t* length, bool* eof); 72e743e243SPawel Dziepak status_t WriteDirect(OpenFileCookie* cookie, off_t pos, 73e743e243SPawel Dziepak const void* buffer, size_t *_length); 74e743e243SPawel Dziepak 7569adfb6dSPawel Dziepak status_t CreateDir(const char* name, int mode); 76be4c74eaSPawel Dziepak status_t OpenDir(OpenDirCookie* cookie); 774b48348fSPawel Dziepak status_t ReadDir(void* buffer, uint32 size, 78be4c74eaSPawel Dziepak uint32* count, OpenDirCookie* cookie); 79212de720SPawel Dziepak 807d0b8c97SPawel Dziepak status_t TestLock(OpenFileCookie* cookie, 817d0b8c97SPawel Dziepak struct flock* lock); 827d0b8c97SPawel Dziepak status_t AcquireLock(OpenFileCookie* cookie, 837d0b8c97SPawel Dziepak const struct flock* lock, bool wait); 847d0b8c97SPawel Dziepak status_t ReleaseLock(OpenFileCookie* cookie, 857d0b8c97SPawel Dziepak const struct flock* lock); 867d0b8c97SPawel Dziepak status_t ReleaseAllLocks(OpenFileCookie* cookie); 877d0b8c97SPawel Dziepak 882f03ff09SPawel Dziepak protected: 890792abe0SPawel Dziepak Inode(); 900792abe0SPawel Dziepak 91eeabdab1SPawel Dziepak status_t CreateState(const char* name, int mode, 92eeabdab1SPawel Dziepak int perms, OpenState* state); 93eeabdab1SPawel Dziepak 940dbff361SPawel Dziepak status_t ReadDirUp(struct dirent* de, uint32 pos, 95ed517d6cSPawel Dziepak uint32 size); 960dbff361SPawel Dziepak status_t FillDirEntry(struct dirent* de, ino_t id, 970dbff361SPawel Dziepak const char* name, uint32 pos, uint32 size); 980dbff361SPawel Dziepak status_t GetDirSnapshot(DirectoryCacheSnapshot** 9909dbdd36SPawel Dziepak _snapshot, OpenDirCookie* cookie, 10009dbdd36SPawel Dziepak uint64* _change); 1014b48348fSPawel Dziepak 1020dbff361SPawel Dziepak status_t ChildAdded(const char* name, uint64 fileID, 103df6a5eaeSPawel Dziepak const FileHandle& fileHandle); 104df6a5eaeSPawel Dziepak 1057efb4c9bSPawel Dziepak status_t GetStat(struct stat* st); 10689f05134SPawel Dziepak 1070dbff361SPawel Dziepak static inline status_t CheckLockType(short ltype, uint32 mode); 1080dbff361SPawel Dziepak 1090dbff361SPawel Dziepak static inline ino_t FileIdToInoT(uint64 fileid); 1100dbff361SPawel Dziepak 11152aaad17SPawel Dziepak private: 1120dbff361SPawel Dziepak uint32 fType; 1134b48348fSPawel Dziepak 1147efb4c9bSPawel Dziepak MetadataCache fMetaCache; 11575fe7b90SPawel Dziepak DirectoryCache* fCache; 11613a90e37SPawel Dziepak 11752aaad17SPawel Dziepak rw_lock fDelegationLock; 11852aaad17SPawel Dziepak Delegation* fDelegation; 11952aaad17SPawel Dziepak 12013a90e37SPawel Dziepak uint64 fChange; 1210bc98afdSPawel Dziepak void* fFileCache; 12213a90e37SPawel Dziepak mutex fFileCacheLock; 123e743e243SPawel Dziepak uint64 fMaxFileSize; 124d4a75b9cSPawel Dziepak 12552aaad17SPawel Dziepak OpenState* fOpenState; 126eeabdab1SPawel Dziepak mutex fStateLock; 127eeabdab1SPawel Dziepak 128d4a75b9cSPawel Dziepak bool fWriteDirty; 129bf31ee39SPawel Dziepak }; 130bf31ee39SPawel Dziepak 131bf31ee39SPawel Dziepak 132bf31ee39SPawel Dziepak inline ino_t 1330dbff361SPawel Dziepak Inode::FileIdToInoT(uint64 fileid) 1344b48348fSPawel Dziepak { 1354b48348fSPawel Dziepak if (sizeof(ino_t) >= sizeof(uint64)) 1364b48348fSPawel Dziepak return fileid; 1374b48348fSPawel Dziepak else 1384b48348fSPawel Dziepak return (ino_t)fileid ^ (fileid >> 1394b48348fSPawel Dziepak (sizeof(uint64) - sizeof(ino_t)) * 8); 1404b48348fSPawel Dziepak } 1414b48348fSPawel Dziepak 1424b48348fSPawel Dziepak 1434b48348fSPawel Dziepak inline ino_t 144bf31ee39SPawel Dziepak Inode::ID() const 145bf31ee39SPawel Dziepak { 1460dbff361SPawel Dziepak return FileIdToInoT(fInfo.fFileId); 147bf31ee39SPawel Dziepak } 148bf31ee39SPawel Dziepak 149bf31ee39SPawel Dziepak 150d38e98d8SPawel Dziepak inline mode_t 151d38e98d8SPawel Dziepak Inode::Type() const 152d38e98d8SPawel Dziepak { 153d38e98d8SPawel Dziepak return sNFSFileTypeToHaiku[fType]; 154d38e98d8SPawel Dziepak } 155d38e98d8SPawel Dziepak 156d38e98d8SPawel Dziepak 15796b7b14aSPawel Dziepak inline const char* 15896b7b14aSPawel Dziepak Inode::Name() const 15996b7b14aSPawel Dziepak { 160a28e8732SPawel Dziepak return fInfo.fName; 16196b7b14aSPawel Dziepak } 16296b7b14aSPawel Dziepak 16396b7b14aSPawel Dziepak 16400a8558cSPawel Dziepak inline FileSystem* 16500a8558cSPawel Dziepak Inode::GetFileSystem() const 166be4c74eaSPawel Dziepak { 16700a8558cSPawel Dziepak return fFileSystem; 168be4c74eaSPawel Dziepak } 169be4c74eaSPawel Dziepak 170be4c74eaSPawel Dziepak 1710bc98afdSPawel Dziepak inline void* 1720bc98afdSPawel Dziepak Inode::FileCache() 1730bc98afdSPawel Dziepak { 1740bc98afdSPawel Dziepak return fFileCache; 1750bc98afdSPawel Dziepak } 1760bc98afdSPawel Dziepak 1770bc98afdSPawel Dziepak 17852aaad17SPawel Dziepak inline void 17952aaad17SPawel Dziepak Inode::SetOpenState(OpenState* state) 18052aaad17SPawel Dziepak { 18152aaad17SPawel Dziepak MutexLocker _(fStateLock); 18252aaad17SPawel Dziepak fOpenState = state; 18352aaad17SPawel Dziepak } 18452aaad17SPawel Dziepak 18552aaad17SPawel Dziepak 186e743e243SPawel Dziepak inline uint64 187e743e243SPawel Dziepak Inode::MaxFileSize() 188e743e243SPawel Dziepak { 189e743e243SPawel Dziepak return fMaxFileSize; 190e743e243SPawel Dziepak } 191e743e243SPawel Dziepak 192e743e243SPawel Dziepak 193bf31ee39SPawel Dziepak #endif // INODE_H 194bf31ee39SPawel Dziepak 195