|  | /* xfs.h - an extraction from xfsprogs-1.3.5/include/xfs* into one file */ | 
|  | /* | 
|  | *  GRUB  --  GRand Unified Bootloader | 
|  | *  Copyright (C) 2000  Silicon Graphics, Inc.  All Rights Reserved. | 
|  | *  Copyright (C) 2001,2004  Free Software Foundation, Inc. | 
|  | * | 
|  | *  This program is free software; you can redistribute it and/or modify it | 
|  | *  under the terms of version 2 of the GNU General Public License as | 
|  | *  published by the Free Software Foundation. | 
|  | * | 
|  | *  This program is distributed in the hope that it would be useful, but | 
|  | *  WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | * | 
|  | *  Further, this software is distributed without any warranty that it is | 
|  | *  free of the rightful claim of any third person regarding infringement | 
|  | *  or the like.  Any license provided herein, whether implied or | 
|  | *  otherwise, applies only to this software file.  Patent licenses, if | 
|  | *  any, provided herein do not apply to combinations of this program with | 
|  | *  other software, or any other product whatsoever. | 
|  | * | 
|  | *  You should have received a copy of the GNU General Public License along | 
|  | *  with this program; if not, write the Free Software Foundation, Inc., 59 | 
|  | *  Temple Place - Suite 330, Boston MA 02111-1307, USA. | 
|  | * | 
|  | *  Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, | 
|  | *  Mountain View, CA  94043, or: | 
|  | * | 
|  | *  http://www.sgi.com | 
|  | * | 
|  | *  For further information regarding this notice, see: | 
|  | * | 
|  | *  http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ | 
|  | */ | 
|  |  | 
|  | typedef signed char	xfs_int8_t; | 
|  | typedef unsigned char	xfs_uint8_t; | 
|  | typedef short		xfs_int16_t; | 
|  | typedef unsigned short	xfs_uint16_t; | 
|  | typedef int		xfs_int32_t; | 
|  | typedef unsigned int	xfs_uint32_t; | 
|  | typedef long long	xfs_int64_t; | 
|  | typedef unsigned long long xfs_uint64_t; | 
|  |  | 
|  | typedef xfs_uint64_t	xfs_ino_t; | 
|  | typedef	xfs_uint32_t	xfs_agino_t; | 
|  | typedef xfs_int64_t	xfs_daddr_t; | 
|  | typedef xfs_int64_t	xfs_off_t; | 
|  | typedef xfs_uint8_t	uuid_t[16]; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_types.h */ | 
|  |  | 
|  | typedef xfs_uint32_t	xfs_agblock_t;	/* blockno in alloc. group */ | 
|  | typedef	xfs_uint32_t	xfs_extlen_t;	/* extent length in blocks */ | 
|  | typedef	xfs_uint32_t	xfs_agnumber_t;	/* allocation group number */ | 
|  | typedef xfs_int32_t	xfs_extnum_t;	/* # of extents in a file */ | 
|  | typedef xfs_int16_t	xfs_aextnum_t;	/* # extents in an attribute fork */ | 
|  | typedef	xfs_int64_t	xfs_fsize_t;	/* bytes in a file */ | 
|  |  | 
|  | typedef	xfs_uint32_t	xfs_dablk_t;	/* dir/attr block number (in file) */ | 
|  | typedef	xfs_uint32_t	xfs_dahash_t;	/* dir/attr hash value */ | 
|  |  | 
|  | /* | 
|  | * Disk based types: | 
|  | */ | 
|  | typedef xfs_uint64_t	xfs_dfsbno_t;	/* blockno in filesystem (agno|agbno) */ | 
|  | typedef xfs_uint64_t	xfs_drfsbno_t;	/* blockno in filesystem (raw) */ | 
|  | typedef	xfs_uint64_t	xfs_drtbno_t;	/* extent (block) in realtime area */ | 
|  | typedef	xfs_uint64_t	xfs_dfiloff_t;	/* block number in a file */ | 
|  |  | 
|  | typedef	xfs_uint64_t	xfs_fsblock_t;	/* blockno in filesystem (agno|agbno) */ | 
|  | typedef	xfs_uint64_t	xfs_fileoff_t;	/* block number in a file */ | 
|  | typedef	xfs_uint64_t	xfs_filblks_t;	/* number of blocks in a file */ | 
|  |  | 
|  |  | 
|  | /* those are from xfs_sb.h */ | 
|  |  | 
|  | #define	XFS_SB_MAGIC		0x58465342	/* 'XFSB'*/ | 
|  | #define	XFS_SB_VERSION_4	4		/* 6.2+ - bitmask version */ | 
|  | #define	XFS_SB_VERSION_NUMBITS	0x000f | 
|  |  | 
|  | typedef struct xfs_sb | 
|  | { | 
|  | xfs_uint32_t	sb_magicnum;	/* magic number == XFS_SB_MAGIC */ | 
|  | xfs_uint32_t	sb_blocksize;	/* logical block size, bytes */ | 
|  | xfs_drfsbno_t	sb_dblocks;	/* number of data blocks */ | 
|  | xfs_drfsbno_t	sb_rblocks;	/* number of realtime blocks */ | 
|  | xfs_drtbno_t	sb_rextents;	/* number of realtime extents */ | 
|  | uuid_t		sb_uuid;	/* file system unique id */ | 
|  | xfs_dfsbno_t	sb_logstart;	/* starting block of log if internal */ | 
|  | xfs_ino_t	sb_rootino;	/* root inode number */ | 
|  | xfs_ino_t	sb_rbmino;	/* bitmap inode for realtime extents */ | 
|  | xfs_ino_t	sb_rsumino;	/* summary inode for rt bitmap */ | 
|  | xfs_agblock_t	sb_rextsize;	/* realtime extent size, blocks */ | 
|  | xfs_agblock_t	sb_agblocks;	/* size of an allocation group */ | 
|  | xfs_agnumber_t	sb_agcount;	/* number of allocation groups */ | 
|  | xfs_extlen_t	sb_rbmblocks;	/* number of rt bitmap blocks */ | 
|  | xfs_extlen_t	sb_logblocks;	/* number of log blocks */ | 
|  | xfs_uint16_t	sb_versionnum;	/* header version == XFS_SB_VERSION */ | 
|  | xfs_uint16_t	sb_sectsize;	/* volume sector size, bytes */ | 
|  | xfs_uint16_t	sb_inodesize;	/* inode size, bytes */ | 
|  | xfs_uint16_t	sb_inopblock;	/* inodes per block */ | 
|  | char		sb_fname[12];	/* file system name */ | 
|  | xfs_uint8_t	sb_blocklog;	/* log2 of sb_blocksize */ | 
|  | xfs_uint8_t	sb_sectlog;	/* log2 of sb_sectsize */ | 
|  | xfs_uint8_t	sb_inodelog;	/* log2 of sb_inodesize */ | 
|  | xfs_uint8_t	sb_inopblog;	/* log2 of sb_inopblock */ | 
|  | xfs_uint8_t	sb_agblklog;	/* log2 of sb_agblocks (rounded up) */ | 
|  | xfs_uint8_t	sb_rextslog;	/* log2 of sb_rextents */ | 
|  | xfs_uint8_t	sb_inprogress;	/* mkfs is in progress, don't mount */ | 
|  | xfs_uint8_t	sb_imax_pct;	/* max % of fs for inode space */ | 
|  | /* statistics */ | 
|  | /* | 
|  | * These fields must remain contiguous.  If you really | 
|  | * want to change their layout, make sure you fix the | 
|  | * code in xfs_trans_apply_sb_deltas(). | 
|  | */ | 
|  | xfs_uint64_t	sb_icount;	/* allocated inodes */ | 
|  | xfs_uint64_t	sb_ifree;	/* free inodes */ | 
|  | xfs_uint64_t	sb_fdblocks;	/* free data blocks */ | 
|  | xfs_uint64_t	sb_frextents;	/* free realtime extents */ | 
|  | /* | 
|  | * End contiguous fields. | 
|  | */ | 
|  | xfs_ino_t	sb_uquotino;	/* user quota inode */ | 
|  | xfs_ino_t	sb_gquotino;	/* group quota inode */ | 
|  | xfs_uint16_t	sb_qflags;	/* quota flags */ | 
|  | xfs_uint8_t	sb_flags;	/* misc. flags */ | 
|  | xfs_uint8_t	sb_shared_vn;	/* shared version number */ | 
|  | xfs_extlen_t	sb_inoalignmt;	/* inode chunk alignment, fsblocks */ | 
|  | xfs_uint32_t	sb_unit;	/* stripe or raid unit */ | 
|  | xfs_uint32_t	sb_width;	/* stripe or raid width */ | 
|  | xfs_uint8_t	sb_dirblklog;	/* log2 of dir block size (fsbs) */ | 
|  | xfs_uint8_t       sb_dummy[7];    /* padding */ | 
|  | } xfs_sb_t; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_btree.h */ | 
|  |  | 
|  | /* | 
|  | * Long form header: bmap btrees. | 
|  | */ | 
|  | typedef struct xfs_btree_lblock | 
|  | { | 
|  | xfs_uint32_t	bb_magic;	/* magic number for block type */ | 
|  | xfs_uint16_t	bb_level;	/* 0 is a leaf */ | 
|  | xfs_uint16_t	bb_numrecs;	/* current # of data records */ | 
|  | xfs_dfsbno_t	bb_leftsib;	/* left sibling block or NULLDFSBNO */ | 
|  | xfs_dfsbno_t	bb_rightsib;	/* right sibling block or NULLDFSBNO */ | 
|  | } xfs_btree_lblock_t; | 
|  |  | 
|  | /* | 
|  | * Combined header and structure, used by common code. | 
|  | */ | 
|  | typedef struct xfs_btree_hdr | 
|  | { | 
|  | xfs_uint32_t	bb_magic;	/* magic number for block type */ | 
|  | xfs_uint16_t	bb_level;	/* 0 is a leaf */ | 
|  | xfs_uint16_t	bb_numrecs;	/* current # of data records */ | 
|  | } xfs_btree_hdr_t; | 
|  |  | 
|  | typedef struct xfs_btree_block | 
|  | { | 
|  | xfs_btree_hdr_t	bb_h;		/* header */ | 
|  | union		{ | 
|  | struct	{ | 
|  | xfs_agblock_t	bb_leftsib; | 
|  | xfs_agblock_t	bb_rightsib; | 
|  | }	s;		/* short form pointers */ | 
|  | struct	{ | 
|  | xfs_dfsbno_t	bb_leftsib; | 
|  | xfs_dfsbno_t	bb_rightsib; | 
|  | }	l;		/* long form pointers */ | 
|  | }		bb_u;		/* rest */ | 
|  | } xfs_btree_block_t; | 
|  |  | 
|  | /* those are from xfs_bmap_btree.h */ | 
|  |  | 
|  | /* | 
|  | * Bmap root header, on-disk form only. | 
|  | */ | 
|  | typedef struct xfs_bmdr_block | 
|  | { | 
|  | xfs_uint16_t	bb_level;	/* 0 is a leaf */ | 
|  | xfs_uint16_t	bb_numrecs;	/* current # of data records */ | 
|  | } xfs_bmdr_block_t; | 
|  |  | 
|  | /* | 
|  | * Bmap btree record and extent descriptor. | 
|  | * For 32-bit kernels, | 
|  | *  l0:31 is an extent flag (value 1 indicates non-normal). | 
|  | *  l0:0-30 and l1:9-31 are startoff. | 
|  | *  l1:0-8, l2:0-31, and l3:21-31 are startblock. | 
|  | *  l3:0-20 are blockcount. | 
|  | * For 64-bit kernels, | 
|  | *  l0:63 is an extent flag (value 1 indicates non-normal). | 
|  | *  l0:9-62 are startoff. | 
|  | *  l0:0-8 and l1:21-63 are startblock. | 
|  | *  l1:0-20 are blockcount. | 
|  | */ | 
|  |  | 
|  | #define	BMBT_USE_64	1 | 
|  |  | 
|  | typedef struct xfs_bmbt_rec_32 | 
|  | { | 
|  | xfs_uint32_t		l0, l1, l2, l3; | 
|  | } xfs_bmbt_rec_32_t; | 
|  | typedef struct xfs_bmbt_rec_64 | 
|  | { | 
|  | xfs_uint64_t		l0, l1; | 
|  | } xfs_bmbt_rec_64_t; | 
|  |  | 
|  | #if BMBT_USE_64 | 
|  | typedef	xfs_uint64_t	xfs_bmbt_rec_base_t;	/* use this for casts */ | 
|  | typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t; | 
|  | #else	/* !BMBT_USE_64 */ | 
|  | typedef	xfs_uint32_t	xfs_bmbt_rec_base_t;	/* use this for casts */ | 
|  | typedef xfs_bmbt_rec_32_t xfs_bmbt_rec_t, xfs_bmdr_rec_t; | 
|  | #endif	/* BMBT_USE_64 */ | 
|  |  | 
|  | /* | 
|  | * Key structure for non-leaf levels of the tree. | 
|  | */ | 
|  | typedef struct xfs_bmbt_key | 
|  | { | 
|  | xfs_dfiloff_t	br_startoff;	/* starting file offset */ | 
|  | } xfs_bmbt_key_t, xfs_bmdr_key_t; | 
|  |  | 
|  | typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;	/* btree pointer type */ | 
|  | /* btree block header type */ | 
|  | typedef	struct xfs_btree_lblock xfs_bmbt_block_t; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_dir2.h */ | 
|  | /* | 
|  | * Directory version 2. | 
|  | * There are 4 possible formats: | 
|  | *	shortform | 
|  | *	single block - data with embedded leaf at the end | 
|  | *	multiple data blocks, single leaf+freeindex block | 
|  | *	data blocks, node&leaf blocks (btree), freeindex blocks | 
|  | * | 
|  | *	The shortform format is in xfs_dir2_sf.h. | 
|  | *	The single block format is in xfs_dir2_block.h. | 
|  | *	The data block format is in xfs_dir2_data.h. | 
|  | *	The leaf and freeindex block formats are in xfs_dir2_leaf.h. | 
|  | *	Node blocks are the same as the other version, in xfs_da_btree.h. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Byte offset in data block and shortform entry. | 
|  | */ | 
|  | typedef	xfs_uint16_t	xfs_dir2_data_off_t; | 
|  |  | 
|  | /* | 
|  | * Byte offset in a directory. | 
|  | */ | 
|  | typedef	xfs_off_t		xfs_dir2_off_t; | 
|  |  | 
|  | /* those are from xfs_da_btree.h */ | 
|  | /*======================================================================== | 
|  | * Directory Structure when greater than XFS_LBSIZE(mp) bytes. | 
|  | *========================================================================*/ | 
|  |  | 
|  | /* | 
|  | * This structure is common to both leaf nodes and non-leaf nodes in the Btree. | 
|  | * | 
|  | * Is is used to manage a doubly linked list of all blocks at the same | 
|  | * level in the Btree, and to identify which type of block this is. | 
|  | */ | 
|  | #define	XFS_DIR2_LEAF1_MAGIC	0xd2f1	/* magic number: v2 dirlf single blks */ | 
|  | #define	XFS_DIR2_LEAFN_MAGIC	0xd2ff	/* magic number: v2 dirlf multi blks */ | 
|  |  | 
|  | typedef struct xfs_da_blkinfo { | 
|  | xfs_dablk_t forw;			/* previous block in list */ | 
|  | xfs_dablk_t back;			/* following block in list */ | 
|  | xfs_uint16_t magic;			/* validity check on block */ | 
|  | xfs_uint16_t pad;				/* unused */ | 
|  | } xfs_da_blkinfo_t; | 
|  |  | 
|  | /* | 
|  | * This is the structure of the root and intermediate nodes in the Btree. | 
|  | * The leaf nodes are defined above. | 
|  | * | 
|  | * Entries are not packed. | 
|  | * | 
|  | * Since we have duplicate keys, use a binary search but always follow | 
|  | * all match in the block, not just the first match found. | 
|  | */ | 
|  |  | 
|  | typedef struct xfs_da_intnode { | 
|  | struct xfs_da_node_hdr {	/* constant-structure header block */ | 
|  | xfs_da_blkinfo_t info;	/* block type, links, etc. */ | 
|  | xfs_uint16_t count;	/* count of active entries */ | 
|  | xfs_uint16_t level;	/* level above leaves (leaf == 0) */ | 
|  | } hdr; | 
|  | struct xfs_da_node_entry { | 
|  | xfs_dahash_t hashval;	/* hash value for this descendant */ | 
|  | xfs_dablk_t before;	/* Btree block before this key */ | 
|  | } btree[1];			/* variable sized array of keys */ | 
|  | } xfs_da_intnode_t; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_dir2_data.h */ | 
|  | /* | 
|  | * Directory format 2, data block structures. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Constants. | 
|  | */ | 
|  | #define	XFS_DIR2_DATA_FREE_TAG	0xffff | 
|  | #define	XFS_DIR2_DATA_FD_COUNT	3 | 
|  |  | 
|  | /* | 
|  | * Structures. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Describe a free area in the data block. | 
|  | * The freespace will be formatted as a xfs_dir2_data_unused_t. | 
|  | */ | 
|  | typedef struct xfs_dir2_data_free { | 
|  | xfs_dir2_data_off_t	offset;		/* start of freespace */ | 
|  | xfs_dir2_data_off_t	length;		/* length of freespace */ | 
|  | } xfs_dir2_data_free_t; | 
|  |  | 
|  | /* | 
|  | * Header for the data blocks. | 
|  | * Always at the beginning of a directory-sized block. | 
|  | * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. | 
|  | */ | 
|  | typedef struct xfs_dir2_data_hdr { | 
|  | xfs_uint32_t		magic;		/* XFS_DIR2_DATA_MAGIC */ | 
|  | /* or XFS_DIR2_BLOCK_MAGIC */ | 
|  | xfs_dir2_data_free_t	bestfree[XFS_DIR2_DATA_FD_COUNT]; | 
|  | } xfs_dir2_data_hdr_t; | 
|  |  | 
|  | /* | 
|  | * Active entry in a data block.  Aligned to 8 bytes. | 
|  | * Tag appears as the last 2 bytes. | 
|  | */ | 
|  | typedef struct xfs_dir2_data_entry { | 
|  | xfs_ino_t		inumber;	/* inode number */ | 
|  | xfs_uint8_t		namelen;	/* name length */ | 
|  | xfs_uint8_t		name[1];	/* name bytes, no null */ | 
|  | /* variable offset */ | 
|  | xfs_dir2_data_off_t	tag;		/* starting offset of us */ | 
|  | } xfs_dir2_data_entry_t; | 
|  |  | 
|  | /* | 
|  | * Unused entry in a data block.  Aligned to 8 bytes. | 
|  | * Tag appears as the last 2 bytes. | 
|  | */ | 
|  | typedef struct xfs_dir2_data_unused { | 
|  | xfs_uint16_t		freetag;	/* XFS_DIR2_DATA_FREE_TAG */ | 
|  | xfs_dir2_data_off_t	length;		/* total free length */ | 
|  | /* variable offset */ | 
|  | xfs_dir2_data_off_t	tag;		/* starting offset of us */ | 
|  | } xfs_dir2_data_unused_t; | 
|  |  | 
|  | typedef union { | 
|  | xfs_dir2_data_entry_t	entry; | 
|  | xfs_dir2_data_unused_t	unused; | 
|  | } xfs_dir2_data_union_t; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_dir2_leaf.h */ | 
|  | /* | 
|  | * Directory version 2, leaf block structures. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Leaf block header. | 
|  | */ | 
|  | typedef struct xfs_dir2_leaf_hdr { | 
|  | xfs_da_blkinfo_t	info;		/* header for da routines */ | 
|  | xfs_uint16_t		count;		/* count of entries */ | 
|  | xfs_uint16_t		stale;		/* count of stale entries */ | 
|  | } xfs_dir2_leaf_hdr_t; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_dir2_block.h */ | 
|  | /* | 
|  | * xfs_dir2_block.h | 
|  | * Directory version 2, single block format structures | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * The single block format is as follows: | 
|  | * xfs_dir2_data_hdr_t structure | 
|  | * xfs_dir2_data_entry_t and xfs_dir2_data_unused_t structures | 
|  | * xfs_dir2_leaf_entry_t structures | 
|  | * xfs_dir2_block_tail_t structure | 
|  | */ | 
|  |  | 
|  | #define	XFS_DIR2_BLOCK_MAGIC	0x58443242	/* XD2B: for one block dirs */ | 
|  |  | 
|  | typedef struct xfs_dir2_block_tail { | 
|  | xfs_uint32_t	count;			/* count of leaf entries */ | 
|  | xfs_uint32_t	stale;			/* count of stale lf entries */ | 
|  | } xfs_dir2_block_tail_t; | 
|  |  | 
|  |  | 
|  | /* those are from xfs_dir2_sf.h */ | 
|  |  | 
|  | /* | 
|  | * Directory layout when stored internal to an inode. | 
|  | * | 
|  | * Small directories are packed as tightly as possible so as to | 
|  | * fit into the literal area of the inode. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Inode number stored as 8 8-bit values. | 
|  | */ | 
|  | typedef	struct { xfs_uint8_t i[8]; } xfs_dir2_ino8_t; | 
|  |  | 
|  | /* | 
|  | * Inode number stored as 4 8-bit values. | 
|  | * Works a lot of the time, when all the inode numbers in a directory | 
|  | * fit in 32 bits. | 
|  | */ | 
|  | typedef struct { xfs_uint8_t i[4]; } xfs_dir2_ino4_t; | 
|  |  | 
|  | typedef union { | 
|  | xfs_dir2_ino8_t	i8; | 
|  | xfs_dir2_ino4_t	i4; | 
|  | } xfs_dir2_inou_t; | 
|  |  | 
|  | /* | 
|  | * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. | 
|  | * Only need 16 bits, this is the byte offset into the single block form. | 
|  | */ | 
|  | typedef struct { xfs_uint8_t i[2]; } xfs_dir2_sf_off_t; | 
|  |  | 
|  | /* | 
|  | * The parent directory has a dedicated field, and the self-pointer must | 
|  | * be calculated on the fly. | 
|  | * | 
|  | * Entries are packed toward the top as tightly as possible.  The header | 
|  | * and the elements must be bcopy()'d out into a work area to get correct | 
|  | * alignment for the inode number fields. | 
|  | */ | 
|  | typedef struct xfs_dir2_sf_hdr { | 
|  | xfs_uint8_t		count;		/* count of entries */ | 
|  | xfs_uint8_t		i8count;	/* count of 8-byte inode #s */ | 
|  | xfs_dir2_inou_t		parent;		/* parent dir inode number */ | 
|  | } xfs_dir2_sf_hdr_t; | 
|  |  | 
|  | typedef struct xfs_dir2_sf_entry { | 
|  | xfs_uint8_t		namelen;	/* actual name length */ | 
|  | xfs_dir2_sf_off_t	offset;		/* saved offset */ | 
|  | xfs_uint8_t		name[1];	/* name, variable size */ | 
|  | xfs_dir2_inou_t		inumber;	/* inode number, var. offset */ | 
|  | } xfs_dir2_sf_entry_t; | 
|  |  | 
|  | typedef struct xfs_dir2_sf { | 
|  | xfs_dir2_sf_hdr_t	hdr;		/* shortform header */ | 
|  | xfs_dir2_sf_entry_t	list[1];	/* shortform entries */ | 
|  | } xfs_dir2_sf_t; | 
|  |  | 
|  | /* those are from xfs_dinode.h */ | 
|  |  | 
|  | #define	XFS_DINODE_VERSION_1	1 | 
|  | #define	XFS_DINODE_VERSION_2	2 | 
|  | #define	XFS_DINODE_MAGIC	0x494e	/* 'IN' */ | 
|  |  | 
|  | /* | 
|  | * Disk inode structure. | 
|  | * This is just the header; the inode is expanded to fill a variable size | 
|  | * with the last field expanding.  It is split into the core and "other" | 
|  | * because we only need the core part in the in-core inode. | 
|  | */ | 
|  | typedef struct xfs_timestamp { | 
|  | xfs_int32_t	t_sec;		/* timestamp seconds */ | 
|  | xfs_int32_t	t_nsec;		/* timestamp nanoseconds */ | 
|  | } xfs_timestamp_t; | 
|  |  | 
|  | /* | 
|  | * Note: Coordinate changes to this structure with the XFS_DI_* #defines | 
|  | * below and the offsets table in xfs_ialloc_log_di(). | 
|  | */ | 
|  | typedef struct xfs_dinode_core | 
|  | { | 
|  | xfs_uint16_t	di_magic;	/* inode magic # = XFS_DINODE_MAGIC */ | 
|  | xfs_uint16_t	di_mode;	/* mode and type of file */ | 
|  | xfs_int8_t	di_version;	/* inode version */ | 
|  | xfs_int8_t	di_format;	/* format of di_c data */ | 
|  | xfs_uint16_t	di_onlink;	/* old number of links to file */ | 
|  | xfs_uint32_t	di_uid;		/* owner's user id */ | 
|  | xfs_uint32_t	di_gid;		/* owner's group id */ | 
|  | xfs_uint32_t	di_nlink;	/* number of links to file */ | 
|  | xfs_uint16_t	di_projid;	/* owner's project id */ | 
|  | xfs_uint8_t	di_pad[10];	/* unused, zeroed space */ | 
|  | xfs_timestamp_t	di_atime;	/* time last accessed */ | 
|  | xfs_timestamp_t	di_mtime;	/* time last modified */ | 
|  | xfs_timestamp_t	di_ctime;	/* time created/inode modified */ | 
|  | xfs_fsize_t	di_size;	/* number of bytes in file */ | 
|  | xfs_drfsbno_t	di_nblocks;	/* # of direct & btree blocks used */ | 
|  | xfs_extlen_t	di_extsize;	/* basic/minimum extent size for file */ | 
|  | xfs_extnum_t	di_nextents;	/* number of extents in data fork */ | 
|  | xfs_aextnum_t	di_anextents;	/* number of extents in attribute fork*/ | 
|  | xfs_uint8_t	di_forkoff;	/* attr fork offs, <<3 for 64b align */ | 
|  | xfs_int8_t	di_aformat;	/* format of attr fork's data */ | 
|  | xfs_uint32_t	di_dmevmask;	/* DMIG event mask */ | 
|  | xfs_uint16_t	di_dmstate;	/* DMIG state info */ | 
|  | xfs_uint16_t	di_flags;	/* random flags, XFS_DIFLAG_... */ | 
|  | xfs_uint32_t	di_gen;		/* generation number */ | 
|  | } xfs_dinode_core_t; | 
|  |  | 
|  | typedef struct xfs_dinode | 
|  | { | 
|  | xfs_dinode_core_t	di_core; | 
|  | xfs_agino_t		di_next_unlinked;/* agi unlinked list ptr */ | 
|  | union { | 
|  | xfs_bmdr_block_t di_bmbt;	/* btree root block */ | 
|  | xfs_bmbt_rec_32_t di_bmx[1];	/* extent list */ | 
|  | xfs_dir2_sf_t	di_dir2sf;	/* shortform directory v2 */ | 
|  | char		di_c[1];	/* local contents */ | 
|  | } di_u; | 
|  | } xfs_dinode_t; | 
|  |  | 
|  | /* | 
|  | * Values for di_format | 
|  | */ | 
|  | typedef enum xfs_dinode_fmt | 
|  | { | 
|  | XFS_DINODE_FMT_DEV,		/* CHR, BLK: di_dev */ | 
|  | XFS_DINODE_FMT_LOCAL,		/* DIR, REG: di_c */ | 
|  | /* LNK: di_symlink */ | 
|  | XFS_DINODE_FMT_EXTENTS,		/* DIR, REG, LNK: di_bmx */ | 
|  | XFS_DINODE_FMT_BTREE,		/* DIR, REG, LNK: di_bmbt */ | 
|  | XFS_DINODE_FMT_UUID 		/* MNT: di_uuid */ | 
|  | } xfs_dinode_fmt_t; | 
|  |  | 
|  | /* | 
|  | * File types (mode field) | 
|  | */ | 
|  | #define	IFMT		0170000		/* type of file */ | 
|  | #define	IFDIR		0040000		/* directory */ | 
|  | #define	IFREG		0100000		/* regular */ | 
|  | #define	IFLNK		0120000		/* symbolic link */ |