1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef _LINUX_EXT2_FS_H
17#define _LINUX_EXT2_FS_H
18
19#include <linux/types.h>
20#include <linux/magic.h>
21#include <linux/fs.h>
22
23
24
25
26
27
28
29
30#undef EXT2FS_DEBUG
31
32
33
34
35#define EXT2_DEFAULT_RESERVE_BLOCKS 8
36
37#define EXT2_MAX_RESERVE_BLOCKS 1027
38#define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0
39
40
41
42#define EXT2FS_DATE "95/08/09"
43#define EXT2FS_VERSION "0.5b"
44
45
46
47
48#ifdef EXT2FS_DEBUG
49# define ext2_debug(f, a...) { \
50 printk ("EXT2-fs DEBUG (%s, %d): %s:", \
51 __FILE__, __LINE__, __func__); \
52 printk (f, ## a); \
53 }
54#else
55# define ext2_debug(f, a...)
56#endif
57
58
59
60
61#define EXT2_BAD_INO 1
62#define EXT2_ROOT_INO 2
63#define EXT2_BOOT_LOADER_INO 5
64#define EXT2_UNDEL_DIR_INO 6
65
66
67#define EXT2_GOOD_OLD_FIRST_INO 11
68
69#ifdef __KERNEL__
70#include <linux/ext2_fs_sb.h>
71static inline struct ext2_sb_info *EXT2_SB(struct super_block *sb)
72{
73 return sb->s_fs_info;
74}
75#else
76
77
78
79#define EXT2_SB(sb) (sb)
80#endif
81
82
83
84
85#define EXT2_LINK_MAX 32000
86
87
88
89
90#define EXT2_MIN_BLOCK_SIZE 1024
91#define EXT2_MAX_BLOCK_SIZE 4096
92#define EXT2_MIN_BLOCK_LOG_SIZE 10
93#ifdef __KERNEL__
94# define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize)
95#else
96# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
97#endif
98#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32))
99#ifdef __KERNEL__
100# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
101#else
102# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
103#endif
104#ifdef __KERNEL__
105#define EXT2_ADDR_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_addr_per_block_bits)
106#define EXT2_INODE_SIZE(s) (EXT2_SB(s)->s_inode_size)
107#define EXT2_FIRST_INO(s) (EXT2_SB(s)->s_first_ino)
108#else
109#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
110 EXT2_GOOD_OLD_INODE_SIZE : \
111 (s)->s_inode_size)
112#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
113 EXT2_GOOD_OLD_FIRST_INO : \
114 (s)->s_first_ino)
115#endif
116
117
118
119
120#define EXT2_MIN_FRAG_SIZE 1024
121#define EXT2_MAX_FRAG_SIZE 4096
122#define EXT2_MIN_FRAG_LOG_SIZE 10
123#ifdef __KERNEL__
124# define EXT2_FRAG_SIZE(s) (EXT2_SB(s)->s_frag_size)
125# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_SB(s)->s_frags_per_block)
126#else
127# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
128# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
129#endif
130
131
132
133
134struct ext2_group_desc
135{
136 __le32 bg_block_bitmap;
137 __le32 bg_inode_bitmap;
138 __le32 bg_inode_table;
139 __le16 bg_free_blocks_count;
140 __le16 bg_free_inodes_count;
141 __le16 bg_used_dirs_count;
142 __le16 bg_pad;
143 __le32 bg_reserved[3];
144};
145
146
147
148
149#ifdef __KERNEL__
150# define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group)
151# define EXT2_DESC_PER_BLOCK(s) (EXT2_SB(s)->s_desc_per_block)
152# define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group)
153# define EXT2_DESC_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_desc_per_block_bits)
154#else
155# define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
156# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
157# define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
158#endif
159
160
161
162
163#define EXT2_NDIR_BLOCKS 12
164#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
165#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
166#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
167#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
168
169
170
171
172#define EXT2_SECRM_FL FS_SECRM_FL
173#define EXT2_UNRM_FL FS_UNRM_FL
174#define EXT2_COMPR_FL FS_COMPR_FL
175#define EXT2_SYNC_FL FS_SYNC_FL
176#define EXT2_IMMUTABLE_FL FS_IMMUTABLE_FL
177#define EXT2_APPEND_FL FS_APPEND_FL
178#define EXT2_NODUMP_FL FS_NODUMP_FL
179#define EXT2_NOATIME_FL FS_NOATIME_FL
180
181#define EXT2_DIRTY_FL FS_DIRTY_FL
182#define EXT2_COMPRBLK_FL FS_COMPRBLK_FL
183#define EXT2_NOCOMP_FL FS_NOCOMP_FL
184#define EXT2_ECOMPR_FL FS_ECOMPR_FL
185
186#define EXT2_BTREE_FL FS_BTREE_FL
187#define EXT2_INDEX_FL FS_INDEX_FL
188#define EXT2_IMAGIC_FL FS_IMAGIC_FL
189#define EXT2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL
190#define EXT2_NOTAIL_FL FS_NOTAIL_FL
191#define EXT2_DIRSYNC_FL FS_DIRSYNC_FL
192#define EXT2_TOPDIR_FL FS_TOPDIR_FL
193#define EXT2_RESERVED_FL FS_RESERVED_FL
194
195#define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE
196#define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE
197
198
199#define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\
200 EXT2_SYNC_FL | EXT2_NODUMP_FL |\
201 EXT2_NOATIME_FL | EXT2_COMPRBLK_FL |\
202 EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\
203 EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL)
204
205
206#define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL))
207
208
209#define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL)
210
211
212static inline __u32 ext2_mask_flags(umode_t mode, __u32 flags)
213{
214 if (S_ISDIR(mode))
215 return flags;
216 else if (S_ISREG(mode))
217 return flags & EXT2_REG_FLMASK;
218 else
219 return flags & EXT2_OTHER_FLMASK;
220}
221
222
223
224
225#define EXT2_IOC_GETFLAGS FS_IOC_GETFLAGS
226#define EXT2_IOC_SETFLAGS FS_IOC_SETFLAGS
227#define EXT2_IOC_GETVERSION FS_IOC_GETVERSION
228#define EXT2_IOC_SETVERSION FS_IOC_SETVERSION
229#define EXT2_IOC_GETRSVSZ _IOR('f', 5, long)
230#define EXT2_IOC_SETRSVSZ _IOW('f', 6, long)
231
232
233
234
235#define EXT2_IOC32_GETFLAGS FS_IOC32_GETFLAGS
236#define EXT2_IOC32_SETFLAGS FS_IOC32_SETFLAGS
237#define EXT2_IOC32_GETVERSION FS_IOC32_GETVERSION
238#define EXT2_IOC32_SETVERSION FS_IOC32_SETVERSION
239
240
241
242
243struct ext2_inode {
244 __le16 i_mode;
245 __le16 i_uid;
246 __le32 i_size;
247 __le32 i_atime;
248 __le32 i_ctime;
249 __le32 i_mtime;
250 __le32 i_dtime;
251 __le16 i_gid;
252 __le16 i_links_count;
253 __le32 i_blocks;
254 __le32 i_flags;
255 union {
256 struct {
257 __le32 l_i_reserved1;
258 } linux1;
259 struct {
260 __le32 h_i_translator;
261 } hurd1;
262 struct {
263 __le32 m_i_reserved1;
264 } masix1;
265 } osd1;
266 __le32 i_block[EXT2_N_BLOCKS];
267 __le32 i_generation;
268 __le32 i_file_acl;
269 __le32 i_dir_acl;
270 __le32 i_faddr;
271 union {
272 struct {
273 __u8 l_i_frag;
274 __u8 l_i_fsize;
275 __u16 i_pad1;
276 __le16 l_i_uid_high;
277 __le16 l_i_gid_high;
278 __u32 l_i_reserved2;
279 } linux2;
280 struct {
281 __u8 h_i_frag;
282 __u8 h_i_fsize;
283 __le16 h_i_mode_high;
284 __le16 h_i_uid_high;
285 __le16 h_i_gid_high;
286 __le32 h_i_author;
287 } hurd2;
288 struct {
289 __u8 m_i_frag;
290 __u8 m_i_fsize;
291 __u16 m_pad1;
292 __u32 m_i_reserved2[2];
293 } masix2;
294 } osd2;
295};
296
297#define i_size_high i_dir_acl
298
299#if defined(__KERNEL__) || defined(__linux__)
300#define i_reserved1 osd1.linux1.l_i_reserved1
301#define i_frag osd2.linux2.l_i_frag
302#define i_fsize osd2.linux2.l_i_fsize
303#define i_uid_low i_uid
304#define i_gid_low i_gid
305#define i_uid_high osd2.linux2.l_i_uid_high
306#define i_gid_high osd2.linux2.l_i_gid_high
307#define i_reserved2 osd2.linux2.l_i_reserved2
308#endif
309
310#ifdef __hurd__
311#define i_translator osd1.hurd1.h_i_translator
312#define i_frag osd2.hurd2.h_i_frag
313#define i_fsize osd2.hurd2.h_i_fsize
314#define i_uid_high osd2.hurd2.h_i_uid_high
315#define i_gid_high osd2.hurd2.h_i_gid_high
316#define i_author osd2.hurd2.h_i_author
317#endif
318
319#ifdef __masix__
320#define i_reserved1 osd1.masix1.m_i_reserved1
321#define i_frag osd2.masix2.m_i_frag
322#define i_fsize osd2.masix2.m_i_fsize
323#define i_reserved2 osd2.masix2.m_i_reserved2
324#endif
325
326
327
328
329#define EXT2_VALID_FS 0x0001
330#define EXT2_ERROR_FS 0x0002
331
332
333
334
335#define EXT2_MOUNT_CHECK 0x000001
336#define EXT2_MOUNT_OLDALLOC 0x000002
337#define EXT2_MOUNT_GRPID 0x000004
338#define EXT2_MOUNT_DEBUG 0x000008
339#define EXT2_MOUNT_ERRORS_CONT 0x000010
340#define EXT2_MOUNT_ERRORS_RO 0x000020
341#define EXT2_MOUNT_ERRORS_PANIC 0x000040
342#define EXT2_MOUNT_MINIX_DF 0x000080
343#define EXT2_MOUNT_NOBH 0x000100
344#define EXT2_MOUNT_NO_UID32 0x000200
345#define EXT2_MOUNT_XATTR_USER 0x004000
346#define EXT2_MOUNT_POSIX_ACL 0x008000
347#define EXT2_MOUNT_XIP 0x010000
348#define EXT2_MOUNT_USRQUOTA 0x020000
349#define EXT2_MOUNT_GRPQUOTA 0x040000
350#define EXT2_MOUNT_RESERVATION 0x080000
351
352
353#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
354#define set_opt(o, opt) o |= EXT2_MOUNT_##opt
355#define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \
356 EXT2_MOUNT_##opt)
357
358
359
360#define EXT2_DFL_MAX_MNT_COUNT 20
361#define EXT2_DFL_CHECKINTERVAL 0
362
363
364
365
366#define EXT2_ERRORS_CONTINUE 1
367#define EXT2_ERRORS_RO 2
368#define EXT2_ERRORS_PANIC 3
369#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
370
371
372
373
374struct ext2_super_block {
375 __le32 s_inodes_count;
376 __le32 s_blocks_count;
377 __le32 s_r_blocks_count;
378 __le32 s_free_blocks_count;
379 __le32 s_free_inodes_count;
380 __le32 s_first_data_block;
381 __le32 s_log_block_size;
382 __le32 s_log_frag_size;
383 __le32 s_blocks_per_group;
384 __le32 s_frags_per_group;
385 __le32 s_inodes_per_group;
386 __le32 s_mtime;
387 __le32 s_wtime;
388 __le16 s_mnt_count;
389 __le16 s_max_mnt_count;
390 __le16 s_magic;
391 __le16 s_state;
392 __le16 s_errors;
393 __le16 s_minor_rev_level;
394 __le32 s_lastcheck;
395 __le32 s_checkinterval;
396 __le32 s_creator_os;
397 __le32 s_rev_level;
398 __le16 s_def_resuid;
399 __le16 s_def_resgid;
400
401
402
403
404
405
406
407
408
409
410
411
412
413 __le32 s_first_ino;
414 __le16 s_inode_size;
415 __le16 s_block_group_nr;
416 __le32 s_feature_compat;
417 __le32 s_feature_incompat;
418 __le32 s_feature_ro_compat;
419 __u8 s_uuid[16];
420 char s_volume_name[16];
421 char s_last_mounted[64];
422 __le32 s_algorithm_usage_bitmap;
423
424
425
426
427 __u8 s_prealloc_blocks;
428 __u8 s_prealloc_dir_blocks;
429 __u16 s_padding1;
430
431
432
433 __u8 s_journal_uuid[16];
434 __u32 s_journal_inum;
435 __u32 s_journal_dev;
436 __u32 s_last_orphan;
437 __u32 s_hash_seed[4];
438 __u8 s_def_hash_version;
439 __u8 s_reserved_char_pad;
440 __u16 s_reserved_word_pad;
441 __le32 s_default_mount_opts;
442 __le32 s_first_meta_bg;
443 __u32 s_reserved[190];
444};
445
446
447
448
449#define EXT2_OS_LINUX 0
450#define EXT2_OS_HURD 1
451#define EXT2_OS_MASIX 2
452#define EXT2_OS_FREEBSD 3
453#define EXT2_OS_LITES 4
454
455
456
457
458#define EXT2_GOOD_OLD_REV 0
459#define EXT2_DYNAMIC_REV 1
460
461#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV
462#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV
463
464#define EXT2_GOOD_OLD_INODE_SIZE 128
465
466
467
468
469
470#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \
471 ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
472#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \
473 ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
474#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \
475 ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
476#define EXT2_SET_COMPAT_FEATURE(sb,mask) \
477 EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
478#define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \
479 EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
480#define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \
481 EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
482#define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \
483 EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
484#define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
485 EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
486#define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \
487 EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
488
489#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001
490#define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002
491#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
492#define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008
493#define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010
494#define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020
495#define EXT2_FEATURE_COMPAT_ANY 0xffffffff
496
497#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
498#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
499#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
500#define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff
501
502#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001
503#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
504#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004
505#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
506#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
507#define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff
508
509#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR
510#define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \
511 EXT2_FEATURE_INCOMPAT_META_BG)
512#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
513 EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
514 EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
515#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP
516#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP
517
518
519
520
521#define EXT2_DEF_RESUID 0
522#define EXT2_DEF_RESGID 0
523
524
525
526
527#define EXT2_DEFM_DEBUG 0x0001
528#define EXT2_DEFM_BSDGROUPS 0x0002
529#define EXT2_DEFM_XATTR_USER 0x0004
530#define EXT2_DEFM_ACL 0x0008
531#define EXT2_DEFM_UID16 0x0010
532
533#define EXT3_DEFM_JMODE 0x0060
534#define EXT3_DEFM_JMODE_DATA 0x0020
535#define EXT3_DEFM_JMODE_ORDERED 0x0040
536#define EXT3_DEFM_JMODE_WBACK 0x0060
537
538
539
540
541#define EXT2_NAME_LEN 255
542
543struct ext2_dir_entry {
544 __le32 inode;
545 __le16 rec_len;
546 __le16 name_len;
547 char name[EXT2_NAME_LEN];
548};
549
550
551
552
553
554
555
556struct ext2_dir_entry_2 {
557 __le32 inode;
558 __le16 rec_len;
559 __u8 name_len;
560 __u8 file_type;
561 char name[EXT2_NAME_LEN];
562};
563
564
565
566
567
568enum {
569 EXT2_FT_UNKNOWN = 0,
570 EXT2_FT_REG_FILE = 1,
571 EXT2_FT_DIR = 2,
572 EXT2_FT_CHRDEV = 3,
573 EXT2_FT_BLKDEV = 4,
574 EXT2_FT_FIFO = 5,
575 EXT2_FT_SOCK = 6,
576 EXT2_FT_SYMLINK = 7,
577 EXT2_FT_MAX
578};
579
580
581
582
583
584
585#define EXT2_DIR_PAD 4
586#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
587#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
588 ~EXT2_DIR_ROUND)
589#define EXT2_MAX_REC_LEN ((1<<16)-1)
590
591#endif
592