xref: /haiku/src/add-ons/kernel/file_systems/nfs4/Inode.h (revision 2314d073afc14b7a0e5a1eb27925658b9f2cc212)
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