1 From 176bc344751dfc41e87976182381ae0560c94f22 Mon Sep 17 00:00:00 2001
2 From: Denys Vlasenko <vda.linux@googlemail.com>
3 Date: Tue, 17 Apr 2012 15:06:55 +0200
4 Subject: [PATCH 04/32] Drop include/bb_linux_ext2_fs.h, use existing
7 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
9 e2fsprogs/e2fs_defs.h | 561 ---------------------------
10 e2fsprogs/e2fs_lib.h | 2 +-
11 e2fsprogs/old_e2fsprogs/e2fsck.c | 6 +-
12 e2fsprogs/old_e2fsprogs/e2p/feature.c | 2 +-
13 e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h | 2 +-
14 e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h | 2 +-
15 e2fsprogs/old_e2fsprogs/ext2fs/initialize.c | 2 +-
16 e2fsprogs/old_e2fsprogs/mke2fs.c | 8 +-
17 e2fsprogs/tune2fs.c | 2 +-
18 include/bb_e2fs_defs.h | 561 +++++++++++++++++++++++++++
19 include/bb_linux_ext2_fs.h | 547 --------------------------
20 util-linux/mkfs_ext2.c | 2 +-
21 12 files changed, 575 insertions(+), 1122 deletions(-)
22 delete mode 100644 e2fsprogs/e2fs_defs.h
23 create mode 100644 include/bb_e2fs_defs.h
24 delete mode 100644 include/bb_linux_ext2_fs.h
26 diff --git a/e2fsprogs/e2fs_defs.h b/e2fsprogs/e2fs_defs.h
27 deleted file mode 100644
28 index 379640e..0000000
29 --- a/e2fsprogs/e2fs_defs.h
32 -/* vi: set sw=4 ts=4: */
34 - * linux/include/linux/ext2_fs.h
36 - * Copyright (C) 1992, 1993, 1994, 1995
37 - * Remy Card (card@masi.ibp.fr)
38 - * Laboratoire MASI - Institut Blaise Pascal
39 - * Universite Pierre et Marie Curie (Paris VI)
41 - * Copyright (C) 1991, 1992 Linus Torvalds
44 -#ifndef LINUX_EXT2_FS_H
45 -#define LINUX_EXT2_FS_H 1
48 - * Special inode numbers
50 -#define EXT2_BAD_INO 1 /* Bad blocks inode */
51 -#define EXT2_ROOT_INO 2 /* Root inode */
52 -#define EXT2_ACL_IDX_INO 3 /* ACL inode */
53 -#define EXT2_ACL_DATA_INO 4 /* ACL inode */
54 -#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */
55 -#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */
56 -#define EXT2_RESIZE_INO 7 /* Reserved group descriptors inode */
57 -#define EXT2_JOURNAL_INO 8 /* Journal inode */
59 -/* First non-reserved inode for old ext2 filesystems */
60 -#define EXT2_GOOD_OLD_FIRST_INO 11
63 - * The second extended file system magic number
65 -#define EXT2_SUPER_MAGIC 0xEF53
67 -/* Assume that user mode programs are passing in an ext2fs superblock, not
68 - * a kernel struct super_block. This will allow us to call the feature-test
69 - * macros from user land. */
70 -#define EXT2_SB(sb) (sb)
73 - * Maximal count of links to a file
75 -#define EXT2_LINK_MAX 32000
78 - * Macro-instructions used to manage several block sizes
80 -#define EXT2_MIN_BLOCK_LOG_SIZE 10 /* 1024 */
81 -#define EXT2_MAX_BLOCK_LOG_SIZE 16 /* 65536 */
82 -#define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
83 -#define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)
84 -#define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
85 -#define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
86 -#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
87 - EXT2_GOOD_OLD_INODE_SIZE : (s)->s_inode_size)
88 -#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
89 - EXT2_GOOD_OLD_FIRST_INO : (s)->s_first_ino)
90 -#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof(uint32_t))
93 - * Macro-instructions used to manage fragments
95 -#define EXT2_MIN_FRAG_SIZE EXT2_MIN_BLOCK_SIZE
96 -#define EXT2_MAX_FRAG_SIZE EXT2_MAX_BLOCK_SIZE
97 -#define EXT2_MIN_FRAG_LOG_SIZE EXT2_MIN_BLOCK_LOG_SIZE
98 -#define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
99 -#define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
104 -struct ext2_acl_header { /* Header of Access Control Lists */
105 - uint32_t aclh_size;
106 - uint32_t aclh_file_count;
107 - uint32_t aclh_acle_count;
108 - uint32_t aclh_first_acle;
111 -struct ext2_acl_entry { /* Access Control List Entry */
112 - uint32_t acle_size;
113 - uint16_t acle_perms; /* Access permissions */
114 - uint16_t acle_type; /* Type of entry */
115 - uint16_t acle_tag; /* User or group identity */
116 - uint16_t acle_pad1;
117 - uint32_t acle_next; /* Pointer on next entry for the */
118 - /* same inode or on next free entry */
122 - * Structure of a blocks group descriptor
124 -struct ext2_group_desc {
125 - uint32_t bg_block_bitmap; /* Blocks bitmap block */
126 - uint32_t bg_inode_bitmap; /* Inodes bitmap block */
127 - uint32_t bg_inode_table; /* Inodes table block */
128 - uint16_t bg_free_blocks_count; /* Free blocks count */
129 - uint16_t bg_free_inodes_count; /* Free inodes count */
130 - uint16_t bg_used_dirs_count; /* Directories count */
132 - uint32_t bg_reserved[3];
136 - * Data structures used by the directory indexing feature
138 - * Note: all of the multibyte integer fields are little endian.
142 - * Note: dx_root_info is laid out so that if it should somehow get
143 - * overlaid by a dirent the two low bits of the hash version will be
144 - * zero. Therefore, the hash version mod 4 should never be 0.
145 - * Sincerely, the paranoia department.
147 -struct ext2_dx_root_info {
148 - uint32_t reserved_zero;
149 - uint8_t hash_version; /* 0 now, 1 at release */
150 - uint8_t info_length; /* 8 */
151 - uint8_t indirect_levels;
152 - uint8_t unused_flags;
155 -#define EXT2_HASH_LEGACY 0
156 -#define EXT2_HASH_HALF_MD4 1
157 -#define EXT2_HASH_TEA 2
159 -#define EXT2_HASH_FLAG_INCOMPAT 0x1
161 -struct ext2_dx_entry {
166 -struct ext2_dx_countlimit {
173 - * Macro-instructions used to manage group descriptors
175 -#define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group)
176 -#define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group)
177 -#define EXT2_INODES_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
178 -/* limits imposed by 16-bit value gd_free_{blocks,inode}_count */
179 -#define EXT2_MAX_BLOCKS_PER_GROUP(s) ((1 << 16) - 8)
180 -#define EXT2_MAX_INODES_PER_GROUP(s) ((1 << 16) - EXT2_INODES_PER_BLOCK(s))
181 -#define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
184 - * Constants relative to the data blocks
186 -#define EXT2_NDIR_BLOCKS 12
187 -#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
188 -#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
189 -#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
190 -#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
195 -#define EXT2_SECRM_FL 0x00000001 /* Secure deletion */
196 -#define EXT2_UNRM_FL 0x00000002 /* Undelete */
197 -#define EXT2_COMPR_FL 0x00000004 /* Compress file */
198 -#define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */
199 -#define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */
200 -#define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */
201 -#define EXT2_NODUMP_FL 0x00000040 /* do not dump file */
202 -#define EXT2_NOATIME_FL 0x00000080 /* do not update atime */
203 -/* Reserved for compression usage... */
204 -#define EXT2_DIRTY_FL 0x00000100
205 -#define EXT2_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */
206 -#define EXT2_NOCOMPR_FL 0x00000400 /* Access raw compressed data */
207 -#define EXT2_ECOMPR_FL 0x00000800 /* Compression error */
208 -/* End compression flags --- maybe not all used */
209 -#define EXT2_BTREE_FL 0x00001000 /* btree format dir */
210 -#define EXT2_INDEX_FL 0x00001000 /* hash-indexed directory */
211 -#define EXT2_IMAGIC_FL 0x00002000
212 -#define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */
213 -#define EXT2_NOTAIL_FL 0x00008000 /* file tail should not be merged */
214 -#define EXT2_DIRSYNC_FL 0x00010000 /* Synchronous directory modifications */
215 -#define EXT2_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/
216 -#define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */
217 -#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */
219 -#define EXT2_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */
220 -#define EXT2_FL_USER_MODIFIABLE 0x000080FF /* User modifiable flags */
225 -#define EXT2_IOC_GETFLAGS _IOR('f', 1, long)
226 -#define EXT2_IOC_SETFLAGS _IOW('f', 2, long)
227 -#define EXT2_IOC_GETVERSION _IOR('v', 1, long)
228 -#define EXT2_IOC_SETVERSION _IOW('v', 2, long)
231 - * Structure of an inode on the disk
234 - uint16_t i_mode; /* File mode */
235 - uint16_t i_uid; /* Low 16 bits of Owner Uid */
236 - uint32_t i_size; /* Size in bytes */
237 - uint32_t i_atime; /* Access time */
238 - uint32_t i_ctime; /* Creation time */
239 - uint32_t i_mtime; /* Modification time */
240 - uint32_t i_dtime; /* Deletion Time */
241 - uint16_t i_gid; /* Low 16 bits of Group Id */
242 - uint16_t i_links_count; /* Links count */
243 - uint32_t i_blocks; /* Blocks count */
244 - uint32_t i_flags; /* File flags */
247 - uint32_t l_i_reserved1;
250 - uint32_t h_i_translator;
253 - uint32_t m_i_reserved1;
255 - } osd1; /* OS dependent 1 */
256 - uint32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
257 - uint32_t i_generation; /* File version (for NFS) */
258 - uint32_t i_file_acl; /* File ACL */
259 - uint32_t i_dir_acl; /* Directory ACL */
260 - uint32_t i_faddr; /* Fragment address */
263 - uint8_t l_i_frag; /* Fragment number */
264 - uint8_t l_i_fsize; /* Fragment size */
266 - uint16_t l_i_uid_high; /* these 2 fields */
267 - uint16_t l_i_gid_high; /* were reserved2[0] */
268 - uint32_t l_i_reserved2;
271 - uint8_t h_i_frag; /* Fragment number */
272 - uint8_t h_i_fsize; /* Fragment size */
273 - uint16_t h_i_mode_high;
274 - uint16_t h_i_uid_high;
275 - uint16_t h_i_gid_high;
276 - uint32_t h_i_author;
279 - uint8_t m_i_frag; /* Fragment number */
280 - uint8_t m_i_fsize; /* Fragment size */
282 - uint32_t m_i_reserved2[2];
284 - } osd2; /* OS dependent 2 */
288 - * Permanent part of an large inode on the disk
290 -struct ext2_inode_large {
291 - uint16_t i_mode; /* File mode */
292 - uint16_t i_uid; /* Low 16 bits of Owner Uid */
293 - uint32_t i_size; /* Size in bytes */
294 - uint32_t i_atime; /* Access time */
295 - uint32_t i_ctime; /* Creation time */
296 - uint32_t i_mtime; /* Modification time */
297 - uint32_t i_dtime; /* Deletion Time */
298 - uint16_t i_gid; /* Low 16 bits of Group Id */
299 - uint16_t i_links_count; /* Links count */
300 - uint32_t i_blocks; /* Blocks count */
301 - uint32_t i_flags; /* File flags */
304 - uint32_t l_i_reserved1;
307 - uint32_t h_i_translator;
310 - uint32_t m_i_reserved1;
312 - } osd1; /* OS dependent 1 */
313 - uint32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
314 - uint32_t i_generation; /* File version (for NFS) */
315 - uint32_t i_file_acl; /* File ACL */
316 - uint32_t i_dir_acl; /* Directory ACL */
317 - uint32_t i_faddr; /* Fragment address */
320 - uint8_t l_i_frag; /* Fragment number */
321 - uint8_t l_i_fsize; /* Fragment size */
323 - uint16_t l_i_uid_high; /* these 2 fields */
324 - uint16_t l_i_gid_high; /* were reserved2[0] */
325 - uint32_t l_i_reserved2;
328 - uint8_t h_i_frag; /* Fragment number */
329 - uint8_t h_i_fsize; /* Fragment size */
330 - uint16_t h_i_mode_high;
331 - uint16_t h_i_uid_high;
332 - uint16_t h_i_gid_high;
333 - uint32_t h_i_author;
336 - uint8_t m_i_frag; /* Fragment number */
337 - uint8_t m_i_fsize; /* Fragment size */
339 - uint32_t m_i_reserved2[2];
341 - } osd2; /* OS dependent 2 */
342 - uint16_t i_extra_isize;
346 -#define i_size_high i_dir_acl
349 - * File system states
351 -#define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */
352 -#define EXT2_ERROR_FS 0x0002 /* Errors detected */
357 -#define EXT2_MOUNT_CHECK 0x0001 /* Do mount-time checks */
358 -#define EXT2_MOUNT_GRPID 0x0004 /* Create files with directory's group */
359 -#define EXT2_MOUNT_DEBUG 0x0008 /* Some debugging messages */
360 -#define EXT2_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */
361 -#define EXT2_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */
362 -#define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */
363 -#define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */
364 -#define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */
366 -#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
367 -#define set_opt(o, opt) o |= EXT2_MOUNT_##opt
368 -#define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \
371 - * Maximal mount counts between two filesystem checks
373 -#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
374 -#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */
377 - * Behaviour when detecting errors
379 -#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */
380 -#define EXT2_ERRORS_RO 2 /* Remount fs read-only */
381 -#define EXT2_ERRORS_PANIC 3 /* Panic */
382 -#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
385 - * Structure of the super block
387 -struct ext2_super_block {
388 - uint32_t s_inodes_count; /* Inodes count */
389 - uint32_t s_blocks_count; /* Blocks count */
390 - uint32_t s_r_blocks_count; /* Reserved blocks count */
391 - uint32_t s_free_blocks_count; /* Free blocks count */
392 - uint32_t s_free_inodes_count; /* Free inodes count */
393 - uint32_t s_first_data_block; /* First Data Block */
394 - uint32_t s_log_block_size; /* Block size */
395 - int32_t s_log_frag_size; /* Fragment size */
396 - uint32_t s_blocks_per_group; /* # Blocks per group */
397 - uint32_t s_frags_per_group; /* # Fragments per group */
398 - uint32_t s_inodes_per_group; /* # Inodes per group */
399 - uint32_t s_mtime; /* Mount time */
400 - uint32_t s_wtime; /* Write time */
401 - uint16_t s_mnt_count; /* Mount count */
402 - int16_t s_max_mnt_count; /* Maximal mount count */
403 - uint16_t s_magic; /* Magic signature */
404 - uint16_t s_state; /* File system state */
405 - uint16_t s_errors; /* Behaviour when detecting errors */
406 - uint16_t s_minor_rev_level; /* minor revision level */
407 - uint32_t s_lastcheck; /* time of last check */
408 - uint32_t s_checkinterval; /* max. time between checks */
409 - uint32_t s_creator_os; /* OS */
410 - uint32_t s_rev_level; /* Revision level */
411 - uint16_t s_def_resuid; /* Default uid for reserved blocks */
412 - uint16_t s_def_resgid; /* Default gid for reserved blocks */
414 - * These fields are for EXT2_DYNAMIC_REV superblocks only.
416 - * Note: the difference between the compatible feature set and
417 - * the incompatible feature set is that if there is a bit set
418 - * in the incompatible feature set that the kernel doesn't
419 - * know about, it should refuse to mount the filesystem.
421 - * e2fsck's requirements are more strict; if it doesn't know
422 - * about a feature in either the compatible or incompatible
423 - * feature set, it must abort and not try to meddle with
424 - * things it doesn't understand...
426 - uint32_t s_first_ino; /* First non-reserved inode */
427 - uint16_t s_inode_size; /* size of inode structure */
428 - uint16_t s_block_group_nr; /* block group # of this superblock */
429 - uint32_t s_feature_compat; /* compatible feature set */
430 - uint32_t s_feature_incompat; /* incompatible feature set */
431 - uint32_t s_feature_ro_compat; /* readonly-compatible feature set */
432 - uint8_t s_uuid[16]; /* 128-bit uuid for volume */
433 - char s_volume_name[16]; /* volume name */
434 - char s_last_mounted[64]; /* directory where last mounted */
435 - uint32_t s_algorithm_usage_bitmap; /* For compression */
437 - * Performance hints. Directory preallocation should only
438 - * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
440 - uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
441 - uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
442 - uint16_t s_reserved_gdt_blocks; /* Per group table for online growth */
444 - * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
446 - uint8_t s_journal_uuid[16]; /* uuid of journal superblock */
447 - uint32_t s_journal_inum; /* inode number of journal file */
448 - uint32_t s_journal_dev; /* device number of journal file */
449 - uint32_t s_last_orphan; /* start of list of inodes to delete */
450 - uint32_t s_hash_seed[4]; /* HTREE hash seed */
451 - uint8_t s_def_hash_version; /* Default hash version to use */
452 - uint8_t s_jnl_backup_type; /* Default type of journal backup */
453 - uint16_t s_reserved_word_pad;
454 - uint32_t s_default_mount_opts;
455 - uint32_t s_first_meta_bg; /* First metablock group */
456 - uint32_t s_mkfs_time; /* When the filesystem was created */
457 - uint32_t s_jnl_blocks[17]; /* Backup of the journal inode */
458 - uint32_t s_reserved[172]; /* Padding to the end of the block */
462 - * Codes for operating systems
464 -#define EXT2_OS_LINUX 0
465 -#define EXT2_OS_HURD 1
466 -#define EXT2_OS_MASIX 2
467 -#define EXT2_OS_FREEBSD 3
468 -#define EXT2_OS_LITES 4
473 -#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */
474 -#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
476 -#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV
477 -#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV
479 -#define EXT2_GOOD_OLD_INODE_SIZE 128
482 - * Journal inode backup types
484 -#define EXT3_JNL_BACKUP_BLOCKS 1
487 - * Feature set definitions
490 -#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \
491 - ( EXT2_SB(sb)->s_feature_compat & (mask) )
492 -#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \
493 - ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
494 -#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \
495 - ( EXT2_SB(sb)->s_feature_incompat & (mask) )
497 -#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001
498 -#define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002
499 -#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
500 -#define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008
501 -#define EXT2_FEATURE_COMPAT_RESIZE_INODE 0x0010
502 -#define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020
504 -#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
505 -#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
506 -/* #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 not used */
508 -#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001
509 -#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
510 -#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */
511 -#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
512 -#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
513 -#define EXT3_FEATURE_INCOMPAT_EXTENTS 0x0040
516 -#define EXT2_FEATURE_COMPAT_SUPP 0
517 -#define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE)
518 -#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
519 - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
520 - EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
523 - * Default values for user and/or group using reserved blocks
525 -#define EXT2_DEF_RESUID 0
526 -#define EXT2_DEF_RESGID 0
529 - * Default mount options
531 -#define EXT2_DEFM_DEBUG 0x0001
532 -#define EXT2_DEFM_BSDGROUPS 0x0002
533 -#define EXT2_DEFM_XATTR_USER 0x0004
534 -#define EXT2_DEFM_ACL 0x0008
535 -#define EXT2_DEFM_UID16 0x0010
536 -#define EXT3_DEFM_JMODE 0x0060
537 -#define EXT3_DEFM_JMODE_DATA 0x0020
538 -#define EXT3_DEFM_JMODE_ORDERED 0x0040
539 -#define EXT3_DEFM_JMODE_WBACK 0x0060
542 - * Structure of a directory entry
544 -#define EXT2_NAME_LEN 255
546 -struct ext2_dir_entry {
547 - uint32_t inode; /* Inode number */
548 - uint16_t rec_len; /* Directory entry length */
549 - uint16_t name_len; /* Name length */
550 - char name[EXT2_NAME_LEN]; /* File name */
554 - * The new version of the directory entry. Since EXT2 structures are
555 - * stored in intel byte order, and the name_len field could never be
556 - * bigger than 255 chars, it's safe to reclaim the extra byte for the
559 -struct ext2_dir_entry_2 {
560 - uint32_t inode; /* Inode number */
561 - uint16_t rec_len; /* Directory entry length */
562 - uint8_t name_len; /* Name length */
564 - char name[EXT2_NAME_LEN]; /* File name */
568 - * Ext2 directory file types. Only the low 3 bits are used. The
569 - * other bits are reserved for now.
571 -#define EXT2_FT_UNKNOWN 0
572 -#define EXT2_FT_REG_FILE 1
573 -#define EXT2_FT_DIR 2
574 -#define EXT2_FT_CHRDEV 3
575 -#define EXT2_FT_BLKDEV 4
576 -#define EXT2_FT_FIFO 5
577 -#define EXT2_FT_SOCK 6
578 -#define EXT2_FT_SYMLINK 7
580 -#define EXT2_FT_MAX 8
583 - * EXT2_DIR_PAD defines the directory entries boundaries
585 - * NOTE: It must be a multiple of 4
587 -#define EXT2_DIR_PAD 4
588 -#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
589 -#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
593 diff --git a/e2fsprogs/e2fs_lib.h b/e2fsprogs/e2fs_lib.h
594 index 3905ee7..f2ae56f 100644
595 --- a/e2fsprogs/e2fs_lib.h
596 +++ b/e2fsprogs/e2fs_lib.h
600 /* Constants and structures */
601 -#include "e2fs_defs.h"
602 +#include "bb_e2fs_defs.h"
604 PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
606 diff --git a/e2fsprogs/old_e2fsprogs/e2fsck.c b/e2fsprogs/old_e2fsprogs/e2fsck.c
607 index 8fffa7f..373e8ce 100644
608 --- a/e2fsprogs/old_e2fsprogs/e2fsck.c
609 +++ b/e2fsprogs/old_e2fsprogs/e2fsck.c
610 @@ -11577,7 +11577,7 @@ static void check_resize_inode(e2fsck_t ctx)
611 * s_reserved_gdt_blocks must be zero.
613 if (!(fs->super->s_feature_compat &
614 - EXT2_FEATURE_COMPAT_RESIZE_INODE)) {
615 + EXT2_FEATURE_COMPAT_RESIZE_INO)) {
616 if (fs->super->s_reserved_gdt_blocks) {
617 pctx.num = fs->super->s_reserved_gdt_blocks;
618 if (fix_problem(ctx, PR_0_NONZERO_RESERVED_GDT_BLOCKS,
619 @@ -11593,7 +11593,7 @@ static void check_resize_inode(e2fsck_t ctx)
620 retval = ext2fs_read_inode(fs, EXT2_RESIZE_INO, &inode);
622 if (fs->super->s_feature_compat &
623 - EXT2_FEATURE_COMPAT_RESIZE_INODE)
624 + EXT2_FEATURE_COMPAT_RESIZE_INO)
625 ctx->flags |= E2F_FLAG_RESIZE_INODE;
628 @@ -11603,7 +11603,7 @@ static void check_resize_inode(e2fsck_t ctx)
629 * the resize inode is cleared; then we're done.
631 if (!(fs->super->s_feature_compat &
632 - EXT2_FEATURE_COMPAT_RESIZE_INODE)) {
633 + EXT2_FEATURE_COMPAT_RESIZE_INO)) {
634 for (i=0; i < EXT2_N_BLOCKS; i++) {
635 if (inode.i_block[i])
637 diff --git a/e2fsprogs/old_e2fsprogs/e2p/feature.c b/e2fsprogs/old_e2fsprogs/e2p/feature.c
638 index b45754f..2102ed8 100644
639 --- a/e2fsprogs/old_e2fsprogs/e2p/feature.c
640 +++ b/e2fsprogs/old_e2fsprogs/e2p/feature.c
641 @@ -34,7 +34,7 @@ static const struct feature feature_list[] = {
643 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_DIR_INDEX,
645 - { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_RESIZE_INODE,
646 + { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_RESIZE_INO,
648 { E2P_FEATURE_RO_INCOMPAT, EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER,
650 diff --git a/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h b/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h
651 index 6f4f708..80ea2cb 100644
652 --- a/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h
653 +++ b/e2fsprogs/old_e2fsprogs/ext2fs/ext2_fs.h
654 @@ -475,7 +475,7 @@ struct ext2_super_block {
655 #define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002
656 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
657 #define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008
658 -#define EXT2_FEATURE_COMPAT_RESIZE_INODE 0x0010
659 +#define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010
660 #define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020
662 #define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
663 diff --git a/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h b/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h
664 index 9f77201..39fb116 100644
665 --- a/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h
666 +++ b/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs.h
667 @@ -383,7 +383,7 @@ typedef struct ext2_icount *ext2_icount_t;
668 #define EXT2_LIB_FEATURE_COMPAT_SUPP (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
669 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
670 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
671 - EXT2_FEATURE_COMPAT_RESIZE_INODE|\
672 + EXT2_FEATURE_COMPAT_RESIZE_INO|\
673 EXT2_FEATURE_COMPAT_DIR_INDEX|\
674 EXT2_FEATURE_COMPAT_EXT_ATTR)
676 diff --git a/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c b/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c
677 index ef1d343..da2d151 100644
678 --- a/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c
679 +++ b/e2fsprogs/old_e2fsprogs/ext2fs/initialize.c
680 @@ -284,7 +284,7 @@ retry:
682 * check the number of reserved group descriptor table blocks
684 - if (super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE)
685 + if (super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INO)
686 rsv_gdt = calc_reserved_gdt_blocks(fs);
689 diff --git a/e2fsprogs/old_e2fsprogs/mke2fs.c b/e2fsprogs/old_e2fsprogs/mke2fs.c
690 index 7555650..35d717a 100644
691 --- a/e2fsprogs/old_e2fsprogs/mke2fs.c
692 +++ b/e2fsprogs/old_e2fsprogs/mke2fs.c
693 @@ -757,7 +757,7 @@ static void parse_extended_opts(struct ext2_super_block *sb_param,
696 sb_param->s_feature_compat |=
697 - EXT2_FEATURE_COMPAT_RESIZE_INODE;
698 + EXT2_FEATURE_COMPAT_RESIZE_INO;
700 sb_param->s_reserved_gdt_blocks = rsv_gdb;
702 @@ -778,7 +778,7 @@ static void parse_extended_opts(struct ext2_super_block *sb_param,
704 static __u32 ok_features[3] = {
705 EXT3_FEATURE_COMPAT_HAS_JOURNAL |
706 - EXT2_FEATURE_COMPAT_RESIZE_INODE |
707 + EXT2_FEATURE_COMPAT_RESIZE_INO |
708 EXT2_FEATURE_COMPAT_DIR_INDEX, /* Compat */
709 EXT2_FEATURE_INCOMPAT_FILETYPE| /* Incompat */
710 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|
711 @@ -1123,7 +1123,7 @@ static int PRS(int argc, char **argv)
712 /* Since sparse_super is the default, we would only have a problem
713 * here if it was explicitly disabled.
715 - if ((param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE) &&
716 + if ((param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INO) &&
717 !(param.s_feature_ro_compat&EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) {
718 bb_error_msg_and_die("reserved online resize blocks not supported "
719 "on non-sparse filesystem");
720 @@ -1312,7 +1312,7 @@ int mke2fs_main (int argc, char **argv)
722 create_bad_block_inode(fs, bb_list);
723 if (fs->super->s_feature_compat &
724 - EXT2_FEATURE_COMPAT_RESIZE_INODE) {
725 + EXT2_FEATURE_COMPAT_RESIZE_INO) {
726 retval = ext2fs_create_resize_inode(fs);
727 mke2fs_error_msg_and_die(retval, "reserve blocks for online resize");
729 diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c
730 index 841d58a..46a745e 100644
731 --- a/e2fsprogs/tune2fs.c
732 +++ b/e2fsprogs/tune2fs.c
736 #include <linux/fs.h>
737 -#include "bb_linux_ext2_fs.h"
738 +#include "bb_e2fs_defs.h"
741 char BUG_wrong_field_size(void);
742 diff --git a/include/bb_e2fs_defs.h b/include/bb_e2fs_defs.h
744 index 0000000..7974497
746 +++ b/include/bb_e2fs_defs.h
748 +/* vi: set sw=4 ts=4: */
750 + * linux/include/linux/ext2_fs.h
752 + * Copyright (C) 1992, 1993, 1994, 1995
753 + * Remy Card (card@masi.ibp.fr)
754 + * Laboratoire MASI - Institut Blaise Pascal
755 + * Universite Pierre et Marie Curie (Paris VI)
757 + * Copyright (C) 1991, 1992 Linus Torvalds
760 +#ifndef LINUX_EXT2_FS_H
761 +#define LINUX_EXT2_FS_H 1
764 + * Special inode numbers
766 +#define EXT2_BAD_INO 1 /* Bad blocks inode */
767 +#define EXT2_ROOT_INO 2 /* Root inode */
768 +#define EXT2_ACL_IDX_INO 3 /* ACL inode */
769 +#define EXT2_ACL_DATA_INO 4 /* ACL inode */
770 +#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */
771 +#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */
772 +#define EXT2_RESIZE_INO 7 /* Reserved group descriptors inode */
773 +#define EXT2_JOURNAL_INO 8 /* Journal inode */
775 +/* First non-reserved inode for old ext2 filesystems */
776 +#define EXT2_GOOD_OLD_FIRST_INO 11
779 + * The second extended file system magic number
781 +#define EXT2_SUPER_MAGIC 0xEF53
783 +/* Assume that user mode programs are passing in an ext2fs superblock, not
784 + * a kernel struct super_block. This will allow us to call the feature-test
785 + * macros from user land. */
786 +#define EXT2_SB(sb) (sb)
789 + * Maximal count of links to a file
791 +#define EXT2_LINK_MAX 32000
794 + * Macro-instructions used to manage several block sizes
796 +#define EXT2_MIN_BLOCK_LOG_SIZE 10 /* 1024 */
797 +#define EXT2_MAX_BLOCK_LOG_SIZE 16 /* 65536 */
798 +#define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
799 +#define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)
800 +#define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
801 +#define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
802 +#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
803 + EXT2_GOOD_OLD_INODE_SIZE : (s)->s_inode_size)
804 +#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
805 + EXT2_GOOD_OLD_FIRST_INO : (s)->s_first_ino)
806 +#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof(uint32_t))
809 + * Macro-instructions used to manage fragments
811 +#define EXT2_MIN_FRAG_SIZE EXT2_MIN_BLOCK_SIZE
812 +#define EXT2_MAX_FRAG_SIZE EXT2_MAX_BLOCK_SIZE
813 +#define EXT2_MIN_FRAG_LOG_SIZE EXT2_MIN_BLOCK_LOG_SIZE
814 +#define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
815 +#define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
820 +struct ext2_acl_header { /* Header of Access Control Lists */
821 + uint32_t aclh_size;
822 + uint32_t aclh_file_count;
823 + uint32_t aclh_acle_count;
824 + uint32_t aclh_first_acle;
827 +struct ext2_acl_entry { /* Access Control List Entry */
828 + uint32_t acle_size;
829 + uint16_t acle_perms; /* Access permissions */
830 + uint16_t acle_type; /* Type of entry */
831 + uint16_t acle_tag; /* User or group identity */
832 + uint16_t acle_pad1;
833 + uint32_t acle_next; /* Pointer on next entry for the */
834 + /* same inode or on next free entry */
838 + * Structure of a blocks group descriptor
840 +struct ext2_group_desc {
841 + uint32_t bg_block_bitmap; /* Blocks bitmap block */
842 + uint32_t bg_inode_bitmap; /* Inodes bitmap block */
843 + uint32_t bg_inode_table; /* Inodes table block */
844 + uint16_t bg_free_blocks_count; /* Free blocks count */
845 + uint16_t bg_free_inodes_count; /* Free inodes count */
846 + uint16_t bg_used_dirs_count; /* Directories count */
848 + uint32_t bg_reserved[3];
852 + * Data structures used by the directory indexing feature
854 + * Note: all of the multibyte integer fields are little endian.
858 + * Note: dx_root_info is laid out so that if it should somehow get
859 + * overlaid by a dirent the two low bits of the hash version will be
860 + * zero. Therefore, the hash version mod 4 should never be 0.
861 + * Sincerely, the paranoia department.
863 +struct ext2_dx_root_info {
864 + uint32_t reserved_zero;
865 + uint8_t hash_version; /* 0 now, 1 at release */
866 + uint8_t info_length; /* 8 */
867 + uint8_t indirect_levels;
868 + uint8_t unused_flags;
871 +#define EXT2_HASH_LEGACY 0
872 +#define EXT2_HASH_HALF_MD4 1
873 +#define EXT2_HASH_TEA 2
875 +#define EXT2_HASH_FLAG_INCOMPAT 0x1
877 +struct ext2_dx_entry {
882 +struct ext2_dx_countlimit {
889 + * Macro-instructions used to manage group descriptors
891 +#define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group)
892 +#define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group)
893 +#define EXT2_INODES_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
894 +/* limits imposed by 16-bit value gd_free_{blocks,inode}_count */
895 +#define EXT2_MAX_BLOCKS_PER_GROUP(s) ((1 << 16) - 8)
896 +#define EXT2_MAX_INODES_PER_GROUP(s) ((1 << 16) - EXT2_INODES_PER_BLOCK(s))
897 +#define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
900 + * Constants relative to the data blocks
902 +#define EXT2_NDIR_BLOCKS 12
903 +#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
904 +#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
905 +#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
906 +#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
911 +#define EXT2_SECRM_FL 0x00000001 /* Secure deletion */
912 +#define EXT2_UNRM_FL 0x00000002 /* Undelete */
913 +#define EXT2_COMPR_FL 0x00000004 /* Compress file */
914 +#define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */
915 +#define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */
916 +#define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */
917 +#define EXT2_NODUMP_FL 0x00000040 /* do not dump file */
918 +#define EXT2_NOATIME_FL 0x00000080 /* do not update atime */
919 +/* Reserved for compression usage... */
920 +#define EXT2_DIRTY_FL 0x00000100
921 +#define EXT2_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */
922 +#define EXT2_NOCOMPR_FL 0x00000400 /* Access raw compressed data */
923 +#define EXT2_ECOMPR_FL 0x00000800 /* Compression error */
924 +/* End compression flags --- maybe not all used */
925 +#define EXT2_BTREE_FL 0x00001000 /* btree format dir */
926 +#define EXT2_INDEX_FL 0x00001000 /* hash-indexed directory */
927 +#define EXT2_IMAGIC_FL 0x00002000
928 +#define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */
929 +#define EXT2_NOTAIL_FL 0x00008000 /* file tail should not be merged */
930 +#define EXT2_DIRSYNC_FL 0x00010000 /* Synchronous directory modifications */
931 +#define EXT2_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/
932 +#define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */
933 +#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */
935 +#define EXT2_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */
936 +#define EXT2_FL_USER_MODIFIABLE 0x000080FF /* User modifiable flags */
941 +#define EXT2_IOC_GETFLAGS _IOR('f', 1, long)
942 +#define EXT2_IOC_SETFLAGS _IOW('f', 2, long)
943 +#define EXT2_IOC_GETVERSION _IOR('v', 1, long)
944 +#define EXT2_IOC_SETVERSION _IOW('v', 2, long)
947 + * Structure of an inode on the disk
950 + uint16_t i_mode; /* File mode */
951 + uint16_t i_uid; /* Low 16 bits of Owner Uid */
952 + uint32_t i_size; /* Size in bytes */
953 + uint32_t i_atime; /* Access time */
954 + uint32_t i_ctime; /* Creation time */
955 + uint32_t i_mtime; /* Modification time */
956 + uint32_t i_dtime; /* Deletion Time */
957 + uint16_t i_gid; /* Low 16 bits of Group Id */
958 + uint16_t i_links_count; /* Links count */
959 + uint32_t i_blocks; /* Blocks count */
960 + uint32_t i_flags; /* File flags */
963 + uint32_t l_i_reserved1;
966 + uint32_t h_i_translator;
969 + uint32_t m_i_reserved1;
971 + } osd1; /* OS dependent 1 */
972 + uint32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
973 + uint32_t i_generation; /* File version (for NFS) */
974 + uint32_t i_file_acl; /* File ACL */
975 + uint32_t i_dir_acl; /* Directory ACL */
976 + uint32_t i_faddr; /* Fragment address */
979 + uint8_t l_i_frag; /* Fragment number */
980 + uint8_t l_i_fsize; /* Fragment size */
982 + uint16_t l_i_uid_high; /* these 2 fields */
983 + uint16_t l_i_gid_high; /* were reserved2[0] */
984 + uint32_t l_i_reserved2;
987 + uint8_t h_i_frag; /* Fragment number */
988 + uint8_t h_i_fsize; /* Fragment size */
989 + uint16_t h_i_mode_high;
990 + uint16_t h_i_uid_high;
991 + uint16_t h_i_gid_high;
992 + uint32_t h_i_author;
995 + uint8_t m_i_frag; /* Fragment number */
996 + uint8_t m_i_fsize; /* Fragment size */
998 + uint32_t m_i_reserved2[2];
1000 + } osd2; /* OS dependent 2 */
1004 + * Permanent part of an large inode on the disk
1006 +struct ext2_inode_large {
1007 + uint16_t i_mode; /* File mode */
1008 + uint16_t i_uid; /* Low 16 bits of Owner Uid */
1009 + uint32_t i_size; /* Size in bytes */
1010 + uint32_t i_atime; /* Access time */
1011 + uint32_t i_ctime; /* Creation time */
1012 + uint32_t i_mtime; /* Modification time */
1013 + uint32_t i_dtime; /* Deletion Time */
1014 + uint16_t i_gid; /* Low 16 bits of Group Id */
1015 + uint16_t i_links_count; /* Links count */
1016 + uint32_t i_blocks; /* Blocks count */
1017 + uint32_t i_flags; /* File flags */
1020 + uint32_t l_i_reserved1;
1023 + uint32_t h_i_translator;
1026 + uint32_t m_i_reserved1;
1028 + } osd1; /* OS dependent 1 */
1029 + uint32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
1030 + uint32_t i_generation; /* File version (for NFS) */
1031 + uint32_t i_file_acl; /* File ACL */
1032 + uint32_t i_dir_acl; /* Directory ACL */
1033 + uint32_t i_faddr; /* Fragment address */
1036 + uint8_t l_i_frag; /* Fragment number */
1037 + uint8_t l_i_fsize; /* Fragment size */
1039 + uint16_t l_i_uid_high; /* these 2 fields */
1040 + uint16_t l_i_gid_high; /* were reserved2[0] */
1041 + uint32_t l_i_reserved2;
1044 + uint8_t h_i_frag; /* Fragment number */
1045 + uint8_t h_i_fsize; /* Fragment size */
1046 + uint16_t h_i_mode_high;
1047 + uint16_t h_i_uid_high;
1048 + uint16_t h_i_gid_high;
1049 + uint32_t h_i_author;
1052 + uint8_t m_i_frag; /* Fragment number */
1053 + uint8_t m_i_fsize; /* Fragment size */
1055 + uint32_t m_i_reserved2[2];
1057 + } osd2; /* OS dependent 2 */
1058 + uint16_t i_extra_isize;
1062 +#define i_size_high i_dir_acl
1065 + * File system states
1067 +#define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */
1068 +#define EXT2_ERROR_FS 0x0002 /* Errors detected */
1073 +#define EXT2_MOUNT_CHECK 0x0001 /* Do mount-time checks */
1074 +#define EXT2_MOUNT_GRPID 0x0004 /* Create files with directory's group */
1075 +#define EXT2_MOUNT_DEBUG 0x0008 /* Some debugging messages */
1076 +#define EXT2_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */
1077 +#define EXT2_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */
1078 +#define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */
1079 +#define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */
1080 +#define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */
1082 +#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
1083 +#define set_opt(o, opt) o |= EXT2_MOUNT_##opt
1084 +#define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \
1087 + * Maximal mount counts between two filesystem checks
1089 +#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
1090 +#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */
1093 + * Behaviour when detecting errors
1095 +#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */
1096 +#define EXT2_ERRORS_RO 2 /* Remount fs read-only */
1097 +#define EXT2_ERRORS_PANIC 3 /* Panic */
1098 +#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
1101 + * Structure of the super block
1103 +struct ext2_super_block {
1104 + uint32_t s_inodes_count; /* Inodes count */
1105 + uint32_t s_blocks_count; /* Blocks count */
1106 + uint32_t s_r_blocks_count; /* Reserved blocks count */
1107 + uint32_t s_free_blocks_count; /* Free blocks count */
1108 + uint32_t s_free_inodes_count; /* Free inodes count */
1109 + uint32_t s_first_data_block; /* First Data Block */
1110 + uint32_t s_log_block_size; /* Block size */
1111 + int32_t s_log_frag_size; /* Fragment size */
1112 + uint32_t s_blocks_per_group; /* # Blocks per group */
1113 + uint32_t s_frags_per_group; /* # Fragments per group */
1114 + uint32_t s_inodes_per_group; /* # Inodes per group */
1115 + uint32_t s_mtime; /* Mount time */
1116 + uint32_t s_wtime; /* Write time */
1117 + uint16_t s_mnt_count; /* Mount count */
1118 + int16_t s_max_mnt_count; /* Maximal mount count */
1119 + uint16_t s_magic; /* Magic signature */
1120 + uint16_t s_state; /* File system state */
1121 + uint16_t s_errors; /* Behaviour when detecting errors */
1122 + uint16_t s_minor_rev_level; /* minor revision level */
1123 + uint32_t s_lastcheck; /* time of last check */
1124 + uint32_t s_checkinterval; /* max. time between checks */
1125 + uint32_t s_creator_os; /* OS */
1126 + uint32_t s_rev_level; /* Revision level */
1127 + uint16_t s_def_resuid; /* Default uid for reserved blocks */
1128 + uint16_t s_def_resgid; /* Default gid for reserved blocks */
1130 + * These fields are for EXT2_DYNAMIC_REV superblocks only.
1132 + * Note: the difference between the compatible feature set and
1133 + * the incompatible feature set is that if there is a bit set
1134 + * in the incompatible feature set that the kernel doesn't
1135 + * know about, it should refuse to mount the filesystem.
1137 + * e2fsck's requirements are more strict; if it doesn't know
1138 + * about a feature in either the compatible or incompatible
1139 + * feature set, it must abort and not try to meddle with
1140 + * things it doesn't understand...
1142 + uint32_t s_first_ino; /* First non-reserved inode */
1143 + uint16_t s_inode_size; /* size of inode structure */
1144 + uint16_t s_block_group_nr; /* block group # of this superblock */
1145 + uint32_t s_feature_compat; /* compatible feature set */
1146 + uint32_t s_feature_incompat; /* incompatible feature set */
1147 + uint32_t s_feature_ro_compat; /* readonly-compatible feature set */
1148 + uint8_t s_uuid[16]; /* 128-bit uuid for volume */
1149 + char s_volume_name[16]; /* volume name */
1150 + char s_last_mounted[64]; /* directory where last mounted */
1151 + uint32_t s_algorithm_usage_bitmap; /* For compression */
1153 + * Performance hints. Directory preallocation should only
1154 + * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
1156 + uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
1157 + uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
1158 + uint16_t s_reserved_gdt_blocks; /* Per group table for online growth */
1160 + * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
1162 + uint8_t s_journal_uuid[16]; /* uuid of journal superblock */
1163 + uint32_t s_journal_inum; /* inode number of journal file */
1164 + uint32_t s_journal_dev; /* device number of journal file */
1165 + uint32_t s_last_orphan; /* start of list of inodes to delete */
1166 + uint32_t s_hash_seed[4]; /* HTREE hash seed */
1167 + uint8_t s_def_hash_version; /* Default hash version to use */
1168 + uint8_t s_jnl_backup_type; /* Default type of journal backup */
1169 + uint16_t s_reserved_word_pad;
1170 + uint32_t s_default_mount_opts;
1171 + uint32_t s_first_meta_bg; /* First metablock group */
1172 + uint32_t s_mkfs_time; /* When the filesystem was created */
1173 + uint32_t s_jnl_blocks[17]; /* Backup of the journal inode */
1174 + uint32_t s_reserved[172]; /* Padding to the end of the block */
1178 + * Codes for operating systems
1180 +#define EXT2_OS_LINUX 0
1181 +#define EXT2_OS_HURD 1
1182 +#define EXT2_OS_MASIX 2
1183 +#define EXT2_OS_FREEBSD 3
1184 +#define EXT2_OS_LITES 4
1189 +#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */
1190 +#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
1192 +#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV
1193 +#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV
1195 +#define EXT2_GOOD_OLD_INODE_SIZE 128
1198 + * Journal inode backup types
1200 +#define EXT3_JNL_BACKUP_BLOCKS 1
1203 + * Feature set definitions
1206 +#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \
1207 + ( EXT2_SB(sb)->s_feature_compat & (mask) )
1208 +#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \
1209 + ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
1210 +#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \
1211 + ( EXT2_SB(sb)->s_feature_incompat & (mask) )
1213 +#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001
1214 +#define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002
1215 +#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
1216 +#define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008
1217 +#define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010
1218 +#define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020
1220 +#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
1221 +#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
1222 +/* #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 not used */
1224 +#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001
1225 +#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
1226 +#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */
1227 +#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
1228 +#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
1229 +#define EXT3_FEATURE_INCOMPAT_EXTENTS 0x0040
1232 +#define EXT2_FEATURE_COMPAT_SUPP 0
1233 +#define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE)
1234 +#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
1235 + EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
1236 + EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
1239 + * Default values for user and/or group using reserved blocks
1241 +#define EXT2_DEF_RESUID 0
1242 +#define EXT2_DEF_RESGID 0
1245 + * Default mount options
1247 +#define EXT2_DEFM_DEBUG 0x0001
1248 +#define EXT2_DEFM_BSDGROUPS 0x0002
1249 +#define EXT2_DEFM_XATTR_USER 0x0004
1250 +#define EXT2_DEFM_ACL 0x0008
1251 +#define EXT2_DEFM_UID16 0x0010
1252 +#define EXT3_DEFM_JMODE 0x0060
1253 +#define EXT3_DEFM_JMODE_DATA 0x0020
1254 +#define EXT3_DEFM_JMODE_ORDERED 0x0040
1255 +#define EXT3_DEFM_JMODE_WBACK 0x0060
1258 + * Structure of a directory entry
1260 +#define EXT2_NAME_LEN 255
1262 +struct ext2_dir_entry {
1263 + uint32_t inode; /* Inode number */
1264 + uint16_t rec_len; /* Directory entry length */
1265 + uint16_t name_len; /* Name length */
1266 + char name[EXT2_NAME_LEN]; /* File name */
1270 + * The new version of the directory entry. Since EXT2 structures are
1271 + * stored in intel byte order, and the name_len field could never be
1272 + * bigger than 255 chars, it's safe to reclaim the extra byte for the
1273 + * file_type field.
1275 +struct ext2_dir_entry_2 {
1276 + uint32_t inode; /* Inode number */
1277 + uint16_t rec_len; /* Directory entry length */
1278 + uint8_t name_len; /* Name length */
1279 + uint8_t file_type;
1280 + char name[EXT2_NAME_LEN]; /* File name */
1284 + * Ext2 directory file types. Only the low 3 bits are used. The
1285 + * other bits are reserved for now.
1287 +#define EXT2_FT_UNKNOWN 0
1288 +#define EXT2_FT_REG_FILE 1
1289 +#define EXT2_FT_DIR 2
1290 +#define EXT2_FT_CHRDEV 3
1291 +#define EXT2_FT_BLKDEV 4
1292 +#define EXT2_FT_FIFO 5
1293 +#define EXT2_FT_SOCK 6
1294 +#define EXT2_FT_SYMLINK 7
1296 +#define EXT2_FT_MAX 8
1299 + * EXT2_DIR_PAD defines the directory entries boundaries
1301 + * NOTE: It must be a multiple of 4
1303 +#define EXT2_DIR_PAD 4
1304 +#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
1305 +#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
1309 diff --git a/include/bb_linux_ext2_fs.h b/include/bb_linux_ext2_fs.h
1310 deleted file mode 100644
1311 index fdc470b..0000000
1312 --- a/include/bb_linux_ext2_fs.h
1316 - * Work around linux/ext2_fs.h breakage.
1317 - * linux/ext2_fs.h might be removed from future kernel header distribution.
1318 - * See https://bugzilla.kernel.org/show_bug.cgi?id=42986
1320 - * Licensed under GPLv2, see file LICENSE in this source tree.
1322 -#ifndef BB_LINUX_EXT2_FS_H
1323 -#define BB_LINUX_EXT2_FS_H
1326 - * From linux/magic.h
1329 -#define EXT2_SUPER_MAGIC 0xEF53
1330 -#define EXT3_SUPER_MAGIC 0xEF53
1331 -#define EXT4_SUPER_MAGIC 0xEF53
1334 - * From linux/ext2_fs.h, with minor changes.
1338 - * Copyright (C) 1992, 1993, 1994, 1995
1339 - * Remy Card (card@masi.ibp.fr)
1340 - * Laboratoire MASI - Institut Blaise Pascal
1341 - * Universite Pierre et Marie Curie (Paris VI)
1345 - * linux/include/linux/minix_fs.h
1347 - * Copyright (C) 1991, 1992 Linus Torvalds
1351 - * The second extended filesystem constants/structures
1355 - * Define EXT2_RESERVATION to reserve data blocks for expanding files
1357 -#define EXT2_DEFAULT_RESERVE_BLOCKS 8
1358 -/*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
1359 -#define EXT2_MAX_RESERVE_BLOCKS 1027
1360 -#define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0
1363 - * Special inode numbers
1365 -#define EXT2_BAD_INO 1 /* Bad blocks inode */
1366 -#define EXT2_ROOT_INO 2 /* Root inode */
1367 -#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */
1368 -#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */
1370 -/* First non-reserved inode for old ext2 filesystems */
1371 -#define EXT2_GOOD_OLD_FIRST_INO 11
1373 -/* Assume that user mode programs are passing in an ext2fs superblock, not
1374 - * a kernel struct super_block. This will allow us to call the feature-test
1375 - * macros from user land. */
1376 -#define EXT2_SB(sb) (sb)
1379 - * Maximal count of links to a file
1381 -#define EXT2_LINK_MAX 32000
1384 - * Macro-instructions used to manage several block sizes
1386 -#define EXT2_MIN_BLOCK_SIZE 1024
1387 -#define EXT2_MAX_BLOCK_SIZE 4096
1388 -#define EXT2_MIN_BLOCK_LOG_SIZE 10
1389 -# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
1390 -#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (uint32_t))
1391 -# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
1392 -#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
1393 - EXT2_GOOD_OLD_INODE_SIZE : \
1394 - (s)->s_inode_size)
1395 -#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
1396 - EXT2_GOOD_OLD_FIRST_INO : \
1400 - * Macro-instructions used to manage fragments
1402 -#define EXT2_MIN_FRAG_SIZE 1024
1403 -#define EXT2_MAX_FRAG_SIZE 4096
1404 -#define EXT2_MIN_FRAG_LOG_SIZE 10
1405 -# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
1406 -# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
1409 - * Structure of a blocks group descriptor
1411 -struct ext2_group_desc
1413 - uint32_t bg_block_bitmap; /* Blocks bitmap block */
1414 - uint32_t bg_inode_bitmap; /* Inodes bitmap block */
1415 - uint32_t bg_inode_table; /* Inodes table block */
1416 - uint16_t bg_free_blocks_count; /* Free blocks count */
1417 - uint16_t bg_free_inodes_count; /* Free inodes count */
1418 - uint16_t bg_used_dirs_count; /* Directories count */
1420 - uint32_t bg_reserved[3];
1424 - * Macro-instructions used to manage group descriptors
1426 -# define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
1427 -# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
1428 -# define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
1431 - * Constants relative to the data blocks
1433 -#define EXT2_NDIR_BLOCKS 12
1434 -#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
1435 -#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
1436 -#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
1437 -#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
1440 - * Inode flags (GETFLAGS/SETFLAGS)
1442 -#define EXT2_SECRM_FL FS_SECRM_FL /* Secure deletion */
1443 -#define EXT2_UNRM_FL FS_UNRM_FL /* Undelete */
1444 -#define EXT2_COMPR_FL FS_COMPR_FL /* Compress file */
1445 -#define EXT2_SYNC_FL FS_SYNC_FL /* Synchronous updates */
1446 -#define EXT2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */
1447 -#define EXT2_APPEND_FL FS_APPEND_FL /* writes to file may only append */
1448 -#define EXT2_NODUMP_FL FS_NODUMP_FL /* do not dump file */
1449 -#define EXT2_NOATIME_FL FS_NOATIME_FL /* do not update atime */
1450 -/* Reserved for compression usage... */
1451 -#define EXT2_DIRTY_FL FS_DIRTY_FL
1452 -#define EXT2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */
1453 -#define EXT2_NOCOMP_FL FS_NOCOMP_FL /* Don't compress */
1454 -#define EXT2_ECOMPR_FL FS_ECOMPR_FL /* Compression error */
1455 -/* End compression flags --- maybe not all used */
1456 -#define EXT2_BTREE_FL FS_BTREE_FL /* btree format dir */
1457 -#define EXT2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */
1458 -#define EXT2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */
1459 -#define EXT2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* Reserved for ext3 */
1460 -#define EXT2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */
1461 -#define EXT2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour (directories only) */
1462 -#define EXT2_TOPDIR_FL FS_TOPDIR_FL /* Top of directory hierarchies*/
1463 -#define EXT2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */
1465 -#define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */
1466 -#define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */
1468 -/* Flags that should be inherited by new inodes from their parent. */
1469 -#define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\
1470 - EXT2_SYNC_FL | EXT2_IMMUTABLE_FL | EXT2_APPEND_FL |\
1471 - EXT2_NODUMP_FL | EXT2_NOATIME_FL | EXT2_COMPRBLK_FL|\
1472 - EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\
1473 - EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL)
1475 -/* Flags that are appropriate for regular files (all but dir-specific ones). */
1476 -#define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL))
1478 -/* Flags that are appropriate for non-directories/regular files. */
1479 -#define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL)
1481 -/* Mask out flags that are inappropriate for the given type of inode. */
1482 -static inline uint32_t ext2_mask_flags(mode_t mode, uint32_t flags)
1484 - if (S_ISDIR(mode))
1486 - else if (S_ISREG(mode))
1487 - return flags & EXT2_REG_FLMASK;
1489 - return flags & EXT2_OTHER_FLMASK;
1495 -#define EXT2_IOC_GETFLAGS FS_IOC_GETFLAGS
1496 -#define EXT2_IOC_SETFLAGS FS_IOC_SETFLAGS
1497 -#define EXT2_IOC_GETVERSION FS_IOC_GETVERSION
1498 -#define EXT2_IOC_SETVERSION FS_IOC_SETVERSION
1499 -#define EXT2_IOC_GETRSVSZ _IOR('f', 5, long)
1500 -#define EXT2_IOC_SETRSVSZ _IOW('f', 6, long)
1503 - * ioctl commands in 32 bit emulation
1505 -#define EXT2_IOC32_GETFLAGS FS_IOC32_GETFLAGS
1506 -#define EXT2_IOC32_SETFLAGS FS_IOC32_SETFLAGS
1507 -#define EXT2_IOC32_GETVERSION FS_IOC32_GETVERSION
1508 -#define EXT2_IOC32_SETVERSION FS_IOC32_SETVERSION
1511 - * Structure of an inode on the disk
1513 -struct ext2_inode {
1514 - uint16_t i_mode; /* File mode */
1515 - uint16_t i_uid; /* Low 16 bits of Owner Uid */
1516 - uint32_t i_size; /* Size in bytes */
1517 - uint32_t i_atime; /* Access time */
1518 - uint32_t i_ctime; /* Creation time */
1519 - uint32_t i_mtime; /* Modification time */
1520 - uint32_t i_dtime; /* Deletion Time */
1521 - uint16_t i_gid; /* Low 16 bits of Group Id */
1522 - uint16_t i_links_count; /* Links count */
1523 - uint32_t i_blocks; /* Blocks count */
1524 - uint32_t i_flags; /* File flags */
1527 - uint32_t l_i_reserved1;
1530 - uint32_t h_i_translator;
1533 - uint32_t m_i_reserved1;
1535 - } osd1; /* OS dependent 1 */
1536 - uint32_t i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
1537 - uint32_t i_generation; /* File version (for NFS) */
1538 - uint32_t i_file_acl; /* File ACL */
1539 - uint32_t i_dir_acl; /* Directory ACL */
1540 - uint32_t i_faddr; /* Fragment address */
1543 - uint8_t l_i_frag; /* Fragment number */
1544 - uint8_t l_i_fsize; /* Fragment size */
1546 - uint16_t l_i_uid_high; /* these 2 fields */
1547 - uint16_t l_i_gid_high; /* were reserved2[0] */
1548 - uint32_t l_i_reserved2;
1551 - uint8_t h_i_frag; /* Fragment number */
1552 - uint8_t h_i_fsize; /* Fragment size */
1553 - uint16_t h_i_mode_high;
1554 - uint16_t h_i_uid_high;
1555 - uint16_t h_i_gid_high;
1556 - uint32_t h_i_author;
1559 - uint8_t m_i_frag; /* Fragment number */
1560 - uint8_t m_i_fsize; /* Fragment size */
1562 - uint32_t m_i_reserved2[2];
1564 - } osd2; /* OS dependent 2 */
1567 -#define i_size_high i_dir_acl
1569 -#if defined(__KERNEL__) || defined(__linux__)
1570 -#define i_reserved1 osd1.linux1.l_i_reserved1
1571 -#define i_frag osd2.linux2.l_i_frag
1572 -#define i_fsize osd2.linux2.l_i_fsize
1573 -#define i_uid_low i_uid
1574 -#define i_gid_low i_gid
1575 -#define i_uid_high osd2.linux2.l_i_uid_high
1576 -#define i_gid_high osd2.linux2.l_i_gid_high
1577 -#define i_reserved2 osd2.linux2.l_i_reserved2
1581 -#define i_translator osd1.hurd1.h_i_translator
1582 -#define i_frag osd2.hurd2.h_i_frag
1583 -#define i_fsize osd2.hurd2.h_i_fsize
1584 -#define i_uid_high osd2.hurd2.h_i_uid_high
1585 -#define i_gid_high osd2.hurd2.h_i_gid_high
1586 -#define i_author osd2.hurd2.h_i_author
1590 -#define i_reserved1 osd1.masix1.m_i_reserved1
1591 -#define i_frag osd2.masix2.m_i_frag
1592 -#define i_fsize osd2.masix2.m_i_fsize
1593 -#define i_reserved2 osd2.masix2.m_i_reserved2
1597 - * File system states
1599 -#define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */
1600 -#define EXT2_ERROR_FS 0x0002 /* Errors detected */
1605 -#define EXT2_MOUNT_CHECK 0x000001 /* Do mount-time checks */
1606 -#define EXT2_MOUNT_OLDALLOC 0x000002 /* Don't use the new Orlov allocator */
1607 -#define EXT2_MOUNT_GRPID 0x000004 /* Create files with directory's group */
1608 -#define EXT2_MOUNT_DEBUG 0x000008 /* Some debugging messages */
1609 -#define EXT2_MOUNT_ERRORS_CONT 0x000010 /* Continue on errors */
1610 -#define EXT2_MOUNT_ERRORS_RO 0x000020 /* Remount fs ro on errors */
1611 -#define EXT2_MOUNT_ERRORS_PANIC 0x000040 /* Panic on errors */
1612 -#define EXT2_MOUNT_MINIX_DF 0x000080 /* Mimics the Minix statfs */
1613 -#define EXT2_MOUNT_NOBH 0x000100 /* No buffer_heads */
1614 -#define EXT2_MOUNT_NO_UID32 0x000200 /* Disable 32-bit UIDs */
1615 -#define EXT2_MOUNT_XATTR_USER 0x004000 /* Extended user attributes */
1616 -#define EXT2_MOUNT_POSIX_ACL 0x008000 /* POSIX Access Control Lists */
1617 -#define EXT2_MOUNT_XIP 0x010000 /* Execute in place */
1618 -#define EXT2_MOUNT_USRQUOTA 0x020000 /* user quota */
1619 -#define EXT2_MOUNT_GRPQUOTA 0x040000 /* group quota */
1620 -#define EXT2_MOUNT_RESERVATION 0x080000 /* Preallocation */
1623 -#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
1624 -#define set_opt(o, opt) o |= EXT2_MOUNT_##opt
1625 -#define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \
1628 - * Maximal mount counts between two filesystem checks
1630 -#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
1631 -#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */
1634 - * Behaviour when detecting errors
1636 -#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */
1637 -#define EXT2_ERRORS_RO 2 /* Remount fs read-only */
1638 -#define EXT2_ERRORS_PANIC 3 /* Panic */
1639 -#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
1642 - * Structure of the super block
1644 -struct ext2_super_block {
1645 - uint32_t s_inodes_count; /* Inodes count */
1646 - uint32_t s_blocks_count; /* Blocks count */
1647 - uint32_t s_r_blocks_count; /* Reserved blocks count */
1648 - uint32_t s_free_blocks_count; /* Free blocks count */
1649 - uint32_t s_free_inodes_count; /* Free inodes count */
1650 - uint32_t s_first_data_block; /* First Data Block */
1651 - uint32_t s_log_block_size; /* Block size */
1652 - uint32_t s_log_frag_size; /* Fragment size */
1653 - uint32_t s_blocks_per_group; /* # Blocks per group */
1654 - uint32_t s_frags_per_group; /* # Fragments per group */
1655 - uint32_t s_inodes_per_group; /* # Inodes per group */
1656 - uint32_t s_mtime; /* Mount time */
1657 - uint32_t s_wtime; /* Write time */
1658 - uint16_t s_mnt_count; /* Mount count */
1659 - uint16_t s_max_mnt_count; /* Maximal mount count */
1660 - uint16_t s_magic; /* Magic signature */
1661 - uint16_t s_state; /* File system state */
1662 - uint16_t s_errors; /* Behaviour when detecting errors */
1663 - uint16_t s_minor_rev_level; /* minor revision level */
1664 - uint32_t s_lastcheck; /* time of last check */
1665 - uint32_t s_checkinterval; /* max. time between checks */
1666 - uint32_t s_creator_os; /* OS */
1667 - uint32_t s_rev_level; /* Revision level */
1668 - uint16_t s_def_resuid; /* Default uid for reserved blocks */
1669 - uint16_t s_def_resgid; /* Default gid for reserved blocks */
1671 - * These fields are for EXT2_DYNAMIC_REV superblocks only.
1673 - * Note: the difference between the compatible feature set and
1674 - * the incompatible feature set is that if there is a bit set
1675 - * in the incompatible feature set that the kernel doesn't
1676 - * know about, it should refuse to mount the filesystem.
1678 - * e2fsck's requirements are more strict; if it doesn't know
1679 - * about a feature in either the compatible or incompatible
1680 - * feature set, it must abort and not try to meddle with
1681 - * things it doesn't understand...
1683 - uint32_t s_first_ino; /* First non-reserved inode */
1684 - uint16_t s_inode_size; /* size of inode structure */
1685 - uint16_t s_block_group_nr; /* block group # of this superblock */
1686 - uint32_t s_feature_compat; /* compatible feature set */
1687 - uint32_t s_feature_incompat; /* incompatible feature set */
1688 - uint32_t s_feature_ro_compat; /* readonly-compatible feature set */
1689 - uint8_t s_uuid[16]; /* 128-bit uuid for volume */
1690 - char s_volume_name[16]; /* volume name */
1691 - char s_last_mounted[64]; /* directory where last mounted */
1692 - uint32_t s_algorithm_usage_bitmap; /* For compression */
1694 - * Performance hints. Directory preallocation should only
1695 - * happen if the EXT2_COMPAT_PREALLOC flag is on.
1697 - uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
1698 - uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
1699 - uint16_t s_padding1;
1701 - * Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
1703 - uint8_t s_journal_uuid[16]; /* uuid of journal superblock */
1704 - uint32_t s_journal_inum; /* inode number of journal file */
1705 - uint32_t s_journal_dev; /* device number of journal file */
1706 - uint32_t s_last_orphan; /* start of list of inodes to delete */
1707 - uint32_t s_hash_seed[4]; /* HTREE hash seed */
1708 - uint8_t s_def_hash_version; /* Default hash version to use */
1709 - uint8_t s_reserved_char_pad;
1710 - uint16_t s_reserved_word_pad;
1711 - uint32_t s_default_mount_opts;
1712 - uint32_t s_first_meta_bg; /* First metablock block group */
1713 - uint32_t s_reserved[190]; /* Padding to the end of the block */
1717 - * Codes for operating systems
1719 -#define EXT2_OS_LINUX 0
1720 -#define EXT2_OS_HURD 1
1721 -#define EXT2_OS_MASIX 2
1722 -#define EXT2_OS_FREEBSD 3
1723 -#define EXT2_OS_LITES 4
1728 -#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */
1729 -#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
1731 -#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV
1732 -#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV
1734 -#define EXT2_GOOD_OLD_INODE_SIZE 128
1737 - * Feature set definitions
1740 -#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \
1741 - ( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
1742 -#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \
1743 - ( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
1744 -#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \
1745 - ( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
1746 -#define EXT2_SET_COMPAT_FEATURE(sb,mask) \
1747 - EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
1748 -#define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \
1749 - EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
1750 -#define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \
1751 - EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
1752 -#define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \
1753 - EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
1754 -#define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
1755 - EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
1756 -#define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \
1757 - EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
1759 -#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001
1760 -#define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002
1761 -#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
1762 -#define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008
1763 -#define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010
1764 -#define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020
1765 -#define EXT2_FEATURE_COMPAT_ANY 0xffffffff
1767 -#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
1768 -#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
1769 -#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
1770 -#define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff
1772 -#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001
1773 -#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
1774 -#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004
1775 -#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
1776 -#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
1777 -#define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff
1779 -#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR
1780 -#define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \
1781 - EXT2_FEATURE_INCOMPAT_META_BG)
1782 -#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
1783 - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
1784 - EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
1785 -#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP
1786 -#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP
1789 - * Default values for user and/or group using reserved blocks
1791 -#define EXT2_DEF_RESUID 0
1792 -#define EXT2_DEF_RESGID 0
1795 - * Default mount options
1797 -#define EXT2_DEFM_DEBUG 0x0001
1798 -#define EXT2_DEFM_BSDGROUPS 0x0002
1799 -#define EXT2_DEFM_XATTR_USER 0x0004
1800 -#define EXT2_DEFM_ACL 0x0008
1801 -#define EXT2_DEFM_UID16 0x0010
1802 - /* Not used by ext2, but reserved for use by ext3 */
1803 -#define EXT3_DEFM_JMODE 0x0060
1804 -#define EXT3_DEFM_JMODE_DATA 0x0020
1805 -#define EXT3_DEFM_JMODE_ORDERED 0x0040
1806 -#define EXT3_DEFM_JMODE_WBACK 0x0060
1809 - * Structure of a directory entry
1811 -#define EXT2_NAME_LEN 255
1813 -struct ext2_dir_entry {
1814 - uint32_t inode; /* Inode number */
1815 - uint16_t rec_len; /* Directory entry length */
1816 - uint16_t name_len; /* Name length */
1817 - char name[EXT2_NAME_LEN]; /* File name */
1821 - * The new version of the directory entry. Since EXT2 structures are
1822 - * stored in intel byte order, and the name_len field could never be
1823 - * bigger than 255 chars, it's safe to reclaim the extra byte for the
1824 - * file_type field.
1826 -struct ext2_dir_entry_2 {
1827 - uint32_t inode; /* Inode number */
1828 - uint16_t rec_len; /* Directory entry length */
1829 - uint8_t name_len; /* Name length */
1830 - uint8_t file_type;
1831 - char name[EXT2_NAME_LEN]; /* File name */
1835 - * Ext2 directory file types. Only the low 3 bits are used. The
1836 - * other bits are reserved for now.
1839 - EXT2_FT_UNKNOWN = 0,
1840 - EXT2_FT_REG_FILE = 1,
1842 - EXT2_FT_CHRDEV = 3,
1843 - EXT2_FT_BLKDEV = 4,
1846 - EXT2_FT_SYMLINK = 7,
1851 - * EXT2_DIR_PAD defines the directory entries boundaries
1853 - * NOTE: It must be a multiple of 4
1855 -#define EXT2_DIR_PAD 4
1856 -#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
1857 -#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
1859 -#define EXT2_MAX_REC_LEN ((1<<16)-1)
1862 diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c
1863 index 2d9d720..69b25c9 100644
1864 --- a/util-linux/mkfs_ext2.c
1865 +++ b/util-linux/mkfs_ext2.c
1869 #include <linux/fs.h>
1870 -#include "bb_linux_ext2_fs.h"
1871 +#include "bb_e2fs_defs.h"
1873 #define ENABLE_FEATURE_MKFS_EXT2_RESERVED_GDT 0
1874 #define ENABLE_FEATURE_MKFS_EXT2_DIR_INDEX 1