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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
typedef struct Super Super;
typedef struct Group Group;
typedef struct Inode Inode;
typedef struct Dirent Dirent;
typedef struct Ext2 Ext2;
enum
{
BYTESPERSEC = 512,
SBOFF = 1024,
SBSIZE = 1024,
SUPERMAGIC = 0xEF53,
MINBLOCKSIZE = 1024,
MAXBLOCKSIZE = 4096,
ROOTINODE = 2,
FIRSTINODE = 11,
VALIDFS = 0x0001,
ERRORFS = 0x0002,
NDIRBLOCKS = 12,
INDBLOCK = NDIRBLOCKS,
DINDBLOCK = INDBLOCK+1,
TINDBLOCK = DINDBLOCK+1,
NBLOCKS = TINDBLOCK+1,
NAMELEN = 255,
/* permissions in Inode.mode */
IEXEC = 00100,
IWRITE = 0200,
IREAD = 0400,
ISVTX = 01000,
ISGID = 02000,
ISUID = 04000,
/* type in Inode.mode */
IFMT = 0170000,
IFIFO = 0010000,
IFCHR = 0020000,
IFDIR = 0040000,
IFBLK = 0060000,
IFREG = 0100000,
IFLNK = 0120000,
IFSOCK = 0140000,
IFWHT = 0160000
};
#define DIRLEN(namlen) (((namlen)+8+3)&~3)
/*
* Super block
*/
struct Super
{
u32int ninode; /* Inodes count */
u32int nblock; /* Blocks count */
u32int rblockcount; /* Reserved blocks count */
u32int freeblockcount; /* Free blocks count */
u32int freeinodecount; /* Free inodes count */
u32int firstdatablock; /* First Data Block */
u32int logblocksize; /* Block size */
u32int logfragsize; /* Fragment size */
u32int blockspergroup; /* # Blocks per group */
u32int fragpergroup; /* # Fragments per group */
u32int inospergroup; /* # Inodes per group */
u32int mtime; /* Mount time */
u32int wtime; /* Write time */
u16int mntcount; /* Mount count */
u16int maxmntcount; /* Maximal mount count */
u16int magic; /* Magic signature */
u16int state; /* File system state */
u16int errors; /* Behaviour when detecting errors */
u16int pad;
u32int lastcheck; /* time of last check */
u32int checkinterval; /* max. time between checks */
u32int creatoros; /* OS */
u32int revlevel; /* Revision level */
u16int defresuid; /* Default uid for reserved blocks */
u16int defresgid; /* Default gid for reserved blocks */
/* the following are only available with revlevel = 1 */
u32int firstino; /* First non-reserved inode */
u16int inosize; /* size of inode structure */
u16int blockgroupnr; /* block group # of this super block */
u32int reserved[233]; /* Padding to the end of the block */
};
/*
* Block group
*/
struct Group
{
u32int bitblock; /* Blocks bitmap block */
u32int inodebitblock; /* Inodes bitmap block */
u32int inodeaddr; /* Inodes table block */
u16int freeblockscount; /* Free blocks count */
u16int freeinodescount; /* Free inodes count */
u16int useddirscount; /* Directories count */
};
enum
{
GroupSize = 32
};
/*
* Inode
*/
struct Inode
{
u16int mode; /* File mode */
u16int uid; /* Owner Uid */
u32int size; /* Size in bytes */
u32int atime; /* Access time */
u32int ctime; /* Creation time */
u32int mtime; /* Modification time */
u32int dtime; /* Deletion Time */
u16int gid; /* Group Id */
u16int nlink; /* Links count */
u32int nblock; /* Blocks count */
u32int flags; /* File flags */
u32int block[NBLOCKS];/* Pointers to blocks */
u32int version; /* File version (for NFS) */
u32int fileacl; /* File ACL */
u32int diracl; /* Directory ACL or high size bits */
u32int faddr; /* Fragment address */
};
/*
* Directory entry
*/
struct Dirent
{
u32int ino; /* Inode number */
u16int reclen; /* Directory entry length */
u8int namlen; /* Name length */
char *name; /* File name */
};
enum
{
MinDirentSize = 4+2+1+1
};
/*
* In-core fs info.
*/
struct Ext2
{
uint blocksize;
uint nblock;
uint ngroup;
uint inospergroup;
uint blockspergroup;
uint inosperblock;
uint inosize;
uint groupaddr;
uint descperblock;
uint firstblock;
Disk *disk;
Fsys *fsys;
};
|