xref: /haiku/src/add-ons/kernel/file_systems/nfs4/FileInfo.h (revision 7c234361eb70458273aba20f16643d7514536f1c)
19b7f2d1bSPawel Dziepak /*
29b7f2d1bSPawel Dziepak  * Copyright 2012 Haiku, Inc. All rights reserved.
39b7f2d1bSPawel Dziepak  * Distributed under the terms of the MIT License.
49b7f2d1bSPawel Dziepak  *
59b7f2d1bSPawel Dziepak  * Authors:
69b7f2d1bSPawel Dziepak  *		Paweł Dziepak, pdziepak@quarnos.org
79b7f2d1bSPawel Dziepak  */
89b7f2d1bSPawel Dziepak #ifndef FILEINFO_H
99b7f2d1bSPawel Dziepak #define FILEINFO_H
109b7f2d1bSPawel Dziepak 
119b7f2d1bSPawel Dziepak 
129b7f2d1bSPawel Dziepak #include <stdlib.h>
139b7f2d1bSPawel Dziepak #include <string.h>
149b7f2d1bSPawel Dziepak 
15469f13fdSPawel Dziepak #include <lock.h>
169b7f2d1bSPawel Dziepak #include <SupportDefs.h>
17469f13fdSPawel Dziepak #include <util/KernelReferenceable.h>
189b7f2d1bSPawel Dziepak 
199b7f2d1bSPawel Dziepak 
209b7f2d1bSPawel Dziepak #define NFS4_FHSIZE	128
219b7f2d1bSPawel Dziepak 
2200a8558cSPawel Dziepak struct FileHandle {
239b7f2d1bSPawel Dziepak 			uint8		fSize;
2400a8558cSPawel Dziepak 			uint8		fData[NFS4_FHSIZE];
259b7f2d1bSPawel Dziepak 
2600a8558cSPawel Dziepak 	inline				FileHandle();
2700a8558cSPawel Dziepak 	inline				FileHandle(const FileHandle& fh);
2800a8558cSPawel Dziepak 	inline	FileHandle&	operator=(const FileHandle& fh);
294a153753SPawel Dziepak 
3020d1b02eSPawel Dziepak 
31469f13fdSPawel Dziepak 	inline	bool		operator==(const FileHandle& handle) const;
3220d1b02eSPawel Dziepak 	inline	bool		operator!=(const FileHandle& handle) const;
334a153753SPawel Dziepak 	inline	bool		operator>(const FileHandle& handle) const;
344a153753SPawel Dziepak 	inline	bool		operator<(const FileHandle& handle) const;
359b7f2d1bSPawel Dziepak };
369b7f2d1bSPawel Dziepak 
37*7c234361SAugustin Cavalier struct InodeNames;
38469f13fdSPawel Dziepak 
39469f13fdSPawel Dziepak struct InodeName : public SinglyLinkedListLinkImpl<InodeName> {
40469f13fdSPawel Dziepak 				InodeName(InodeNames* parent, const char* name);
41469f13fdSPawel Dziepak 				~InodeName();
42469f13fdSPawel Dziepak 
43469f13fdSPawel Dziepak 	InodeNames*	fParent;
44469f13fdSPawel Dziepak 	const char*	fName;
45469f13fdSPawel Dziepak };
46469f13fdSPawel Dziepak 
47469f13fdSPawel Dziepak struct InodeNames : public KernelReferenceable {
48469f13fdSPawel Dziepak 								InodeNames();
49469f13fdSPawel Dziepak 								~InodeNames();
50469f13fdSPawel Dziepak 
51469f13fdSPawel Dziepak 	status_t					AddName(InodeNames* parent, const char* name);
52469f13fdSPawel Dziepak 	bool						RemoveName(InodeNames* parent,
53469f13fdSPawel Dziepak 									const char* name);
54469f13fdSPawel Dziepak 
55469f13fdSPawel Dziepak 	mutex						fLock;
56469f13fdSPawel Dziepak 	SinglyLinkedList<InodeName>	fNames;
57469f13fdSPawel Dziepak 	FileHandle					fHandle;
58469f13fdSPawel Dziepak };
599b7f2d1bSPawel Dziepak 
6000a8558cSPawel Dziepak class FileSystem;
61209c46eeSPawel Dziepak class RequestBuilder;
629b7f2d1bSPawel Dziepak 
639b7f2d1bSPawel Dziepak // Complete information needed to identify a file in any situation.
6400a8558cSPawel Dziepak // Unfortunately just a FileHandle is not enough even when they are persistent
6500a8558cSPawel Dziepak // since OPEN requires both parent FileHandle and file name (just like LOOKUP).
669b7f2d1bSPawel Dziepak struct FileInfo {
679b7f2d1bSPawel Dziepak 			uint64		fFileId;
6800a8558cSPawel Dziepak 			FileHandle	fHandle;
699b7f2d1bSPawel Dziepak 
70469f13fdSPawel Dziepak 			InodeNames*	fNames;
719b7f2d1bSPawel Dziepak 
72f7c35cf4SPawel Dziepak 			FileHandle	fAttrDir;
73f7c35cf4SPawel Dziepak 
74469f13fdSPawel Dziepak 						FileInfo();
75469f13fdSPawel Dziepak 						~FileInfo();
76469f13fdSPawel Dziepak 						FileInfo(const FileInfo& fi);
77469f13fdSPawel Dziepak 			FileInfo&	operator=(const FileInfo& fi);
789b7f2d1bSPawel Dziepak 
7900a8558cSPawel Dziepak 			status_t	UpdateFileHandles(FileSystem* fs);
809b7f2d1bSPawel Dziepak };
819b7f2d1bSPawel Dziepak 
8200a8558cSPawel Dziepak struct FileSystemId {
839b7f2d1bSPawel Dziepak 			uint64		fMajor;
849b7f2d1bSPawel Dziepak 			uint64		fMinor;
859b7f2d1bSPawel Dziepak 
8600a8558cSPawel Dziepak 	inline	bool		operator==(const FileSystemId& fsid) const;
8700a8558cSPawel Dziepak 	inline	bool		operator!=(const FileSystemId& fsid) const;
889b7f2d1bSPawel Dziepak };
899b7f2d1bSPawel Dziepak 
909b7f2d1bSPawel Dziepak 
919b7f2d1bSPawel Dziepak inline
FileHandle()9200a8558cSPawel Dziepak FileHandle::FileHandle()
939b7f2d1bSPawel Dziepak 	:
949b7f2d1bSPawel Dziepak 	fSize(0)
959b7f2d1bSPawel Dziepak {
969b7f2d1bSPawel Dziepak }
979b7f2d1bSPawel Dziepak 
989b7f2d1bSPawel Dziepak 
999b7f2d1bSPawel Dziepak inline
FileHandle(const FileHandle & fh)10000a8558cSPawel Dziepak FileHandle::FileHandle(const FileHandle& fh)
1019b7f2d1bSPawel Dziepak 	:
1029b7f2d1bSPawel Dziepak 	fSize(fh.fSize)
1039b7f2d1bSPawel Dziepak {
10400a8558cSPawel Dziepak 	memcpy(fData, fh.fData, fSize);
1059b7f2d1bSPawel Dziepak }
1069b7f2d1bSPawel Dziepak 
1079b7f2d1bSPawel Dziepak 
10800a8558cSPawel Dziepak inline FileHandle&
10900a8558cSPawel Dziepak FileHandle::operator=(const FileHandle& fh)
1109b7f2d1bSPawel Dziepak {
1119b7f2d1bSPawel Dziepak 	fSize = fh.fSize;
11200a8558cSPawel Dziepak 	memcpy(fData, fh.fData, fSize);
1139b7f2d1bSPawel Dziepak 	return *this;
1149b7f2d1bSPawel Dziepak }
1159b7f2d1bSPawel Dziepak 
1169b7f2d1bSPawel Dziepak 
1174a153753SPawel Dziepak inline bool
118469f13fdSPawel Dziepak FileHandle::operator==(const FileHandle& handle) const
11920d1b02eSPawel Dziepak {
12020d1b02eSPawel Dziepak 	if (fSize != handle.fSize)
121469f13fdSPawel Dziepak 		return false;
122469f13fdSPawel Dziepak 	return memcmp(fData, handle.fData, fSize) == 0;
123469f13fdSPawel Dziepak }
124469f13fdSPawel Dziepak 
125469f13fdSPawel Dziepak 
126469f13fdSPawel Dziepak inline bool
127469f13fdSPawel Dziepak FileHandle::operator!=(const FileHandle& handle) const
128469f13fdSPawel Dziepak {
129469f13fdSPawel Dziepak 	return !operator==(handle);
13020d1b02eSPawel Dziepak }
13120d1b02eSPawel Dziepak 
13220d1b02eSPawel Dziepak 
13320d1b02eSPawel Dziepak inline bool
1344a153753SPawel Dziepak FileHandle::operator>(const FileHandle& handle) const
1354a153753SPawel Dziepak {
1364a153753SPawel Dziepak 	if (fSize > handle.fSize)
1374a153753SPawel Dziepak 		return true;
1384a153753SPawel Dziepak 	return memcmp(fData, handle.fData, fSize) > 0;
1394a153753SPawel Dziepak }
1404a153753SPawel Dziepak 
1414a153753SPawel Dziepak 
1424a153753SPawel Dziepak inline bool
1434a153753SPawel Dziepak FileHandle::operator<(const FileHandle& handle) const
1444a153753SPawel Dziepak {
1454a153753SPawel Dziepak 	if (fSize < handle.fSize)
1464a153753SPawel Dziepak 		return true;
1474a153753SPawel Dziepak 	return memcmp(fData, handle.fData, fSize) < 0;
1484a153753SPawel Dziepak }
1494a153753SPawel Dziepak 
1504a153753SPawel Dziepak 
1519b7f2d1bSPawel Dziepak inline bool
15200a8558cSPawel Dziepak FileSystemId::operator==(const FileSystemId& fsid) const
1539b7f2d1bSPawel Dziepak {
1549b7f2d1bSPawel Dziepak 	return fMajor == fsid.fMajor && fMinor == fsid.fMinor;
1559b7f2d1bSPawel Dziepak }
1569b7f2d1bSPawel Dziepak 
1579b7f2d1bSPawel Dziepak 
1589b7f2d1bSPawel Dziepak inline bool
15900a8558cSPawel Dziepak FileSystemId::operator!=(const FileSystemId& fsid) const
1609b7f2d1bSPawel Dziepak {
1619b7f2d1bSPawel Dziepak 	return !operator==(fsid);
1629b7f2d1bSPawel Dziepak }
1639b7f2d1bSPawel Dziepak 
1649b7f2d1bSPawel Dziepak 
1659b7f2d1bSPawel Dziepak #endif	// FILEHINFO_H
1669b7f2d1bSPawel Dziepak 
167