xref: /haiku/src/add-ons/kernel/file_systems/nfs4/Inode.h (revision b352cbf6ca8ed101ac83e0f87747b8be47dda1df)
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);
23e8c12d94SPawel Dziepak 	virtual						~Inode();
24bf31ee39SPawel Dziepak 
25bf31ee39SPawel Dziepak 	inline			ino_t		ID() const;
26d38e98d8SPawel Dziepak 	inline			mode_t		Type() const;
27e8c12d94SPawel Dziepak 	virtual			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 
40b1fd656dSPawel Dziepak 	inline			OpenState*	GetOpenState();
41b1fd656dSPawel Dziepak 
424a153753SPawel Dziepak 					void		SetDelegation(Delegation* delegation);
434a153753SPawel Dziepak 					void		RecallDelegation(bool truncate = false);
44cde3994eSPawel Dziepak 					void		RecallReadDelegation();
454a153753SPawel Dziepak 
460dbff361SPawel Dziepak 					status_t	LookUp(const char* name, ino_t* id);
470dbff361SPawel Dziepak 
480dbff361SPawel Dziepak 					status_t	Access(int mode);
4975fe7b90SPawel Dziepak 
5036577ed5SPawel Dziepak 					status_t	Commit();
51e2e5f06dSPawel Dziepak 					status_t	SyncAndCommit(bool force = false);
5236577ed5SPawel Dziepak 
530dbff361SPawel Dziepak 					status_t	CreateObject(const char* name, const char* path,
54*b352cbf6SPawel Dziepak 									int mode, FileType type, ino_t* id);
55f5baf2efSPawel Dziepak 
56f5baf2efSPawel Dziepak 					status_t	CreateLink(const char* name, const char* path,
57*b352cbf6SPawel Dziepak 									int mode, ino_t* id);
58f5baf2efSPawel Dziepak 
59c0de7acaSPawel Dziepak 					status_t	Link(Inode* dir, const char* name);
607c6cdb83SPawel Dziepak 					status_t	Remove(const char* name, FileType type,
61dee0fd83SPawel Dziepak 									ino_t* id = NULL);
621ec6b0c1SPawel Dziepak 	static			status_t	Rename(Inode* from, Inode* to,
6320d1b02eSPawel Dziepak 									const char* fromName, const char* toName,
64dee0fd83SPawel Dziepak 									bool attribute = false, ino_t* id = NULL);
65abba2fddSPawel Dziepak 
6620d1b02eSPawel Dziepak 					status_t	Stat(struct stat* st,
6720d1b02eSPawel Dziepak 									OpenAttrCookie* attr = NULL);
6820d1b02eSPawel Dziepak 					status_t	WriteStat(const struct stat* st, uint32 mask,
6920d1b02eSPawel Dziepak 									OpenAttrCookie* attr = NULL);
707bfa4fe8SPawel Dziepak 
7120bd3ee1SPawel Dziepak 					status_t	Create(const char* name, int mode, int perms,
722c36184fSPawel Dziepak 									OpenFileCookie* cookie,
732c36184fSPawel Dziepak 									OpenDelegationData* data, ino_t* id);
742a292557SPawel Dziepak 					status_t	Open(int mode, OpenFileCookie* cookie);
7560a8140dSPawel Dziepak 					status_t	Close(OpenFileCookie* cookie);
7620d1b02eSPawel Dziepak 
7720d1b02eSPawel Dziepak 					status_t	OpenAttr(const char* name,  int mode,
7820d1b02eSPawel Dziepak 									OpenAttrCookie* cookie, bool create,
7920d1b02eSPawel Dziepak 									int32 type = 0);
8020d1b02eSPawel Dziepak 					status_t	CloseAttr(OpenAttrCookie* cookie);
8120d1b02eSPawel Dziepak 
822f2e57d0SPawel Dziepak 					status_t	Read(OpenFileCookie* cookie, off_t pos,
83e743e243SPawel Dziepak 									void* buffer, size_t* length);
84e36a5442SPawel Dziepak 					status_t	Write(OpenFileCookie* cookie, off_t pos,
8586d2cab3SPawel Dziepak 									const void* buffer, size_t* _length);
862a292557SPawel Dziepak 
8720d1b02eSPawel Dziepak 					status_t	ReadDirect(OpenStateCookie* cookie, off_t pos,
88e743e243SPawel Dziepak 									void* buffer, size_t* length, bool* eof);
8920d1b02eSPawel Dziepak 					status_t	WriteDirect(OpenStateCookie* cookie, off_t pos,
90e743e243SPawel Dziepak 									const void* buffer, size_t* _length);
91e743e243SPawel Dziepak 
92*b352cbf6SPawel Dziepak 					status_t	CreateDir(const char* name, int mode,
93*b352cbf6SPawel Dziepak 									ino_t* id);
94be4c74eaSPawel Dziepak 					status_t	OpenDir(OpenDirCookie* cookie);
954b48348fSPawel Dziepak 					status_t	ReadDir(void* buffer, uint32 size,
96be4c74eaSPawel Dziepak 									uint32* count, OpenDirCookie* cookie);
97212de720SPawel Dziepak 
98f7c35cf4SPawel Dziepak 					status_t	OpenAttrDir(OpenDirCookie* cookie);
99f7c35cf4SPawel Dziepak 
1007d0b8c97SPawel Dziepak 					status_t	TestLock(OpenFileCookie* cookie,
1017d0b8c97SPawel Dziepak 									struct flock* lock);
1027d0b8c97SPawel Dziepak 					status_t	AcquireLock(OpenFileCookie* cookie,
1037d0b8c97SPawel Dziepak 									const struct flock* lock, bool wait);
1047d0b8c97SPawel Dziepak 					status_t	ReleaseLock(OpenFileCookie* cookie,
1057d0b8c97SPawel Dziepak 									const struct flock* lock);
1067d0b8c97SPawel Dziepak 					status_t	ReleaseAllLocks(OpenFileCookie* cookie);
1077d0b8c97SPawel Dziepak 
1083ae5e813SPawel Dziepak 					status_t	GetDirSnapshot(DirectoryCacheSnapshot**
1093ae5e813SPawel Dziepak 									_snapshot, OpenDirCookie* cookie,
1102314d073SPawel Dziepak 									uint64* _change, bool attribute);
1113ae5e813SPawel Dziepak 
11220d1b02eSPawel Dziepak 					status_t	LoadAttrDirHandle();
11320d1b02eSPawel Dziepak 
114376eef4aSPawel Dziepak 	static inline	ino_t		FileIdToInoT(uint64 fileid);
1152f03ff09SPawel Dziepak protected:
1160792abe0SPawel Dziepak 								Inode();
1170792abe0SPawel Dziepak 
11849935f9bSPawel Dziepak 					void		ReleaseOpenState();
11949935f9bSPawel Dziepak 
120eeabdab1SPawel Dziepak 					status_t	CreateState(const char* name, int mode,
1212c36184fSPawel Dziepak 									int perms, OpenState* state,
1222c36184fSPawel Dziepak 									OpenDelegationData* data);
123eeabdab1SPawel Dziepak 
124cde3994eSPawel Dziepak 					void		ReturnDelegation(bool truncate);
125cde3994eSPawel Dziepak 
1260dbff361SPawel Dziepak 					status_t	ReadDirUp(struct dirent* de, uint32 pos,
127ed517d6cSPawel Dziepak 									uint32 size);
1280dbff361SPawel Dziepak 					status_t	FillDirEntry(struct dirent* de, ino_t id,
1290dbff361SPawel Dziepak 									const char* name, uint32 pos, uint32 size);
1304b48348fSPawel Dziepak 
1310dbff361SPawel Dziepak 					status_t	ChildAdded(const char* name, uint64 fileID,
132df6a5eaeSPawel Dziepak 									const FileHandle& fileHandle);
133df6a5eaeSPawel Dziepak 
13420d1b02eSPawel Dziepak 					status_t	GetStat(struct stat* st,
13520d1b02eSPawel Dziepak 									OpenAttrCookie* attr = NULL);
13689f05134SPawel Dziepak 
137da950cb2SPawel Dziepak 					char*		AttrToFileName(const char* path);
138da950cb2SPawel Dziepak 
1390dbff361SPawel Dziepak 	static inline	status_t	CheckLockType(short ltype, uint32 mode);
1400dbff361SPawel Dziepak 
14152aaad17SPawel Dziepak private:
1420dbff361SPawel Dziepak 					uint32		fType;
1434b48348fSPawel Dziepak 
1447efb4c9bSPawel Dziepak 					MetadataCache	fMetaCache;
14575fe7b90SPawel Dziepak 					DirectoryCache*	fCache;
146f7c35cf4SPawel Dziepak 					DirectoryCache*	fAttrCache;
14713a90e37SPawel Dziepak 
14852aaad17SPawel Dziepak 					rw_lock		fDelegationLock;
14952aaad17SPawel Dziepak 					Delegation*	fDelegation;
15052aaad17SPawel Dziepak 
15113a90e37SPawel Dziepak 					uint64		fChange;
1520bc98afdSPawel Dziepak 					void*		fFileCache;
15313a90e37SPawel Dziepak 					mutex		fFileCacheLock;
154e743e243SPawel Dziepak 					uint64		fMaxFileSize;
155d4a75b9cSPawel Dziepak 
15652aaad17SPawel Dziepak 					OpenState*	fOpenState;
157eeabdab1SPawel Dziepak 					mutex		fStateLock;
158eeabdab1SPawel Dziepak 
159d4a75b9cSPawel Dziepak 					bool		fWriteDirty;
160bf31ee39SPawel Dziepak };
161bf31ee39SPawel Dziepak 
162bf31ee39SPawel Dziepak 
163bf31ee39SPawel Dziepak inline ino_t
1640dbff361SPawel Dziepak Inode::FileIdToInoT(uint64 fileid)
1654b48348fSPawel Dziepak {
1664b48348fSPawel Dziepak 	if (sizeof(ino_t) >= sizeof(uint64))
1674b48348fSPawel Dziepak 		return fileid;
1684b48348fSPawel Dziepak 	else
1694b48348fSPawel Dziepak 		return (ino_t)fileid ^ (fileid >>
1704b48348fSPawel Dziepak 					(sizeof(uint64) - sizeof(ino_t)) * 8);
1714b48348fSPawel Dziepak }
1724b48348fSPawel Dziepak 
1734b48348fSPawel Dziepak 
1744b48348fSPawel Dziepak inline ino_t
175bf31ee39SPawel Dziepak Inode::ID() const
176bf31ee39SPawel Dziepak {
1770dbff361SPawel Dziepak 	return FileIdToInoT(fInfo.fFileId);
178bf31ee39SPawel Dziepak }
179bf31ee39SPawel Dziepak 
180bf31ee39SPawel Dziepak 
181d38e98d8SPawel Dziepak inline mode_t
182d38e98d8SPawel Dziepak Inode::Type() const
183d38e98d8SPawel Dziepak {
184d38e98d8SPawel Dziepak 	return sNFSFileTypeToHaiku[fType];
185d38e98d8SPawel Dziepak }
186d38e98d8SPawel Dziepak 
187d38e98d8SPawel Dziepak 
18800a8558cSPawel Dziepak inline FileSystem*
18900a8558cSPawel Dziepak Inode::GetFileSystem() const
190be4c74eaSPawel Dziepak {
1911e67a2cdSPawel Dziepak 	ASSERT(fFileSystem != NULL);
19200a8558cSPawel Dziepak 	return fFileSystem;
193be4c74eaSPawel Dziepak }
194be4c74eaSPawel Dziepak 
195be4c74eaSPawel Dziepak 
1960bc98afdSPawel Dziepak inline void*
1970bc98afdSPawel Dziepak Inode::FileCache()
1980bc98afdSPawel Dziepak {
1990bc98afdSPawel Dziepak 	return fFileCache;
2000bc98afdSPawel Dziepak }
2010bc98afdSPawel Dziepak 
2020bc98afdSPawel Dziepak 
20352aaad17SPawel Dziepak inline void
20452aaad17SPawel Dziepak Inode::SetOpenState(OpenState* state)
20552aaad17SPawel Dziepak {
2061e67a2cdSPawel Dziepak 	ASSERT(state != NULL);
20752aaad17SPawel Dziepak 	MutexLocker _(fStateLock);
20852aaad17SPawel Dziepak 	fOpenState = state;
20952aaad17SPawel Dziepak }
21052aaad17SPawel Dziepak 
21152aaad17SPawel Dziepak 
212e743e243SPawel Dziepak inline uint64
213e743e243SPawel Dziepak Inode::MaxFileSize()
214e743e243SPawel Dziepak {
215e743e243SPawel Dziepak 	return fMaxFileSize;
216e743e243SPawel Dziepak }
217e743e243SPawel Dziepak 
218e743e243SPawel Dziepak 
219224d6022SPawel Dziepak inline uint64
220224d6022SPawel Dziepak Inode::Change()
221224d6022SPawel Dziepak {
222224d6022SPawel Dziepak 	return fChange;
223224d6022SPawel Dziepak }
224224d6022SPawel Dziepak 
225224d6022SPawel Dziepak 
226224d6022SPawel Dziepak inline bool
227224d6022SPawel Dziepak Inode::Dirty()
228224d6022SPawel Dziepak {
229224d6022SPawel Dziepak 	return fWriteDirty;
230224d6022SPawel Dziepak }
231224d6022SPawel Dziepak 
232224d6022SPawel Dziepak 
233b1fd656dSPawel Dziepak inline OpenState*
234b1fd656dSPawel Dziepak Inode::GetOpenState()
235b1fd656dSPawel Dziepak {
236b1fd656dSPawel Dziepak 	return fOpenState;
237b1fd656dSPawel Dziepak }
238b1fd656dSPawel Dziepak 
239b1fd656dSPawel Dziepak 
240bf31ee39SPawel Dziepak #endif	// INODE_H
241bf31ee39SPawel Dziepak 
242