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