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