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