Blame


1 0c98da8b 2005-07-13 devnull /*
2 0c98da8b 2005-07-13 devnull * An FFS file system is a sequence of cylinder groups.
3 0c98da8b 2005-07-13 devnull *
4 0c98da8b 2005-07-13 devnull * Each cylinder group is laid out as follows:
5 0c98da8b 2005-07-13 devnull *
6 0c98da8b 2005-07-13 devnull * fs superblock (Fsblk)
7 0c98da8b 2005-07-13 devnull * cylinder group block (Cgblk)
8 0c98da8b 2005-07-13 devnull * inodes
9 0c98da8b 2005-07-13 devnull * data
10 0c98da8b 2005-07-13 devnull *
11 0c98da8b 2005-07-13 devnull * The location of the fs superblock in the first cylinder
12 0c98da8b 2005-07-13 devnull * group is known. The rest of the info about cylinder group
13 0c98da8b 2005-07-13 devnull * layout can be derived from the super block.
14 0c98da8b 2005-07-13 devnull */
15 0c98da8b 2005-07-13 devnull
16 0c98da8b 2005-07-13 devnull #define daddr_t u32int
17 0c98da8b 2005-07-13 devnull #define time_t u32int
18 0c98da8b 2005-07-13 devnull
19 0c98da8b 2005-07-13 devnull typedef struct Cgblk Cgblk;
20 0c98da8b 2005-07-13 devnull typedef struct Cylgrp Cylgrp;
21 0c98da8b 2005-07-13 devnull typedef struct Cylsum Cylsum;
22 e060bc52 2005-08-11 devnull typedef struct Cylsumtotal Cylsumtotal;
23 0c98da8b 2005-07-13 devnull typedef struct Ffs Ffs;
24 0c98da8b 2005-07-13 devnull typedef struct Fsblk Fsblk;
25 e060bc52 2005-08-11 devnull typedef struct Inode1 Inode1;
26 0c98da8b 2005-07-13 devnull typedef struct Inode Inode;
27 0c98da8b 2005-07-13 devnull typedef struct Dirent Dirent;
28 0c98da8b 2005-07-13 devnull
29 0c98da8b 2005-07-13 devnull enum
30 0c98da8b 2005-07-13 devnull {
31 0c98da8b 2005-07-13 devnull BYTESPERSEC = 512,
32 0c98da8b 2005-07-13 devnull
33 0c98da8b 2005-07-13 devnull /* constants for Fsblk */
34 0c98da8b 2005-07-13 devnull FSMAXMNTLEN = 512,
35 e060bc52 2005-08-11 devnull FSMAXMNTLEN2 = 468,
36 e060bc52 2005-08-11 devnull FSMAXVOLLEN = 32, /* UFS2 */
37 e060bc52 2005-08-11 devnull FSNOCSPTRSLEN = 128-12,
38 e060bc52 2005-08-11 devnull FSNOCSPTRSLEN2 = 128-16, /* UFS2 */
39 0c98da8b 2005-07-13 devnull FSMAXSNAP = 20,
40 0c98da8b 2005-07-13 devnull FSMAGIC = 0x011954,
41 e060bc52 2005-08-11 devnull FSMAGIC2 = 0x19540119,
42 0c98da8b 2005-07-13 devnull FSCHECKSUM = 0x7c269d38,
43 0c98da8b 2005-07-13 devnull
44 0c98da8b 2005-07-13 devnull /* Fsblk.inodefmt */
45 0c98da8b 2005-07-13 devnull FS42INODEFMT = -1,
46 0c98da8b 2005-07-13 devnull FS44INODEFMT = 2,
47 0c98da8b 2005-07-13 devnull
48 0c98da8b 2005-07-13 devnull /* offset and size of first boot block */
49 0c98da8b 2005-07-13 devnull BBOFF = 0,
50 0c98da8b 2005-07-13 devnull BBSIZE = 8192,
51 0c98da8b 2005-07-13 devnull
52 0c98da8b 2005-07-13 devnull /* offset and size of first super block */
53 0c98da8b 2005-07-13 devnull SBOFF = BBOFF+BBSIZE,
54 e060bc52 2005-08-11 devnull SBOFF2 = BBOFF+65536, /* UFS2 */
55 e060bc52 2005-08-11 devnull SBOFFPIGGY = BBOFF+262144, /* UFS2 */
56 0c98da8b 2005-07-13 devnull SBSIZE = 8192,
57 0c98da8b 2005-07-13 devnull
58 0c98da8b 2005-07-13 devnull /* minimum block size */
59 0c98da8b 2005-07-13 devnull MINBSIZE = 4096,
60 0c98da8b 2005-07-13 devnull
61 0c98da8b 2005-07-13 devnull /* maximum fragments per block */
62 0c98da8b 2005-07-13 devnull MAXFRAG = 8,
63 0c98da8b 2005-07-13 devnull
64 0c98da8b 2005-07-13 devnull /* constants for Cgblk */
65 0c98da8b 2005-07-13 devnull CGMAGIC = 0x090255,
66 0c98da8b 2005-07-13 devnull
67 0c98da8b 2005-07-13 devnull /* inode-related */
68 0c98da8b 2005-07-13 devnull ROOTINODE = 2,
69 0c98da8b 2005-07-13 devnull WHITEOUT = 1,
70 0c98da8b 2005-07-13 devnull
71 e060bc52 2005-08-11 devnull NXADDR = 2, /* UFS2 */
72 0c98da8b 2005-07-13 devnull NDADDR = 12,
73 0c98da8b 2005-07-13 devnull NIADDR = 3,
74 0c98da8b 2005-07-13 devnull
75 0c98da8b 2005-07-13 devnull /* permissions in Inode.mode */
76 0c98da8b 2005-07-13 devnull IEXEC = 00100,
77 0c98da8b 2005-07-13 devnull IWRITE = 0200,
78 0c98da8b 2005-07-13 devnull IREAD = 0400,
79 0c98da8b 2005-07-13 devnull ISVTX = 01000,
80 0c98da8b 2005-07-13 devnull ISGID = 02000,
81 0c98da8b 2005-07-13 devnull ISUID = 04000,
82 0c98da8b 2005-07-13 devnull
83 0c98da8b 2005-07-13 devnull /* type in Inode.mode */
84 0c98da8b 2005-07-13 devnull IFMT = 0170000,
85 0c98da8b 2005-07-13 devnull IFIFO = 0010000,
86 0c98da8b 2005-07-13 devnull IFCHR = 0020000,
87 0c98da8b 2005-07-13 devnull IFDIR = 0040000,
88 0c98da8b 2005-07-13 devnull IFBLK = 0060000,
89 0c98da8b 2005-07-13 devnull IFREG = 0100000,
90 0c98da8b 2005-07-13 devnull IFLNK = 0120000,
91 0c98da8b 2005-07-13 devnull IFSOCK = 0140000,
92 0c98da8b 2005-07-13 devnull IFWHT = 0160000,
93 0c98da8b 2005-07-13 devnull
94 0c98da8b 2005-07-13 devnull /* type in Dirent.type */
95 0c98da8b 2005-07-13 devnull DTUNKNOWN = 0,
96 0c98da8b 2005-07-13 devnull DTFIFO = 1,
97 0c98da8b 2005-07-13 devnull DTCHR = 2,
98 0c98da8b 2005-07-13 devnull DTDIR = 4,
99 0c98da8b 2005-07-13 devnull DTBLK = 6,
100 0c98da8b 2005-07-13 devnull DTREG = 8,
101 0c98da8b 2005-07-13 devnull DTLNK = 10,
102 0c98da8b 2005-07-13 devnull DTSOCK = 12,
103 cbeb0b26 2006-04-01 devnull DTWHT = 14
104 0c98da8b 2005-07-13 devnull };
105 0c98da8b 2005-07-13 devnull
106 0c98da8b 2005-07-13 devnull struct Cylsum
107 0c98da8b 2005-07-13 devnull {
108 0c98da8b 2005-07-13 devnull u32int ndir;
109 0c98da8b 2005-07-13 devnull u32int nbfree;
110 0c98da8b 2005-07-13 devnull u32int nifree;
111 0c98da8b 2005-07-13 devnull u32int nffree;
112 0c98da8b 2005-07-13 devnull };
113 0c98da8b 2005-07-13 devnull
114 e060bc52 2005-08-11 devnull struct Cylsumtotal
115 e060bc52 2005-08-11 devnull {
116 e060bc52 2005-08-11 devnull u64int ndir;
117 e060bc52 2005-08-11 devnull u64int nbfree;
118 e060bc52 2005-08-11 devnull u64int nifree;
119 e060bc52 2005-08-11 devnull u64int nffree;
120 e060bc52 2005-08-11 devnull u64int numclusters;
121 e060bc52 2005-08-11 devnull u64int unused[3];
122 e060bc52 2005-08-11 devnull };
123 e060bc52 2005-08-11 devnull
124 e060bc52 2005-08-11 devnull /* Fields beginning with underscore are deprecated in UFS2 */
125 0c98da8b 2005-07-13 devnull struct Fsblk
126 0c98da8b 2005-07-13 devnull {
127 0c98da8b 2005-07-13 devnull u32int unused0;
128 0c98da8b 2005-07-13 devnull u32int unused1;
129 0c98da8b 2005-07-13 devnull daddr_t sfragno; /* fragment address of super block in file system */
130 0c98da8b 2005-07-13 devnull daddr_t cfragno; /* fragment address if cylinder block in file system */
131 0c98da8b 2005-07-13 devnull daddr_t ifragno; /* fragment offset of inode blocks in file system */
132 0c98da8b 2005-07-13 devnull daddr_t dfragno; /* fragment offset of data blocks in cg */
133 e060bc52 2005-08-11 devnull u32int _cgoffset; /* block (maybe fragment?) offset of Cgblk in cylinder */
134 e060bc52 2005-08-11 devnull u32int _cgmask;
135 e060bc52 2005-08-11 devnull time_t _time;
136 e060bc52 2005-08-11 devnull u32int _nfrag; /* number of blocks in fs * fragsperblock */
137 e060bc52 2005-08-11 devnull u32int _ndfrag;
138 0c98da8b 2005-07-13 devnull u32int ncg; /* number of cylinder groups in fs */
139 0c98da8b 2005-07-13 devnull u32int blocksize; /* block size in fs */
140 0c98da8b 2005-07-13 devnull u32int fragsize; /* frag size in fs */
141 0c98da8b 2005-07-13 devnull u32int fragsperblock; /* fragments per block: blocksize / fragsize */
142 0c98da8b 2005-07-13 devnull u32int minfree; /* ignored by us */
143 0c98da8b 2005-07-13 devnull u32int rotdelay; /* ... */
144 0c98da8b 2005-07-13 devnull u32int rps;
145 0c98da8b 2005-07-13 devnull u32int bmask;
146 0c98da8b 2005-07-13 devnull u32int fmask;
147 0c98da8b 2005-07-13 devnull u32int bshift;
148 0c98da8b 2005-07-13 devnull u32int fshift;
149 0c98da8b 2005-07-13 devnull u32int maxcontig;
150 0c98da8b 2005-07-13 devnull u32int maxbpg;
151 0c98da8b 2005-07-13 devnull u32int fragshift;
152 0c98da8b 2005-07-13 devnull u32int fsbtodbshift;
153 e060bc52 2005-08-11 devnull u32int sbsize; /* size of super block */
154 0c98da8b 2005-07-13 devnull u32int unused2; /* more stuff we don't use ... */
155 0c98da8b 2005-07-13 devnull u32int unused3;
156 0c98da8b 2005-07-13 devnull u32int nindir;
157 0c98da8b 2005-07-13 devnull u32int inosperblock; /* inodes per block */
158 e060bc52 2005-08-11 devnull u32int _nspf;
159 0c98da8b 2005-07-13 devnull u32int optim;
160 e060bc52 2005-08-11 devnull u32int _npsect;
161 e060bc52 2005-08-11 devnull u32int _interleave;
162 e060bc52 2005-08-11 devnull u32int _trackskew;
163 0c98da8b 2005-07-13 devnull u32int id[2];
164 e060bc52 2005-08-11 devnull daddr_t _csaddr; /* blk addr of cyl grp summary area */
165 e060bc52 2005-08-11 devnull u32int cssize; /* size of cyl grp summary area */
166 e060bc52 2005-08-11 devnull u32int cgsize; /* cylinder group size */
167 e060bc52 2005-08-11 devnull u32int _trackspercyl; /* tracks per cylinder */
168 e060bc52 2005-08-11 devnull u32int _secspertrack; /* sectors per track */
169 e060bc52 2005-08-11 devnull u32int _secspercyl; /* sectors per cylinder */
170 e060bc52 2005-08-11 devnull u32int _ncyl; /* cylinders in fs */
171 e060bc52 2005-08-11 devnull u32int _cylspergroup; /* cylinders per group */
172 0c98da8b 2005-07-13 devnull u32int inospergroup; /* inodes per group */
173 0c98da8b 2005-07-13 devnull u32int fragspergroup; /* data blocks per group * fragperblock */
174 e060bc52 2005-08-11 devnull Cylsum _cstotal; /* more unused... */
175 0c98da8b 2005-07-13 devnull u8int fmod;
176 0c98da8b 2005-07-13 devnull u8int clean;
177 0c98da8b 2005-07-13 devnull u8int ronly;
178 e060bc52 2005-08-11 devnull u8int _flags;
179 e060bc52 2005-08-11 devnull /* char fsmnt[512]; in UFS1 */
180 e060bc52 2005-08-11 devnull char fsmnt[FSMAXMNTLEN2];
181 e060bc52 2005-08-11 devnull char volname[FSMAXVOLLEN];
182 e060bc52 2005-08-11 devnull u64int swuid;
183 e060bc52 2005-08-11 devnull u32int pad;
184 0c98da8b 2005-07-13 devnull u32int cgrotor;
185 e060bc52 2005-08-11 devnull uchar ocsp[FSNOCSPTRSLEN]; /* last 4 bytes is contigdirs in UFS2 */
186 e060bc52 2005-08-11 devnull u32int contigdirs; /* csp in UFS2 */
187 e060bc52 2005-08-11 devnull u32int csp; /* maxcluster in UFS2 */
188 e060bc52 2005-08-11 devnull u32int maxcluster; /* active in UFS2 */
189 e060bc52 2005-08-11 devnull u32int _cpc;
190 e060bc52 2005-08-11 devnull /* u16int opostbl[16][8]; in UFS1 */
191 e060bc52 2005-08-11 devnull u32int maxbsize;
192 e060bc52 2005-08-11 devnull u64int spare64[17];
193 e060bc52 2005-08-11 devnull u64int sblockloc;
194 e060bc52 2005-08-11 devnull Cylsumtotal cstotal;
195 e060bc52 2005-08-11 devnull u64int time;
196 e060bc52 2005-08-11 devnull u64int nfrag;
197 e060bc52 2005-08-11 devnull u64int ndfrag;
198 e060bc52 2005-08-11 devnull u64int csaddr;
199 e060bc52 2005-08-11 devnull u64int pendingblocks;
200 e060bc52 2005-08-11 devnull u32int pendinginodes;
201 0c98da8b 2005-07-13 devnull u32int snapinum[FSMAXSNAP];
202 0c98da8b 2005-07-13 devnull u32int avgfilesize;
203 0c98da8b 2005-07-13 devnull u32int avgfpdir;
204 e060bc52 2005-08-11 devnull /* u32int sparecon[26], pendingblocks, pendinginodes; in UFS1 */
205 e060bc52 2005-08-11 devnull u32int savecgsize;
206 e060bc52 2005-08-11 devnull u32int sparecon[26];
207 e060bc52 2005-08-11 devnull u32int flags;
208 0c98da8b 2005-07-13 devnull u32int contigsumsize;
209 0c98da8b 2005-07-13 devnull u32int maxsymlinklen;
210 e060bc52 2005-08-11 devnull u32int _inodefmt; /* format of on-disk inodes */
211 0c98da8b 2005-07-13 devnull u64int maxfilesize; /* maximum representable file size */
212 0c98da8b 2005-07-13 devnull u64int qbmask;
213 0c98da8b 2005-07-13 devnull u64int qfmask;
214 0c98da8b 2005-07-13 devnull u32int state;
215 e060bc52 2005-08-11 devnull u32int _postblformat;
216 e060bc52 2005-08-11 devnull u32int _nrpos;
217 e060bc52 2005-08-11 devnull u32int _postbloff;
218 e060bc52 2005-08-11 devnull u32int _rotbloff;
219 e060bc52 2005-08-11 devnull u32int magic; /* FSMAGIC or FSMAGIC2 */
220 0c98da8b 2005-07-13 devnull };
221 0c98da8b 2005-07-13 devnull
222 0c98da8b 2005-07-13 devnull /*
223 0c98da8b 2005-07-13 devnull * Cylinder group block for a file system.
224 0c98da8b 2005-07-13 devnull */
225 0c98da8b 2005-07-13 devnull struct Cgblk
226 0c98da8b 2005-07-13 devnull {
227 0c98da8b 2005-07-13 devnull u32int unused0;
228 e060bc52 2005-08-11 devnull u32int magic; /* CGMAGIC */
229 0c98da8b 2005-07-13 devnull u32int time; /* time last written */
230 e060bc52 2005-08-11 devnull u32int num; /* we are cg #cgnum */
231 0c98da8b 2005-07-13 devnull u16int ncyl; /* number of cylinders in gp */
232 e060bc52 2005-08-11 devnull u16int nino; /* number of inodes */
233 e060bc52 2005-08-11 devnull u32int nfrag; /* number of fragments */
234 0c98da8b 2005-07-13 devnull Cylsum csum;
235 0c98da8b 2005-07-13 devnull u32int rotor;
236 0c98da8b 2005-07-13 devnull u32int frotor;
237 0c98da8b 2005-07-13 devnull u32int irotor;
238 0c98da8b 2005-07-13 devnull u32int frsum[MAXFRAG]; /* counts of available frags */
239 0c98da8b 2005-07-13 devnull u32int btotoff;
240 0c98da8b 2005-07-13 devnull u32int boff;
241 0c98da8b 2005-07-13 devnull u32int imapoff; /* offset to used inode map */
242 0c98da8b 2005-07-13 devnull u32int fmapoff; /* offset to free fragment map */
243 0c98da8b 2005-07-13 devnull u32int nextfrag; /* next free fragment */
244 0c98da8b 2005-07-13 devnull u32int csumoff;
245 0c98da8b 2005-07-13 devnull u32int clusteroff;
246 0c98da8b 2005-07-13 devnull u32int ncluster;
247 0c98da8b 2005-07-13 devnull u32int sparecon[13];
248 0c98da8b 2005-07-13 devnull };
249 0c98da8b 2005-07-13 devnull
250 0c98da8b 2005-07-13 devnull struct Cylgrp
251 0c98da8b 2005-07-13 devnull {
252 0c98da8b 2005-07-13 devnull /* these are block numbers not fragment numbers */
253 e060bc52 2005-08-11 devnull u64int bno; /* disk block address of start of cg */
254 e060bc52 2005-08-11 devnull u64int ibno; /* disk block address of first inode */
255 e060bc52 2005-08-11 devnull u64int dbno; /* disk block address of first data */
256 e060bc52 2005-08-11 devnull u64int cgblkno;
257 0c98da8b 2005-07-13 devnull };
258 0c98da8b 2005-07-13 devnull
259 0c98da8b 2005-07-13 devnull /*
260 0c98da8b 2005-07-13 devnull * this is the on-disk structure
261 0c98da8b 2005-07-13 devnull */
262 e060bc52 2005-08-11 devnull struct Inode1
263 0c98da8b 2005-07-13 devnull {
264 0c98da8b 2005-07-13 devnull u16int mode;
265 0c98da8b 2005-07-13 devnull u16int nlink;
266 0c98da8b 2005-07-13 devnull u32int unused;
267 0c98da8b 2005-07-13 devnull u64int size;
268 0c98da8b 2005-07-13 devnull u32int atime;
269 0c98da8b 2005-07-13 devnull u32int atimensec;
270 0c98da8b 2005-07-13 devnull u32int mtime;
271 0c98da8b 2005-07-13 devnull u32int mtimensec;
272 0c98da8b 2005-07-13 devnull u32int ctime;
273 0c98da8b 2005-07-13 devnull u32int ctimensec;
274 0c98da8b 2005-07-13 devnull /* rdev is db[0] */
275 0c98da8b 2005-07-13 devnull u32int db[NDADDR];
276 0c98da8b 2005-07-13 devnull u32int ib[NIADDR];
277 0c98da8b 2005-07-13 devnull u32int flags;
278 0c98da8b 2005-07-13 devnull u32int nblock;
279 0c98da8b 2005-07-13 devnull u32int gen;
280 0c98da8b 2005-07-13 devnull u32int uid;
281 0c98da8b 2005-07-13 devnull u32int gid;
282 0c98da8b 2005-07-13 devnull u32int spare[2];
283 0c98da8b 2005-07-13 devnull };
284 0c98da8b 2005-07-13 devnull
285 e060bc52 2005-08-11 devnull struct Inode
286 e060bc52 2005-08-11 devnull {
287 e060bc52 2005-08-11 devnull u16int mode;
288 e060bc52 2005-08-11 devnull u16int nlink;
289 e060bc52 2005-08-11 devnull u32int uid;
290 e060bc52 2005-08-11 devnull u32int gid;
291 e060bc52 2005-08-11 devnull u32int blksize;
292 e060bc52 2005-08-11 devnull u64int size;
293 e060bc52 2005-08-11 devnull u64int nblock;
294 e060bc52 2005-08-11 devnull u64int atime;
295 e060bc52 2005-08-11 devnull u64int mtime;
296 e060bc52 2005-08-11 devnull u64int ctime;
297 e060bc52 2005-08-11 devnull u64int btime;
298 e060bc52 2005-08-11 devnull u32int atimensec;
299 e060bc52 2005-08-11 devnull u32int mtimensec;
300 e060bc52 2005-08-11 devnull u32int ctimensec;
301 e060bc52 2005-08-11 devnull u32int btimensec;
302 e060bc52 2005-08-11 devnull u32int gen;
303 e060bc52 2005-08-11 devnull u32int kernflags;
304 e060bc52 2005-08-11 devnull u32int flags;
305 e060bc52 2005-08-11 devnull u32int extsize;
306 e060bc52 2005-08-11 devnull u64int ext[NXADDR];
307 e060bc52 2005-08-11 devnull u64int db[NDADDR];
308 e060bc52 2005-08-11 devnull u64int ib[NIADDR];
309 e060bc52 2005-08-11 devnull u64int spare[3];
310 e060bc52 2005-08-11 devnull };
311 e060bc52 2005-08-11 devnull
312 0c98da8b 2005-07-13 devnull struct Dirent
313 0c98da8b 2005-07-13 devnull {
314 0c98da8b 2005-07-13 devnull u32int ino;
315 0c98da8b 2005-07-13 devnull u16int reclen;
316 0c98da8b 2005-07-13 devnull u8int type;
317 0c98da8b 2005-07-13 devnull u8int namlen;
318 0c98da8b 2005-07-13 devnull char name[1];
319 0c98da8b 2005-07-13 devnull };
320 0c98da8b 2005-07-13 devnull
321 0c98da8b 2005-07-13 devnull /*
322 0c98da8b 2005-07-13 devnull * main file system structure
323 0c98da8b 2005-07-13 devnull */
324 0c98da8b 2005-07-13 devnull struct Ffs
325 0c98da8b 2005-07-13 devnull {
326 e060bc52 2005-08-11 devnull int ufs;
327 0c98da8b 2005-07-13 devnull int blocksize;
328 e060bc52 2005-08-11 devnull u64int nblock;
329 0c98da8b 2005-07-13 devnull int fragsize;
330 0c98da8b 2005-07-13 devnull int fragsperblock;
331 0c98da8b 2005-07-13 devnull int inosperblock;
332 e060bc52 2005-08-11 devnull u64int blockspergroup;
333 e060bc52 2005-08-11 devnull u64int fragspergroup;
334 0c98da8b 2005-07-13 devnull int inospergroup;
335 0c98da8b 2005-07-13 devnull
336 e060bc52 2005-08-11 devnull u64int nfrag;
337 e060bc52 2005-08-11 devnull u64int ndfrag;
338 0c98da8b 2005-07-13 devnull
339 0c98da8b 2005-07-13 devnull int ncg;
340 0c98da8b 2005-07-13 devnull Cylgrp *cg;
341 0c98da8b 2005-07-13 devnull
342 0c98da8b 2005-07-13 devnull Disk *disk;
343 0c98da8b 2005-07-13 devnull };
344 0c98da8b 2005-07-13 devnull