xref: /haiku/src/add-ons/kernel/file_systems/xfs/Node.h (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright 2020, Shubham Bhagat, shubhambhagat111@yahoo.com
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 #ifndef _NODE_H_
6 #define _NODE_H_
7 
8 
9 #include "Directory.h"
10 #include "Extent.h"
11 #include "LeafDirectory.h"
12 
13 
14 #define XFS_DIR2_LEAFN_MAGIC (0xd2ff)
15 #define XFS_DIR3_LEAFN_MAGIC (0x3dff)
16 #define XFS_DA_NODE_MAGIC (0xfebe)
17 #define XFS_DA3_NODE_MAGIC (0x3ebe)
18 
19 
20 class NodeHeader
21 {
22 public:
23 			virtual						~NodeHeader()			=	0;
24 			virtual	uint16				Magic()					=	0;
25 			virtual	uint64				Blockno()				=	0;
26 			virtual	uint64				Lsn()					=	0;
27 			virtual	uint64				Owner()					=	0;
28 			virtual	const uuid_t&		Uuid()					=	0;
29 			virtual	uint16				Count()					=	0;
30 
31 			static	uint32				ExpectedMagic(int8 WhichDirectory,
32 										Inode* inode);
33 			static	uint32				CRCOffset();
34 			static	NodeHeader*			Create(Inode* inode, const char* buffer);
35 			static	uint32				Size(Inode* inode);
36 };
37 
38 
39 //xfs_da_node_hdr
40 class NodeHeaderV4 : public NodeHeader
41 {
42 public:
43 			struct OnDiskData {
44 			public:
45 				BlockInfo			info;
46 				uint16				count;
47 				uint16				level;
48 			};
49 
50 								NodeHeaderV4(const char* buffer);
51 								~NodeHeaderV4();
52 			void				SwapEndian();
53 			uint16				Magic();
54 			uint64				Blockno();
55 			uint64				Lsn();
56 			uint64				Owner();
57 			const uuid_t&		Uuid();
58 			uint16				Count();
59 
60 private:
61 			OnDiskData 			fData;
62 };
63 
64 
65 class NodeHeaderV5 : public NodeHeader {
66 public:
67 			struct OnDiskData {
68 			public:
69 				BlockInfoV5			info;
70 				uint16				count;
71 				uint16				level;
72 				uint32				pad32;
73 			};
74 
75 								NodeHeaderV5(const char* buffer);
76 								~NodeHeaderV5();
77 			void				SwapEndian();
78 			uint16				Magic();
79 			uint64				Blockno();
80 			uint64				Lsn();
81 			uint64				Owner();
82 			const uuid_t&		Uuid();
83 			uint16				Count();
84 
85 private:
86 			OnDiskData 			fData;
87 };
88 
89 
90 //xfs_da_node_entry
91 struct NodeEntry {
92 			uint32				hashval;
93 			uint32				before;
94 };
95 
96 
97 class NodeDirectory : public DirectoryIterator {
98 public:
99 								NodeDirectory(Inode* inode);
100 								~NodeDirectory();
101 			status_t			Init();
102 			bool				IsNodeType();
103 			void				FillMapEntry(int num, ExtentMapEntry* map);
104 			status_t			FillBuffer(int type, char* buffer,
105 									int howManyBlocksFurther);
106 			void				SearchAndFillDataMap(uint64 blockNo);
107 			status_t			FindHashInNode(uint32 hashVal, uint32* rightMapOffset);
108 			uint32				GetOffsetFromAddress(uint32 address);
109 			xfs_extnum_t		FirstLeafMapIndex();
110 			int					EntrySize(int len) const;
111 			status_t			GetNext(char* name, size_t* length,
112 									xfs_ino_t* ino);
113 			status_t			Lookup(const char* name, size_t length,
114 									xfs_ino_t* id);
115 private:
116 			Inode*				fInode;
117 			ExtentMapEntry*		fDataMap;
118 			ExtentMapEntry*		fLeafMap;
119 			uint32				fOffset;
120 			char*				fDataBuffer;
121 				// This isn't inode data. It holds the directory block.
122 			char*				fLeafBuffer;
123 			uint32				fCurBlockNumber;
124 			uint8				fCurLeafMapNumber;
125 			uint8				fCurLeafBufferNumber;
126 			xfs_extnum_t		fFirstLeafMapIndex;
127 };
128 
129 #endif
130