xref: /onnv-gate/usr/src/lib/libparted/common/libparted/fs/ext2/ext2_fs.h (revision 9663:ace9a2ac3683)
1 /*
2  *  linux/include/linux/ext2_fs.h
3  *
4  * Copyright (C) 1992, 1993, 1994, 1995
5  * Remy Card (card@masi.ibp.fr)
6  * Laboratoire MASI - Institut Blaise Pascal
7  * Universite Pierre et Marie Curie (Paris VI)
8  *
9  *  from
10  *
11  *  linux/include/linux/minix_fs.h
12  *
13  *  Copyright (C) 1991, 1992  Linus Torvalds
14  */
15 
16 /*
17  * EXT2_*_*() convienience macros added by Andrew Clausen <clausen@gnu.org>
18  * Copyright (C) 2000 Free Software Foundation, Inc.
19  */
20 
21 #ifndef _EXT2_FS_H
22 #define _EXT2_FS_H
23 
24 #include <parted/endian.h>
25 #include <stdint.h>
26 
27 /*
28  * The second extended file system constants/structures
29  */
30 
31 #define EXT2_SUPER_MAGIC_CONST	0xEF53
32 #define EXT2_MIN_BLOCK_SIZE	1024
33 #define EXT2_NDIR_BLOCKS	12
34 #define EXT2_IND_BLOCK		EXT2_NDIR_BLOCKS
35 #define EXT2_DIND_BLOCK		(EXT2_IND_BLOCK + 1)
36 #define EXT2_TIND_BLOCK		(EXT2_DIND_BLOCK + 1)
37 #define EXT2_N_BLOCKS		(EXT2_TIND_BLOCK + 1)
38 #define EXT2_VALID_FS		0x0001
39 #define EXT2_ERROR_FS		0x0002
40 #define EXT2_RESERVED_INODE_COUNT	11
41 
42 /*
43  * Codes for operating systems
44  */
45 #define EXT2_OS_LINUX		0
46 #define EXT2_OS_HURD		1
47 #define EXT2_OS_MASIX		2
48 #define EXT2_OS_FREEBSD		3
49 #define EXT2_OS_LITES		4
50 
51 /*
52  * Feature set definitions
53  */
54 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL		0x0004
55 #define EXT2_FEATURE_COMPAT_HAS_DIR_INDEX	0x0020
56 
57 #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001
58 #define EXT2_FEATURE_RO_COMPAT_LARGE_FILE	0x0002
59 
60 #define EXT2_FEATURE_INCOMPAT_FILETYPE		0x0002
61 #define EXT3_FEATURE_INCOMPAT_RECOVER		0x0004
62 
63 /*
64  * Special inodes numbers
65  */
66 #define EXT2_BAD_INO		 1	/* Bad blocks inode */
67 #define EXT2_ROOT_INO		 2	/* Root inode */
68 #define EXT2_ACL_IDX_INO	 3	/* ACL inode */
69 #define EXT2_ACL_DATA_INO	 4	/* ACL inode */
70 #define EXT2_BOOT_LOADER_INO	 5	/* Boot loader inode */
71 #define EXT2_UNDEL_DIR_INO	 6	/* Undelete directory inode */
72 
73 /*
74  * Ext2 directory file types.  Only the low 3 bits are used.  The
75  * other bits are reserved for now.
76  */
77 #define EXT2_FT_UNKNOWN		0
78 #define EXT2_FT_REG_FILE	1
79 #define EXT2_FT_DIR		2
80 #define EXT2_FT_CHRDEV		3
81 #define EXT2_FT_BLKDEV 		4
82 #define EXT2_FT_FIFO		5
83 #define EXT2_FT_SOCK		6
84 #define EXT2_FT_SYMLINK		7
85 
86 /*
87  * Behaviour when detecting errors
88  */
89 #define EXT2_ERRORS_CONTINUE		1	/* Continue execution */
90 #define EXT2_ERRORS_RO			2	/* Remount fs read-only */
91 #define EXT2_ERRORS_PANIC		3	/* Panic */
92 #define EXT2_ERRORS_DEFAULT		EXT2_ERRORS_CONTINUE
93 
94 struct ext2_dir_entry_2
95 {
96 	uint32_t	inode;
97 	uint16_t	rec_len;
98 	uint8_t		name_len;
99 	uint8_t		file_type;
100 	char		name[255];
101 };
102 
103 struct ext2_group_desc
104 {
105 	uint32_t	bg_block_bitmap;
106 	uint32_t	bg_inode_bitmap;
107 	uint32_t	bg_inode_table;
108 	uint16_t	bg_free_blocks_count;
109 	uint16_t	bg_free_inodes_count;
110 	uint16_t	bg_used_dirs_count;
111 	uint16_t	bg_pad;
112 	uint32_t	bg_reserved[3];
113 };
114 
115 struct ext2_inode
116 {
117 	uint16_t	i_mode;		/* File mode */
118 	uint16_t	i_uid;		/* Owner Uid */
119 	uint32_t	i_size;		/* Size in bytes */
120 	uint32_t	i_atime;	/* Access time */
121 	uint32_t	i_ctime;	/* Creation time */
122 	uint32_t	i_mtime;	/* Modification time */
123 	uint32_t	i_dtime;	/* Deletion Time */
124 	uint16_t	i_gid;		/* Group Id */
125 	uint16_t	i_links_count;	/* Links count */
126 	uint32_t	i_blocks;	/* Blocks count */
127 	uint32_t	i_flags;	/* File flags */
128 	union {
129 		struct {
130 			uint32_t	l_i_reserved1;
131 		} linux1;
132 		struct {
133 			uint32_t	h_i_translator;
134 		} hurd1;
135 		struct {
136 			uint32_t	m_i_reserved1;
137 		} masix1;
138 	} osd1;			/* OS dependent 1 */
139 	uint32_t	i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
140 	uint32_t	i_generation;	/* File version (for NFS) */
141 	uint32_t	i_file_acl;	/* File ACL */
142 	uint32_t	i_dir_acl;	/* Directory ACL */
143 	uint32_t	i_faddr;	/* Fragment address */
144 	union {
145 		struct {
146 			uint8_t		l_i_frag;	/* Fragment number */
147 			uint8_t		l_i_fsize;	/* Fragment size */
148 			uint16_t	i_pad1;
149 			uint32_t	l_i_reserved2[2];
150 		} linux2;
151 		struct {
152 			uint8_t		h_i_frag;	/* Fragment number */
153 			uint8_t		h_i_fsize;	/* Fragment size */
154 			uint16_t	h_i_mode_high;
155 			uint16_t	h_i_uid_high;
156 			uint16_t	h_i_gid_high;
157 			uint32_t	h_i_author;
158 		} hurd2;
159 		struct {
160 			uint8_t		m_i_frag;	/* Fragment number */
161 			uint8_t		m_i_fsize;	/* Fragment size */
162 			uint16_t	m_pad1;
163 			uint32_t	m_i_reserved2[2];
164 		} masix2;
165 	} osd2;					/* OS dependent 2 */
166 };
167 
168 #define i_size_high	i_dir_acl
169 
170 struct ext2_super_block
171 {
172 	uint32_t	s_inodes_count;		/* Inodes count */
173 	uint32_t	s_blocks_count;		/* Blocks count */
174 	uint32_t	s_r_blocks_count;	/* Reserved blocks count */
175 	uint32_t	s_free_blocks_count;	/* Free blocks count */
176 	uint32_t	s_free_inodes_count;	/* Free inodes count */
177 	uint32_t	s_first_data_block;	/* First Data Block */
178 	uint32_t	s_log_block_size;	/* Block size */
179 	int32_t		s_log_frag_size;	/* Fragment size */
180 	uint32_t	s_blocks_per_group;	/* # Blocks per group */
181 	uint32_t	s_frags_per_group;	/* # Fragments per group */
182 	uint32_t	s_inodes_per_group;	/* # Inodes per group */
183 	uint32_t	s_mtime;		/* Mount time */
184 	uint32_t	s_wtime;		/* Write time */
185 	uint16_t	s_mnt_count;		/* Mount count */
186 	int16_t		s_max_mnt_count;	/* Maximal mount count */
187 	uint16_t	s_magic;		/* Magic signature */
188 	uint16_t	s_state;		/* File system state */
189 	uint16_t	s_errors;		/* Behaviour when detecting errors */
190 	uint16_t	s_minor_rev_level;	/* minor revision level */
191 	uint32_t	s_lastcheck;		/* time of last check */
192 	uint32_t	s_checkinterval;	/* max. time between checks */
193 	uint32_t	s_creator_os;		/* OS */
194 	uint32_t	s_rev_level;		/* Revision level */
195 	uint16_t	s_def_resuid;		/* Default uid for reserved blocks */
196 	uint16_t	s_def_resgid;		/* Default gid for reserved blocks */
197 	/*
198 	 * These fields are for EXT2_DYNAMIC_REV superblocks only.
199 	 *
200 	 * Note: the difference between the compatible feature set and
201 	 * the incompatible feature set is that if there is a bit set
202 	 * in the incompatible feature set that the kernel doesn't
203 	 * know about, it should refuse to mount the file system.
204 	 *
205 	 * e2fsck's requirements are more strict; if it doesn't know
206 	 * about a feature in either the compatible or incompatible
207 	 * feature set, it must abort and not try to meddle with
208 	 * things it doesn't understand...
209 	 */
210 	uint32_t	s_first_ino;		/* First non-reserved inode */
211 	uint16_t	s_inode_size;		/* size of inode structure */
212 	uint16_t	s_block_group_nr;	/* block group # of this superblock */
213 	uint32_t	s_feature_compat;	/* compatible feature set */
214 	uint32_t	s_feature_incompat;	/* incompatible feature set */
215 	uint32_t	s_feature_ro_compat;	/* readonly-compatible feature set */
216 	uint8_t		s_uuid[16];		/* 128-bit uuid for volume */
217 	char		s_volume_name[16];	/* volume name */
218 	char		s_last_mounted[64];	/* directory where last mounted */
219 	uint32_t	s_algorithm_usage_bitmap;  /* For compression */
220 	/*
221 	 * Performance hints.  Directory preallocation should only
222 	 * happen if the EXT2_COMPAT_PREALLOC flag is on.
223 	 */
224 	uint8_t		s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/
225 	uint8_t		s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */
226 	uint16_t	s_padding1;
227 	/*
228 	 * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
229 	 */
230 	uint8_t		s_journal_uuid[16];	/* uuid of journal superblock */
231 	uint32_t	s_journal_inum;		/* inode number of journal file */
232 	uint32_t	s_journal_dev;		/* device number of journal file */
233 	uint32_t	s_last_orphan;		/* start of list of inodes to delete */
234 
235 	uint32_t	s_reserved[197];	/* Padding to the end of the block */
236 };
237 
238 #define EXT2_DIRENT_INODE(dir_ent)	(PED_LE32_TO_CPU((dir_ent).inode))
239 #define EXT2_DIRENT_REC_LEN(dir_ent)	(PED_LE16_TO_CPU((dir_ent).rec_len))
240 #define EXT2_DIRENT_NAME_LEN(dir_ent)	((dir_ent).name_len)
241 #define EXT2_DIRENT_FILE_TYPE(dir_ent)	((dir_ent).file_type)
242 
243 #define EXT2_GROUP_BLOCK_BITMAP(gd)	(PED_LE32_TO_CPU((gd).bg_block_bitmap))
244 #define EXT2_GROUP_INODE_BITMAP(gd)	(PED_LE32_TO_CPU((gd).bg_inode_bitmap))
245 #define EXT2_GROUP_INODE_TABLE(gd)	(PED_LE32_TO_CPU((gd).bg_inode_table))
246 #define EXT2_GROUP_FREE_BLOCKS_COUNT(gd) \
247 		(PED_LE16_TO_CPU((gd).bg_free_blocks_count))
248 #define EXT2_GROUP_FREE_INODES_COUNT(gd) \
249 		(PED_LE16_TO_CPU((gd).bg_free_inodes_count))
250 #define EXT2_GROUP_USED_DIRS_COUNT(gd) \
251 		(PED_LE16_TO_CPU((gd).bg_used_dirs_count))
252 
253 #define EXT2_INODE_MODE(inode)		(PED_LE16_TO_CPU((inode).i_mode))
254 #define EXT2_INODE_UID(inode)		(PED_LE16_TO_CPU((inode).i_uid))
255 #define EXT2_INODE_SIZE(inode) \
256 	((uint64_t) PED_LE32_TO_CPU((inode).i_size) \
257 	+ ((uint64_t) PED_LE32_TO_CPU((inode).i_size_high) << 32))
258 #define EXT2_INODE_ATIME(inode)		(PED_LE32_TO_CPU((inode).i_atime))
259 #define EXT2_INODE_CTIME(inode)		(PED_LE32_TO_CPU((inode).i_ctime))
260 #define EXT2_INODE_MTIME(inode)		(PED_LE32_TO_CPU((inode).i_mtime))
261 #define EXT2_INODE_DTIME(inode)		(PED_LE32_TO_CPU((inode).i_dtime))
262 #define EXT2_INODE_GID(inode)		(PED_LE16_TO_CPU((inode).i_gid))
263 #define EXT2_INODE_LINKS_COUNT(inode)	(PED_LE16_TO_CPU((inode).i_links_count))
264 #define EXT2_INODE_BLOCKS(inode)	(PED_LE32_TO_CPU((inode).i_blocks))
265 #define EXT2_INODE_FLAGS(inode)		(PED_LE32_TO_CPU((inode).i_flags))
266 #define EXT2_INODE_TRANSLATOR(inode)	(PED_LE32_TO_CPU((inode).osd1.hurd1.h_i_translator))
267 #define EXT2_INODE_BLOCK(inode, blk)	(PED_LE32_TO_CPU((inode).i_block[blk]))
268 
269 #define EXT2_SUPER_INODES_COUNT(sb)	(PED_LE32_TO_CPU((sb).s_inodes_count))
270 #define EXT2_SUPER_BLOCKS_COUNT(sb)	(PED_LE32_TO_CPU((sb).s_blocks_count))
271 #define EXT2_SUPER_R_BLOCKS_COUNT(sb)	(PED_LE32_TO_CPU((sb).s_r_blocks_count))
272 #define EXT2_SUPER_FREE_BLOCKS_COUNT(sb) \
273 		(PED_LE32_TO_CPU((sb).s_free_blocks_count))
274 #define EXT2_SUPER_FREE_INODES_COUNT(sb) \
275 		(PED_LE32_TO_CPU((sb).s_free_inodes_count))
276 #define EXT2_SUPER_FIRST_DATA_BLOCK(sb) \
277 		(PED_LE32_TO_CPU((sb).s_first_data_block))
278 #define EXT2_SUPER_LOG_BLOCK_SIZE(sb)	(PED_LE32_TO_CPU((sb).s_log_block_size))
279 #define EXT2_SUPER_LOG_FRAG_SIZE(sb) \
280 		((int32_t) PED_LE32_TO_CPU((sb).s_log_frag_size))
281 #define EXT2_SUPER_BLOCKS_PER_GROUP(sb)	\
282 		(PED_LE32_TO_CPU((sb).s_blocks_per_group))
283 #define EXT2_SUPER_FRAGS_PER_GROUP(sb) \
284 	(PED_LE32_TO_CPU((sb).s_frags_per_group))
285 #define EXT2_SUPER_INODES_PER_GROUP(sb)	\
286 	(PED_LE32_TO_CPU((sb).s_inodes_per_group))
287 #define EXT2_SUPER_MTIME(sb)		(PED_LE32_TO_CPU((sb).s_mtime))
288 #define EXT2_SUPER_WTIME(sb)		(PED_LE32_TO_CPU((sb).s_wtime))
289 #define EXT2_SUPER_MNT_COUNT(sb)	(PED_LE16_TO_CPU((sb).s_mnt_count))
290 #define EXT2_SUPER_MAX_MNT_COUNT(sb) \
291 		((int16_t) PED_LE16_TO_CPU((sb).s_max_mnt_count))
292 #define EXT2_SUPER_MAGIC(sb)		(PED_LE16_TO_CPU((sb).s_magic))
293 #define EXT2_SUPER_STATE(sb)		(PED_LE16_TO_CPU((sb).s_state))
294 #define EXT2_SUPER_ERRORS(sb)		(PED_LE16_TO_CPU((sb).s_errors))
295 #define EXT2_SUPER_MINOR_REV_LEVEL(sb) \
296 		(PED_LE16_TO_CPU((sb).s_minor_rev_level))
297 #define EXT2_SUPER_LASTCHECK(sb)	(PED_LE32_TO_CPU((sb).s_lastcheck))
298 #define EXT2_SUPER_CHECKINTERVAL(sb)	(PED_LE32_TO_CPU((sb).s_checkinterval))
299 #define EXT2_SUPER_CREATOR_OS(sb)	(PED_LE32_TO_CPU((sb).s_creator_os))
300 #define EXT2_SUPER_REV_LEVEL(sb)	(PED_LE32_TO_CPU((sb).s_rev_level))
301 #define EXT2_SUPER_DEF_RESUID(sb)	(PED_LE16_TO_CPU((sb).s_def_resuid))
302 #define EXT2_SUPER_DEF_RESGID(sb)	(PED_LE16_TO_CPU((sb).s_def_resgid))
303 
304 #define EXT2_SUPER_FIRST_INO(sb)	(PED_LE32_TO_CPU((sb).s_first_ino))
305 #define EXT2_SUPER_INODE_SIZE(sb)	(PED_LE16_TO_CPU((sb).s_inode_size))
306 #define EXT2_SUPER_BLOCK_GROUP_NR(sb)	(PED_LE16_TO_CPU((sb).s_block_group_nr))
307 #define EXT2_SUPER_FEATURE_COMPAT(sb)	(PED_LE32_TO_CPU((sb).s_feature_compat))
308 #define EXT2_SUPER_FEATURE_INCOMPAT(sb) \
309 		(PED_LE32_TO_CPU((sb).s_feature_incompat))
310 #define EXT2_SUPER_FEATURE_RO_COMPAT(sb) \
311 		(PED_LE32_TO_CPU((sb).s_feature_ro_compat))
312 #define EXT2_SUPER_UUID(sb)		((sb).s_uuid)
313 #define EXT2_SUPER_VOLUME_NAME(sb)	((sb).s_volume_name)
314 #define EXT2_SUPER_LAST_MOUNTED(sb)	((sb).s_last_mounted)
315 #define EXT2_SUPER_ALGORITHM_USAGE_BITMAP(sb) \
316 		(PED_LE32_TO_CPU((sb).s_algorithm_usage_bitmap))
317 
318 #define EXT2_SUPER_JOURNAL_UUID(sb)	((sb).s_journal_uuid)
319 #define EXT2_SUPER_JOURNAL_INUM(sb)	(PED_LE32_TO_CPU((sb).s_journal_inum))
320 #define EXT2_SUPER_JOURNAL_DEV(sb)	(PED_LE32_TO_CPU((sb).s_journal_dev))
321 #define EXT2_SUPER_LAST_ORPHAN(sb)	(PED_LE32_TO_CPU((sb).s_last_orphan))
322 
323 #endif
324