VirtualBox

source: vbox/trunk/src/VBox/Devices/PC/Etherboot-src/filo/fs/xfs.h@ 1

Last change on this file since 1 was 1, checked in by vboxsync, 55 years ago

import

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.3 KB
Line 
1/* xfs.h - an extraction from xfsprogs-1.3.5/include/xfs* into one file */
2/*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved.
5 * Copyright (C) 2001 Free Software Foundation, Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it would be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 *
15 * Further, this software is distributed without any warranty that it is
16 * free of the rightful claim of any third person regarding infringement
17 * or the like. Any license provided herein, whether implied or
18 * otherwise, applies only to this software file. Patent licenses, if
19 * any, provided herein do not apply to combinations of this program with
20 * other software, or any other product whatsoever.
21 *
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write the Free Software Foundation, Inc., 59
24 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
25 *
26 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
27 * Mountain View, CA 94043, or:
28 *
29 * http://www.sgi.com
30 *
31 * For further information regarding this notice, see:
32 *
33 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
34 */
35
36#ifndef _BITS_TYPES_H
37typedef signed char __int8_t;
38typedef unsigned char __uint8_t;
39typedef short __int16_t;
40typedef unsigned short __uint16_t;
41typedef int __int32_t;
42typedef unsigned int __uint32_t;
43typedef long long __int64_t;
44typedef unsigned long long __uint64_t;
45#endif
46
47typedef __uint64_t xfs_ino_t;
48typedef __uint32_t xfs_agino_t;
49typedef __int64_t xfs_daddr_t;
50typedef __int64_t xfs_off_t;
51typedef __uint8_t uuid_t[16];
52
53
54/* those are from xfs_types.h */
55
56typedef __uint32_t xfs_agblock_t; /* blockno in alloc. group */
57typedef __uint32_t xfs_extlen_t; /* extent length in blocks */
58typedef __uint32_t xfs_agnumber_t; /* allocation group number */
59typedef __int32_t xfs_extnum_t; /* # of extents in a file */
60typedef __int16_t xfs_aextnum_t; /* # extents in an attribute fork */
61typedef __int64_t xfs_fsize_t; /* bytes in a file */
62
63typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */
64typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */
65
66/*
67 * Disk based types:
68 */
69typedef __uint64_t xfs_dfsbno_t; /* blockno in filesystem (agno|agbno) */
70typedef __uint64_t xfs_drfsbno_t; /* blockno in filesystem (raw) */
71typedef __uint64_t xfs_drtbno_t; /* extent (block) in realtime area */
72typedef __uint64_t xfs_dfiloff_t; /* block number in a file */
73
74typedef __uint64_t xfs_fsblock_t; /* blockno in filesystem (agno|agbno) */
75typedef __uint64_t xfs_fileoff_t; /* block number in a file */
76typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */
77
78
79/* those are from xfs_sb.h */
80
81#define XFS_SB_MAGIC 0x58465342 /* 'XFSB'*/
82#define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */
83#define XFS_SB_VERSION_NUMBITS 0x000f
84
85typedef struct xfs_sb
86{
87 __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */
88 __uint32_t sb_blocksize; /* logical block size, bytes */
89 xfs_drfsbno_t sb_dblocks; /* number of data blocks */
90 xfs_drfsbno_t sb_rblocks; /* number of realtime blocks */
91 xfs_drtbno_t sb_rextents; /* number of realtime extents */
92 uuid_t sb_uuid; /* file system unique id */
93 xfs_dfsbno_t sb_logstart; /* starting block of log if internal */
94 xfs_ino_t sb_rootino; /* root inode number */
95 xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */
96 xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */
97 xfs_agblock_t sb_rextsize; /* realtime extent size, blocks */
98 xfs_agblock_t sb_agblocks; /* size of an allocation group */
99 xfs_agnumber_t sb_agcount; /* number of allocation groups */
100 xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */
101 xfs_extlen_t sb_logblocks; /* number of log blocks */
102 __uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */
103 __uint16_t sb_sectsize; /* volume sector size, bytes */
104 __uint16_t sb_inodesize; /* inode size, bytes */
105 __uint16_t sb_inopblock; /* inodes per block */
106 char sb_fname[12]; /* file system name */
107 __uint8_t sb_blocklog; /* log2 of sb_blocksize */
108 __uint8_t sb_sectlog; /* log2 of sb_sectsize */
109 __uint8_t sb_inodelog; /* log2 of sb_inodesize */
110 __uint8_t sb_inopblog; /* log2 of sb_inopblock */
111 __uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */
112 __uint8_t sb_rextslog; /* log2 of sb_rextents */
113 __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */
114 __uint8_t sb_imax_pct; /* max % of fs for inode space */
115 /* statistics */
116 /*
117 * These fields must remain contiguous. If you really
118 * want to change their layout, make sure you fix the
119 * code in xfs_trans_apply_sb_deltas().
120 */
121 __uint64_t sb_icount; /* allocated inodes */
122 __uint64_t sb_ifree; /* free inodes */
123 __uint64_t sb_fdblocks; /* free data blocks */
124 __uint64_t sb_frextents; /* free realtime extents */
125 /*
126 * End contiguous fields.
127 */
128 xfs_ino_t sb_uquotino; /* user quota inode */
129 xfs_ino_t sb_gquotino; /* group quota inode */
130 __uint16_t sb_qflags; /* quota flags */
131 __uint8_t sb_flags; /* misc. flags */
132 __uint8_t sb_shared_vn; /* shared version number */
133 xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */
134 __uint32_t sb_unit; /* stripe or raid unit */
135 __uint32_t sb_width; /* stripe or raid width */
136 __uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */
137 __uint8_t sb_dummy[7]; /* padding */
138} xfs_sb_t;
139
140
141/* those are from xfs_btree.h */
142
143/*
144 * Long form header: bmap btrees.
145 */
146typedef struct xfs_btree_lblock
147{
148 __uint32_t bb_magic; /* magic number for block type */
149 __uint16_t bb_level; /* 0 is a leaf */
150 __uint16_t bb_numrecs; /* current # of data records */
151 xfs_dfsbno_t bb_leftsib; /* left sibling block or NULLDFSBNO */
152 xfs_dfsbno_t bb_rightsib; /* right sibling block or NULLDFSBNO */
153} xfs_btree_lblock_t;
154
155/*
156 * Combined header and structure, used by common code.
157 */
158typedef struct xfs_btree_hdr
159{
160 __uint32_t bb_magic; /* magic number for block type */
161 __uint16_t bb_level; /* 0 is a leaf */
162 __uint16_t bb_numrecs; /* current # of data records */
163} xfs_btree_hdr_t;
164
165typedef struct xfs_btree_block
166{
167 xfs_btree_hdr_t bb_h; /* header */
168 union {
169 struct {
170 xfs_agblock_t bb_leftsib;
171 xfs_agblock_t bb_rightsib;
172 } s; /* short form pointers */
173 struct {
174 xfs_dfsbno_t bb_leftsib;
175 xfs_dfsbno_t bb_rightsib;
176 } l; /* long form pointers */
177 } bb_u; /* rest */
178} xfs_btree_block_t;
179
180/* those are from xfs_bmap_btree.h */
181
182/*
183 * Bmap root header, on-disk form only.
184 */
185typedef struct xfs_bmdr_block
186{
187 __uint16_t bb_level; /* 0 is a leaf */
188 __uint16_t bb_numrecs; /* current # of data records */
189} xfs_bmdr_block_t;
190
191/*
192 * Bmap btree record and extent descriptor.
193 * For 32-bit kernels,
194 * l0:31 is an extent flag (value 1 indicates non-normal).
195 * l0:0-30 and l1:9-31 are startoff.
196 * l1:0-8, l2:0-31, and l3:21-31 are startblock.
197 * l3:0-20 are blockcount.
198 * For 64-bit kernels,
199 * l0:63 is an extent flag (value 1 indicates non-normal).
200 * l0:9-62 are startoff.
201 * l0:0-8 and l1:21-63 are startblock.
202 * l1:0-20 are blockcount.
203 */
204
205#define BMBT_USE_64 1
206
207typedef struct xfs_bmbt_rec_32
208{
209 __uint32_t l0, l1, l2, l3;
210} xfs_bmbt_rec_32_t;
211typedef struct xfs_bmbt_rec_64
212{
213 __uint64_t l0, l1;
214} xfs_bmbt_rec_64_t;
215
216#if BMBT_USE_64
217typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */
218typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t;
219#else /* !BMBT_USE_64 */
220typedef __uint32_t xfs_bmbt_rec_base_t; /* use this for casts */
221typedef xfs_bmbt_rec_32_t xfs_bmbt_rec_t, xfs_bmdr_rec_t;
222#endif /* BMBT_USE_64 */
223
224/*
225 * Key structure for non-leaf levels of the tree.
226 */
227typedef struct xfs_bmbt_key
228{
229 xfs_dfiloff_t br_startoff; /* starting file offset */
230} xfs_bmbt_key_t, xfs_bmdr_key_t;
231
232typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* btree pointer type */
233 /* btree block header type */
234typedef struct xfs_btree_lblock xfs_bmbt_block_t;
235
236
237/* those are from xfs_dir2.h */
238/*
239 * Directory version 2.
240 * There are 4 possible formats:
241 * shortform
242 * single block - data with embedded leaf at the end
243 * multiple data blocks, single leaf+freeindex block
244 * data blocks, node&leaf blocks (btree), freeindex blocks
245 *
246 * The shortform format is in xfs_dir2_sf.h.
247 * The single block format is in xfs_dir2_block.h.
248 * The data block format is in xfs_dir2_data.h.
249 * The leaf and freeindex block formats are in xfs_dir2_leaf.h.
250 * Node blocks are the same as the other version, in xfs_da_btree.h.
251 */
252
253/*
254 * Byte offset in data block and shortform entry.
255 */
256typedef __uint16_t xfs_dir2_data_off_t;
257
258/*
259 * Byte offset in a directory.
260 */
261typedef xfs_off_t xfs_dir2_off_t;
262
263/* those are from xfs_da_btree.h */
264/*========================================================================
265 * Directory Structure when greater than XFS_LBSIZE(mp) bytes.
266 *========================================================================*/
267
268/*
269 * This structure is common to both leaf nodes and non-leaf nodes in the Btree.
270 *
271 * Is is used to manage a doubly linked list of all blocks at the same
272 * level in the Btree, and to identify which type of block this is.
273 */
274#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */
275#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */
276
277typedef struct xfs_da_blkinfo {
278 xfs_dablk_t forw; /* previous block in list */
279 xfs_dablk_t back; /* following block in list */
280 __uint16_t magic; /* validity check on block */
281 __uint16_t pad; /* unused */
282} xfs_da_blkinfo_t;
283
284/*
285 * This is the structure of the root and intermediate nodes in the Btree.
286 * The leaf nodes are defined above.
287 *
288 * Entries are not packed.
289 *
290 * Since we have duplicate keys, use a binary search but always follow
291 * all match in the block, not just the first match found.
292 */
293
294typedef struct xfs_da_intnode {
295 struct xfs_da_node_hdr { /* constant-structure header block */
296 xfs_da_blkinfo_t info; /* block type, links, etc. */
297 __uint16_t count; /* count of active entries */
298 __uint16_t level; /* level above leaves (leaf == 0) */
299 } hdr;
300 struct xfs_da_node_entry {
301 xfs_dahash_t hashval; /* hash value for this descendant */
302 xfs_dablk_t before; /* Btree block before this key */
303 } btree[1]; /* variable sized array of keys */
304} xfs_da_intnode_t;
305
306
307/* those are from xfs_dir2_data.h */
308/*
309 * Directory format 2, data block structures.
310 */
311
312/*
313 * Constants.
314 */
315#define XFS_DIR2_DATA_FREE_TAG 0xffff
316#define XFS_DIR2_DATA_FD_COUNT 3
317
318/*
319 * Structures.
320 */
321
322/*
323 * Describe a free area in the data block.
324 * The freespace will be formatted as a xfs_dir2_data_unused_t.
325 */
326typedef struct xfs_dir2_data_free {
327 xfs_dir2_data_off_t offset; /* start of freespace */
328 xfs_dir2_data_off_t length; /* length of freespace */
329} xfs_dir2_data_free_t;
330
331/*
332 * Header for the data blocks.
333 * Always at the beginning of a directory-sized block.
334 * The code knows that XFS_DIR2_DATA_FD_COUNT is 3.
335 */
336typedef struct xfs_dir2_data_hdr {
337 __uint32_t magic; /* XFS_DIR2_DATA_MAGIC */
338 /* or XFS_DIR2_BLOCK_MAGIC */
339 xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT];
340} xfs_dir2_data_hdr_t;
341
342/*
343 * Active entry in a data block. Aligned to 8 bytes.
344 * Tag appears as the last 2 bytes.
345 */
346typedef struct xfs_dir2_data_entry {
347 xfs_ino_t inumber; /* inode number */
348 __uint8_t namelen; /* name length */
349 __uint8_t name[1]; /* name bytes, no null */
350 /* variable offset */
351 xfs_dir2_data_off_t tag; /* starting offset of us */
352} xfs_dir2_data_entry_t;
353
354/*
355 * Unused entry in a data block. Aligned to 8 bytes.
356 * Tag appears as the last 2 bytes.
357 */
358typedef struct xfs_dir2_data_unused {
359 __uint16_t freetag; /* XFS_DIR2_DATA_FREE_TAG */
360 xfs_dir2_data_off_t length; /* total free length */
361 /* variable offset */
362 xfs_dir2_data_off_t tag; /* starting offset of us */
363} xfs_dir2_data_unused_t;
364
365typedef union {
366 xfs_dir2_data_entry_t entry;
367 xfs_dir2_data_unused_t unused;
368} xfs_dir2_data_union_t;
369
370
371/* those are from xfs_dir2_leaf.h */
372/*
373 * Directory version 2, leaf block structures.
374 */
375
376/*
377 * Leaf block header.
378 */
379typedef struct xfs_dir2_leaf_hdr {
380 xfs_da_blkinfo_t info; /* header for da routines */
381 __uint16_t count; /* count of entries */
382 __uint16_t stale; /* count of stale entries */
383} xfs_dir2_leaf_hdr_t;
384
385
386/* those are from xfs_dir2_block.h */
387/*
388 * xfs_dir2_block.h
389 * Directory version 2, single block format structures
390 */
391
392/*
393 * The single block format is as follows:
394 * xfs_dir2_data_hdr_t structure
395 * xfs_dir2_data_entry_t and xfs_dir2_data_unused_t structures
396 * xfs_dir2_leaf_entry_t structures
397 * xfs_dir2_block_tail_t structure
398 */
399
400#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: for one block dirs */
401
402typedef struct xfs_dir2_block_tail {
403 __uint32_t count; /* count of leaf entries */
404 __uint32_t stale; /* count of stale lf entries */
405} xfs_dir2_block_tail_t;
406
407
408/* those are from xfs_dir2_sf.h */
409
410/*
411 * Directory layout when stored internal to an inode.
412 *
413 * Small directories are packed as tightly as possible so as to
414 * fit into the literal area of the inode.
415 */
416
417/*
418 * Inode number stored as 8 8-bit values.
419 */
420typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t;
421
422/*
423 * Inode number stored as 4 8-bit values.
424 * Works a lot of the time, when all the inode numbers in a directory
425 * fit in 32 bits.
426 */
427typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t;
428
429typedef union {
430 xfs_dir2_ino8_t i8;
431 xfs_dir2_ino4_t i4;
432} xfs_dir2_inou_t;
433
434/*
435 * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t.
436 * Only need 16 bits, this is the byte offset into the single block form.
437 */
438typedef struct { __uint8_t i[2]; } xfs_dir2_sf_off_t;
439
440/*
441 * The parent directory has a dedicated field, and the self-pointer must
442 * be calculated on the fly.
443 *
444 * Entries are packed toward the top as tightly as possible. The header
445 * and the elements must be bcopy()'d out into a work area to get correct
446 * alignment for the inode number fields.
447 */
448typedef struct xfs_dir2_sf_hdr {
449 __uint8_t count; /* count of entries */
450 __uint8_t i8count; /* count of 8-byte inode #s */
451 xfs_dir2_inou_t parent; /* parent dir inode number */
452} xfs_dir2_sf_hdr_t;
453
454typedef struct xfs_dir2_sf_entry {
455 __uint8_t namelen; /* actual name length */
456 xfs_dir2_sf_off_t offset; /* saved offset */
457 __uint8_t name[1]; /* name, variable size */
458 xfs_dir2_inou_t inumber; /* inode number, var. offset */
459} xfs_dir2_sf_entry_t;
460
461typedef struct xfs_dir2_sf {
462 xfs_dir2_sf_hdr_t hdr; /* shortform header */
463 xfs_dir2_sf_entry_t list[1]; /* shortform entries */
464} xfs_dir2_sf_t;
465
466/* those are from xfs_dinode.h */
467
468#define XFS_DINODE_VERSION_1 1
469#define XFS_DINODE_VERSION_2 2
470#define XFS_DINODE_MAGIC 0x494e /* 'IN' */
471
472/*
473 * Disk inode structure.
474 * This is just the header; the inode is expanded to fill a variable size
475 * with the last field expanding. It is split into the core and "other"
476 * because we only need the core part in the in-core inode.
477 */
478typedef struct xfs_timestamp {
479 __int32_t t_sec; /* timestamp seconds */
480 __int32_t t_nsec; /* timestamp nanoseconds */
481} xfs_timestamp_t;
482
483/*
484 * Note: Coordinate changes to this structure with the XFS_DI_* #defines
485 * below and the offsets table in xfs_ialloc_log_di().
486 */
487typedef struct xfs_dinode_core
488{
489 __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */
490 __uint16_t di_mode; /* mode and type of file */
491 __int8_t di_version; /* inode version */
492 __int8_t di_format; /* format of di_c data */
493 __uint16_t di_onlink; /* old number of links to file */
494 __uint32_t di_uid; /* owner's user id */
495 __uint32_t di_gid; /* owner's group id */
496 __uint32_t di_nlink; /* number of links to file */
497 __uint16_t di_projid; /* owner's project id */
498 __uint8_t di_pad[10]; /* unused, zeroed space */
499 xfs_timestamp_t di_atime; /* time last accessed */
500 xfs_timestamp_t di_mtime; /* time last modified */
501 xfs_timestamp_t di_ctime; /* time created/inode modified */
502 xfs_fsize_t di_size; /* number of bytes in file */
503 xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */
504 xfs_extlen_t di_extsize; /* basic/minimum extent size for file */
505 xfs_extnum_t di_nextents; /* number of extents in data fork */
506 xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/
507 __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */
508 __int8_t di_aformat; /* format of attr fork's data */
509 __uint32_t di_dmevmask; /* DMIG event mask */
510 __uint16_t di_dmstate; /* DMIG state info */
511 __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */
512 __uint32_t di_gen; /* generation number */
513} xfs_dinode_core_t;
514
515typedef struct xfs_dinode
516{
517 xfs_dinode_core_t di_core;
518 xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */
519 union {
520 xfs_bmdr_block_t di_bmbt; /* btree root block */
521 xfs_bmbt_rec_32_t di_bmx[1]; /* extent list */
522 xfs_dir2_sf_t di_dir2sf; /* shortform directory v2 */
523 char di_c[1]; /* local contents */
524 } di_u;
525} xfs_dinode_t;
526
527/*
528 * Values for di_format
529 */
530typedef enum xfs_dinode_fmt
531{
532 XFS_DINODE_FMT_DEV, /* CHR, BLK: di_dev */
533 XFS_DINODE_FMT_LOCAL, /* DIR, REG: di_c */
534 /* LNK: di_symlink */
535 XFS_DINODE_FMT_EXTENTS, /* DIR, REG, LNK: di_bmx */
536 XFS_DINODE_FMT_BTREE, /* DIR, REG, LNK: di_bmbt */
537 XFS_DINODE_FMT_UUID /* MNT: di_uuid */
538} xfs_dinode_fmt_t;
539
540/*
541 * File types (mode field)
542 */
543#define IFMT 0170000 /* type of file */
544#define IFDIR 0040000 /* directory */
545#define IFREG 0100000 /* regular */
546#define IFLNK 0120000 /* symbolic link */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette