Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / fs / grubfs / xfs.h
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.,
24  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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
37 typedef signed char     __int8_t;
38 typedef unsigned char   __uint8_t;
39 typedef short           __int16_t;
40 typedef unsigned short  __uint16_t;
41 typedef int             __int32_t;
42 typedef unsigned int    __uint32_t;
43 typedef long long       __int64_t;
44 typedef unsigned long long __uint64_t;
45 #endif
46
47 typedef __uint64_t      xfs_ino_t;
48 typedef __uint32_t      xfs_agino_t;
49 typedef __int64_t       xfs_daddr_t;
50 typedef __int64_t       xfs_off_t;
51 typedef __uint8_t       uuid_t[16];
52
53
54 /* those are from xfs_types.h */
55
56 typedef __uint32_t      xfs_agblock_t;  /* blockno in alloc. group */
57 typedef __uint32_t      xfs_extlen_t;   /* extent length in blocks */
58 typedef __uint32_t      xfs_agnumber_t; /* allocation group number */
59 typedef __int32_t       xfs_extnum_t;   /* # of extents in a file */
60 typedef __int16_t       xfs_aextnum_t;  /* # extents in an attribute fork */
61 typedef __int64_t       xfs_fsize_t;    /* bytes in a file */
62
63 typedef __uint32_t      xfs_dablk_t;    /* dir/attr block number (in file) */
64 typedef __uint32_t      xfs_dahash_t;   /* dir/attr hash value */
65
66 /*
67  * Disk based types:
68  */
69 typedef __uint64_t      xfs_dfsbno_t;   /* blockno in filesystem (agno|agbno) */
70 typedef __uint64_t      xfs_drfsbno_t;  /* blockno in filesystem (raw) */
71 typedef __uint64_t      xfs_drtbno_t;   /* extent (block) in realtime area */
72 typedef __uint64_t      xfs_dfiloff_t;  /* block number in a file */
73
74 typedef __uint64_t      xfs_fsblock_t;  /* blockno in filesystem (agno|agbno) */
75 typedef __uint64_t      xfs_fileoff_t;  /* block number in a file */
76 typedef __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
85 typedef 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  */
146 typedef 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  */
158 typedef 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
165 typedef 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  */
185 typedef 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
207 typedef struct xfs_bmbt_rec_32
208 {
209         __uint32_t              l0, l1, l2, l3;
210 } xfs_bmbt_rec_32_t;
211 typedef struct xfs_bmbt_rec_64
212 {
213         __uint64_t              l0, l1;
214 } xfs_bmbt_rec_64_t;
215
216 #if BMBT_USE_64
217 typedef __uint64_t      xfs_bmbt_rec_base_t;    /* use this for casts */
218 typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t;
219 #else   /* !BMBT_USE_64 */
220 typedef __uint32_t      xfs_bmbt_rec_base_t;    /* use this for casts */
221 typedef 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  */
227 typedef struct xfs_bmbt_key
228 {
229         xfs_dfiloff_t   br_startoff;    /* starting file offset */
230 } xfs_bmbt_key_t, xfs_bmdr_key_t;
231
232 typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;    /* btree pointer type */
233                                         /* btree block header type */
234 typedef 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  */
256 typedef __uint16_t      xfs_dir2_data_off_t;
257
258 /*
259  * Byte offset in a directory.
260  */
261 typedef 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
277 typedef 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
294 typedef 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  */
326 typedef 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  */
336 typedef 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  */
346 typedef 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  */
358 typedef 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
365 typedef 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  */
379 typedef 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
402 typedef 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  */
420 typedef 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  */
427 typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t;
428
429 typedef 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  */
438 typedef 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  */
448 typedef 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
454 typedef 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
461 typedef 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  */
478 typedef 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  */
487 typedef 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
515 typedef 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  */
530 typedef 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 */