summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/FSKit/Ext2.h
blob: 81b6853ed85606530e65d46531f3530fd3e17af3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* -------------------------------------------

	Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.

------------------------------------------- */

#pragma once

#include <NewKit/Defines.h>

/// @file Ext2.h
/// @brief EXT2 filesystem structures and constants.

#define kExt2FSMagic              (0xEF53)
#define kExt2FSMaxFileNameLen     (255U)
#define kExt2FSSuperblockOffset   (1024)
#define kExt2FSRootInodeNumber    (2)

#define kExt2FSInodeSize          (128U)
#define kExt2FSBlockSizeBase      (1024U)

#define kExt2FSRev0               (0)
#define kExt2FSRev1               (1)

enum
{
	kExt2FileTypeUnknown = 0,
	kExt2FileTypeRegular = 1,
	kExt2FileTypeDirectory = 2,
	kExt2FileTypeCharDevice = 3,
	kExt2FileTypeBlockDevice = 4,
	kExt2FileTypeFIFO = 5,
	kExt2FileTypeSocket = 6,
	kExt2FileTypeSymbolicLink = 7
};

struct PACKED EXT2_SUPER_BLOCK final
{
	Kernel::UInt32 fInodeCount;
	Kernel::UInt32 fBlockCount;
	Kernel::UInt32 fReservedBlockCount;
	Kernel::UInt32 fFreeBlockCount;
	Kernel::UInt32 fFreeInodeCount;
	Kernel::UInt32 fFirstDataBlock;
	Kernel::UInt32 fLogBlockSize;
	Kernel::UInt32 fLogFragmentSize;
	Kernel::UInt32 fBlocksPerGroup;
	Kernel::UInt32 fFragmentsPerGroup;
	Kernel::UInt32 fInodesPerGroup;
	Kernel::UInt32 fMountTime;
	Kernel::UInt32 fWriteTime;
	Kernel::UInt16 fMountCount;
	Kernel::UInt16 fMaxMountCount;
	Kernel::UInt16 fMagic; // should be 0xEF53
	Kernel::UInt16 fState;
	Kernel::UInt16 fErrors;
	Kernel::UInt16 fMinorRevision;
	Kernel::UInt32 fLastCheck;
	Kernel::UInt32 fCheckInterval;
	Kernel::UInt32 fCreatorOS;
	Kernel::UInt32 fRevisionLevel;
	Kernel::UInt16 fDefaultUID;
	Kernel::UInt16 fDefaultGID;

	// EXT2_DYNAMIC_REV fields
	Kernel::UInt32 fFirstInode;
	Kernel::UInt16 fInodeSize;
	Kernel::UInt16 fBlockGroupNumber;
	Kernel::UInt32 fFeatureCompat;
	Kernel::UInt32 fFeatureIncompat;
	Kernel::UInt32 fFeatureROCompat;
	Kernel::UInt8  fUUID[16];
	Kernel::Char   fVolumeName[16];
	Kernel::Char   fLastMounted[64];
	Kernel::UInt32 fAlgoBitmap;

	// Optional journal fields and padding
	Kernel::UInt8  fPreallocBlocks;
	Kernel::UInt8  fPreallocDirBlocks;
	Kernel::UInt16 fReservedGDTBlocks;

	Kernel::UInt8  fJournalUUID[16];
	Kernel::UInt32 fJournalInode;
	Kernel::UInt32 fJournalDevice;
	Kernel::UInt32 fLastOrphan;

	Kernel::UInt32 fHashSeed[4];
	Kernel::UInt8  fDefHashVersion;
	Kernel::UInt8  fReservedCharPad;
	Kernel::UInt16 fReservedWordPad;
	Kernel::UInt32 fDefaultMountOpts;
	Kernel::UInt32 fFirstMetaBlockGroup;

	Kernel::UInt8  fReserved[760]; // Padding to make 1024 bytes
};

struct PACKED EXT2_INODE final
{
	Kernel::UInt16 fMode;
	Kernel::UInt16 fUID;
	Kernel::UInt32 fSize;
	Kernel::UInt32 fAccessTime;
	Kernel::UInt32 fCreateTime;
	Kernel::UInt32 fModifyTime;
	Kernel::UInt32 fDeleteTime;
	Kernel::UInt16 fGID;
	Kernel::UInt16 fLinksCount;
	Kernel::UInt32 fBlocks;
	Kernel::UInt32 fFlags;
	Kernel::UInt32 fOSD1;

	Kernel::UInt32 fBlock[15]; // 0-11: direct, 12: indirect, 13: double indirect, 14: triple indirect

	Kernel::UInt32 fGeneration;
	Kernel::UInt32 fFileACL;
	Kernel::UInt32 fDirACL;  // Only for revision 1+
	Kernel::UInt32 fFragmentAddr;

	Kernel::UInt8  fOSD2[12];
};

struct PACKED EXT2_DIR_ENTRY final
{
	Kernel::UInt32 fInode;
	Kernel::UInt16 fRecordLength;
	Kernel::UInt8  fNameLength;
	Kernel::UInt8  fFileType;
	Kernel::Char   fName[kExt2FSMaxFileNameLen]; // null-terminated, not fixed-length in actual on-disk layout
};