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