1 /*
2  * Copyright (c) 2000-2001 Christoph Hellwig.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions, and the following disclaimer,
10  *    without modification.
11  * 2. The name of the author may not be used to endorse or promote products
12  *    derived from this software without specific prior written permission.
13  *
14  * Alternatively, this software may be distributed under the terms of the
15  * GNU General Public License ("GPL").
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  */
30 #ifndef _VXFS_INODE_H_
31 #define _VXFS_INODE_H_
32 
33 #ident "$Id: vxfs_inode.h,v 1.15 2001/05/26 22:41:23 hch Exp hch $"
34 
35 /*
36  * Veritas filesystem driver - inode structure.
37  *
38  * This file contains the definition of the disk and core
39  * inodes of the Veritas Filesystem.
40  */
41 
42 
43 #define VXFS_ISIZE		0x100		/* Inode size */
44 
45 #define VXFS_NDADDR		10		/* Number of direct addrs in inode */
46 #define VXFS_NIADDR		2		/* Number of indirect addrs in inode */
47 #define VXFS_NIMMED		96		/* Size of immediate data in inode */
48 #define VXFS_NTYPED		6		/* Num of typed extents */
49 
50 #define VXFS_TYPED_OFFSETMASK	(0x00FFFFFFFFFFFFFFULL)
51 #define VXFS_TYPED_TYPEMASK	(0xFF00000000000000ULL)
52 #define VXFS_TYPED_TYPESHIFT	56
53 
54 #define VXFS_TYPED_PER_BLOCK(sbp) \
55 	((sbp)->s_blocksize / sizeof(struct vxfs_typed))
56 
57 /*
58  * Possible extent descriptor types for %VXFS_ORG_TYPED extents.
59  */
60 enum {
61 	VXFS_TYPED_INDIRECT		= 1,
62 	VXFS_TYPED_DATA			= 2,
63 	VXFS_TYPED_INDIRECT_DEV4	= 3,
64 	VXFS_TYPED_DATA_DEV4		= 4,
65 };
66 
67 /*
68  * Data stored immediately in the inode.
69  */
70 struct vxfs_immed {
71 	u_int8_t	vi_immed[VXFS_NIMMED];
72 };
73 
74 struct vxfs_ext4 {
75 	u_int32_t		ve4_spare;		/* ?? */
76 	u_int32_t		ve4_indsize;		/* Indirect extent size */
77 	vx_daddr_t		ve4_indir[VXFS_NIADDR];	/* Indirect extents */
78 	struct direct {					/* Direct extents */
79 		vx_daddr_t	extent;			/* Extent number */
80 		int32_t		size;			/* Size of extent */
81 	} ve4_direct[VXFS_NDADDR];
82 };
83 
84 struct vxfs_typed {
85 	u_int64_t	vt_hdr;		/* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
86 	vx_daddr_t	vt_block;	/* Extent block */
87 	int32_t		vt_size;	/* Size in blocks */
88 };
89 
90 struct vxfs_typed_dev4 {
91 	u_int64_t	vd4_hdr;	/* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
92 	u_int64_t	vd4_block;	/* Extent block */
93 	u_int64_t	vd4_size;	/* Size in blocks */
94 	int32_t		vd4_dev;	/* Device ID */
95 	u_int32_t	__pad1;
96 };
97 
98 /*
99  * The inode as contained on the physical device.
100  */
101 struct vxfs_dinode {
102 	int32_t		vdi_mode;
103 	u_int32_t	vdi_nlink;	/* Link count */
104 	u_int32_t	vdi_uid;	/* UID */
105 	u_int32_t	vdi_gid;	/* GID */
106 	u_int64_t	vdi_size;	/* Inode size in bytes */
107 	u_int32_t	vdi_atime;	/* Last time accessed - sec */
108 	u_int32_t	vdi_autime;	/* Last time accessed - usec */
109 	u_int32_t	vdi_mtime;	/* Last modify time - sec */
110 	u_int32_t	vdi_mutime;	/* Last modify time - usec */
111 	u_int32_t	vdi_ctime;	/* Create time - sec */
112 	u_int32_t	vdi_cutime;	/* Create time - usec */
113 	u_int8_t	vdi_aflags;	/* Allocation flags */
114 	u_int8_t	vdi_orgtype;	/* Organisation type */
115 	u_int16_t	vdi_eopflags;
116 	u_int32_t	vdi_eopdata;
117 	union {
118 		u_int32_t		rdev;
119 		u_int32_t		dotdot;
120 		struct {
121 			u_int32_t	reserved;
122 			u_int32_t	fixextsize;
123 		} i_regular;
124 		struct {
125 			u_int32_t	matchino;
126 			u_int32_t	fsetindex;
127 		} i_vxspec;
128 		u_int64_t		align;
129 	} vdi_ftarea;
130 	u_int32_t	vdi_blocks;	/* How much blocks does inode occupy */
131 	u_int32_t	vdi_gen;	/* Inode generation */
132 	u_int64_t	vdi_version;	/* Version */
133 	union {
134 		struct vxfs_immed	immed;
135 		struct vxfs_ext4	ext4;
136 		struct vxfs_typed	typed[VXFS_NTYPED];
137 	} vdi_org;
138 	u_int32_t	vdi_iattrino;
139 };
140 
141 #define vdi_rdev	vdi_ftarea.rdev
142 #define vdi_dotdot	vdi_ftarea.dotdot
143 #define vdi_fixextsize	vdi_ftarea.regular.fixextsize
144 #define vdi_matchino	vdi_ftarea.vxspec.matchino
145 #define vdi_fsetindex	vdi_ftarea.vxspec.fsetindex
146 
147 #define vdi_immed	vdi_org.immed
148 #define vdi_ext4	vdi_org.ext4
149 #define vdi_typed	vdi_org.typed
150 
151 
152 /*
153  * The inode as represented in the main memory.
154  *
155  * TBD: This should become a separate structure...
156  */
157 #define vxfs_inode_info	vxfs_dinode
158 
159 #define vii_mode	vdi_mode
160 #define vii_uid		vdi_uid
161 #define vii_gid		vdi_gid
162 #define vii_nlink	vdi_nlink
163 #define vii_size	vdi_size
164 #define vii_atime	vdi_atime
165 #define vii_ctime	vdi_ctime
166 #define vii_mtime	vdi_mtime
167 #define vii_blocks	vdi_blocks
168 #define vii_org		vdi_org
169 #define vii_orgtype	vdi_orgtype
170 #define vii_gen		vdi_gen
171 
172 #define vii_rdev	vdi_ftarea.rdev
173 #define vii_dotdot	vdi_ftarea.dotdot
174 #define vii_fixextsize	vdi_ftarea.regular.fixextsize
175 #define vii_matchino	vdi_ftarea.vxspec.matchino
176 #define vii_fsetindex	vdi_ftarea.vxspec.fsetindex
177 
178 #define vii_immed	vdi_org.immed
179 #define vii_ext4	vdi_org.ext4
180 #define vii_typed	vdi_org.typed
181 
182 #endif /* _VXFS_INODE_H_ */
183