xref: /haiku/src/add-ons/kernel/file_systems/nfs4/Inode.h (revision 75fe7b90bbb751ea161dc6d4c81a3f8e694047b5)
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 
12212de720SPawel Dziepak #include <sys/stat.h>
13212de720SPawel Dziepak 
14bf31ee39SPawel Dziepak #include <SupportDefs.h>
15bf31ee39SPawel Dziepak 
16be4c74eaSPawel Dziepak #include "Cookie.h"
1700a8558cSPawel Dziepak #include "FileSystem.h"
18bf31ee39SPawel Dziepak #include "NFS4Defs.h"
194b48348fSPawel Dziepak #include "ReplyInterpreter.h"
20bf31ee39SPawel Dziepak 
21bf31ee39SPawel Dziepak 
22bf31ee39SPawel Dziepak class Inode {
23bf31ee39SPawel Dziepak public:
2400a8558cSPawel Dziepak 	static			status_t	CreateInode(FileSystem* fs, const FileInfo& fi,
250792abe0SPawel Dziepak 									Inode** inode);
2687c6b832SPawel Dziepak 								~Inode();
27bf31ee39SPawel Dziepak 
28bf31ee39SPawel Dziepak 	inline			ino_t		ID() const;
29d38e98d8SPawel Dziepak 	inline			mode_t		Type() const;
3096b7b14aSPawel Dziepak 	inline			const char*	Name() const;
3100a8558cSPawel Dziepak 	inline			FileSystem*	GetFileSystem() const;
32bf31ee39SPawel Dziepak 
33*75fe7b90SPawel Dziepak 					status_t	GetChangeInfo(uint64* change);
34*75fe7b90SPawel Dziepak 
357bfa4fe8SPawel Dziepak 					status_t	LookUp(const char* name, ino_t* id);
36f5baf2efSPawel Dziepak 
37f5baf2efSPawel Dziepak 					status_t	CreateLink(const char* name, const char* path,
38f5baf2efSPawel Dziepak 									int mode);
39f2da914dSPawel Dziepak 					status_t	ReadLink(void* buffer, size_t* length);
40f5baf2efSPawel Dziepak 
41c0de7acaSPawel Dziepak 					status_t	Link(Inode* dir, const char* name);
42cf511f24SPawel Dziepak 					status_t	Remove(const char* name, FileType type);
431ec6b0c1SPawel Dziepak 	static			status_t	Rename(Inode* from, Inode* to,
441ec6b0c1SPawel Dziepak 									const char* fromName, const char* toName);
45abba2fddSPawel Dziepak 
46631d9e98SPawel Dziepak 					status_t	Access(int mode);
47212de720SPawel Dziepak 					status_t	Stat(struct stat* st);
48abba2fddSPawel Dziepak 					status_t	WriteStat(const struct stat* st, uint32 mask);
497bfa4fe8SPawel Dziepak 
5020bd3ee1SPawel Dziepak 					status_t	Create(const char* name, int mode, int perms,
5120bd3ee1SPawel Dziepak 									OpenFileCookie* cookie, ino_t* id);
522a292557SPawel Dziepak 					status_t	Open(int mode, OpenFileCookie* cookie);
5360a8140dSPawel Dziepak 					status_t	Close(OpenFileCookie* cookie);
542f2e57d0SPawel Dziepak 					status_t	Read(OpenFileCookie* cookie, off_t pos,
552f2e57d0SPawel Dziepak 									void* buffer, size_t* length);
56e36a5442SPawel Dziepak 					status_t	Write(OpenFileCookie* cookie, off_t pos,
5786d2cab3SPawel Dziepak 									const void* buffer, size_t *_length);
582a292557SPawel Dziepak 
5969adfb6dSPawel Dziepak 					status_t	CreateDir(const char* name, int mode);
60be4c74eaSPawel Dziepak 					status_t	OpenDir(OpenDirCookie* cookie);
614b48348fSPawel Dziepak 					status_t	ReadDir(void* buffer, uint32 size,
62be4c74eaSPawel Dziepak 									uint32* count, OpenDirCookie* cookie);
63212de720SPawel Dziepak 
647d0b8c97SPawel Dziepak 					status_t	TestLock(OpenFileCookie* cookie,
657d0b8c97SPawel Dziepak 									struct flock* lock);
667d0b8c97SPawel Dziepak 					status_t	AcquireLock(OpenFileCookie* cookie,
677d0b8c97SPawel Dziepak 									const struct flock* lock, bool wait);
687d0b8c97SPawel Dziepak 					status_t	ReleaseLock(OpenFileCookie* cookie,
697d0b8c97SPawel Dziepak 									const struct flock* lock);
707d0b8c97SPawel Dziepak 					status_t	ReleaseAllLocks(OpenFileCookie* cookie);
717d0b8c97SPawel Dziepak 
727d0b8c97SPawel Dziepak 
732f03ff09SPawel Dziepak protected:
740792abe0SPawel Dziepak 								Inode();
750792abe0SPawel Dziepak 
7607f2e2d2SPawel Dziepak 					bool		_HandleErrors(uint32 nfs4Error,
7707f2e2d2SPawel Dziepak 									RPC::Server* serv,
7807f2e2d2SPawel Dziepak 									OpenFileCookie* cookie = NULL);
79c702f887SPawel Dziepak 
8000a8558cSPawel Dziepak 					status_t	_ConfirmOpen(const FileHandle& fh,
810f4dcd8bSPawel Dziepak 									OpenFileCookie* cookie);
822a73e4c5SPawel Dziepak 
834b48348fSPawel Dziepak 					status_t	_ReadDirOnce(DirEntry** dirents, uint32* count,
84be4c74eaSPawel Dziepak 									OpenDirCookie* cookie, bool* eof);
854b48348fSPawel Dziepak 					status_t	_FillDirEntry(struct dirent* de, ino_t id,
864b48348fSPawel Dziepak 									const char* name, uint32 pos, uint32 size);
87ed517d6cSPawel Dziepak 					status_t	_ReadDirUp(struct dirent* de, uint32 pos,
88ed517d6cSPawel Dziepak 									uint32 size);
894b48348fSPawel Dziepak 
9089f05134SPawel Dziepak 	static inline	status_t	_CheckLockType(short ltype, uint32 mode);
9189f05134SPawel Dziepak 
924b48348fSPawel Dziepak 	static inline	ino_t		_FileIdToInoT(uint64 fileid);
934b48348fSPawel Dziepak 
9478fc85a6SPawel Dziepak 					struct stat	fAttrCache;
9578fc85a6SPawel Dziepak 					mutex		fAttrCacheLock;
9678fc85a6SPawel Dziepak 					time_t		fAttrCacheExpire;
9778fc85a6SPawel Dziepak 	static const	time_t		kAttrCacheExpirationTime	= 60;
9878fc85a6SPawel Dziepak 					status_t	_UpdateAttrCache(bool force = false);
9978fc85a6SPawel Dziepak 
100d38e98d8SPawel Dziepak 					uint32		fType;
101bf31ee39SPawel Dziepak 
102a28e8732SPawel Dziepak 					FileInfo	fInfo;
10300a8558cSPawel Dziepak 					FileSystem*	fFileSystem;
104*75fe7b90SPawel Dziepak 
105*75fe7b90SPawel Dziepak 					DirectoryCache*	fCache;
106bf31ee39SPawel Dziepak };
107bf31ee39SPawel Dziepak 
108bf31ee39SPawel Dziepak 
109bf31ee39SPawel Dziepak inline ino_t
1104b48348fSPawel Dziepak Inode::_FileIdToInoT(uint64 fileid)
1114b48348fSPawel Dziepak {
1124b48348fSPawel Dziepak 	if (sizeof(ino_t) >= sizeof(uint64))
1134b48348fSPawel Dziepak 		return fileid;
1144b48348fSPawel Dziepak 	else
1154b48348fSPawel Dziepak 		return (ino_t)fileid ^ (fileid >>
1164b48348fSPawel Dziepak 					(sizeof(uint64) - sizeof(ino_t)) * 8);
1174b48348fSPawel Dziepak }
1184b48348fSPawel Dziepak 
1194b48348fSPawel Dziepak 
1204b48348fSPawel Dziepak inline ino_t
121bf31ee39SPawel Dziepak Inode::ID() const
122bf31ee39SPawel Dziepak {
123a28e8732SPawel Dziepak 	return _FileIdToInoT(fInfo.fFileId);
124bf31ee39SPawel Dziepak }
125bf31ee39SPawel Dziepak 
126bf31ee39SPawel Dziepak 
127d38e98d8SPawel Dziepak inline mode_t
128d38e98d8SPawel Dziepak Inode::Type() const
129d38e98d8SPawel Dziepak {
130d38e98d8SPawel Dziepak 	return sNFSFileTypeToHaiku[fType];
131d38e98d8SPawel Dziepak }
132d38e98d8SPawel Dziepak 
133d38e98d8SPawel Dziepak 
13496b7b14aSPawel Dziepak inline const char*
13596b7b14aSPawel Dziepak Inode::Name() const
13696b7b14aSPawel Dziepak {
137a28e8732SPawel Dziepak 	return fInfo.fName;
13896b7b14aSPawel Dziepak }
13996b7b14aSPawel Dziepak 
14096b7b14aSPawel Dziepak 
14100a8558cSPawel Dziepak inline FileSystem*
14200a8558cSPawel Dziepak Inode::GetFileSystem() const
143be4c74eaSPawel Dziepak {
14400a8558cSPawel Dziepak 	return fFileSystem;
145be4c74eaSPawel Dziepak }
146be4c74eaSPawel Dziepak 
147be4c74eaSPawel Dziepak 
148bf31ee39SPawel Dziepak #endif	// INODE_H
149bf31ee39SPawel Dziepak 
150