source: branches/stable/mindi-busybox/e2fsprogs/e2fs_defs.h @ 1770

Last change on this file since 1770 was 1770, checked in by Bruno Cornec, 13 years ago
  • Better output for mindi-busybox revision
  • Remove dummy file created on NFS - report from Arnaud Tiger <arnaud.tiger_at_hp.com>
  • strace useful for debug
  • fix new versions for pb (2.0.0 for mindi and 1.7.2 for mindi-busybox)
  • fix build process for mindi-busybox + options used in that version (dd for label-partitions-as-necessary)
  • fix typo in label-partitions-as-necessary which doesn't seem to work
  • Update to busybox 1.7.2
  • perl is now required at restore time to support uuid swap partitions (and will be used for many other thigs

in the future for sure)

  • next mindi version will be 2.0.0 due to all the changes made in it (udev may break working distros)
  • small optimization in mindi on keyboard handling (one single find instead of multiple)
  • better interaction for USB device when launching mindi manually
  • attempt to automatically guess block disk size for ramdisk
  • fix typos in bkphw
  • Fix the remaining problem with UUID support for swap partitions
  • Updates mondoarchive man page for USB support
  • Adds preliminary Hardware support to mindi (Proliant SSSTK)
  • Tries to add udev support also for rhel4
  • Fix UUID support which was still broken.
  • Be conservative in test for the start-nfs script
  • Update config file for mindi-busybox for 1.7.2 migration
  • Try to run around a busybox bug (1.2.2 pb on inexistant links)
  • Add build content for mindi-busybox in pb
  • Remove distributions content for mindi-busybox
  • Fix a warning on inexistant raidtab
  • Solve problem on tmpfs in restore init (Problem of inexistant symlink and busybox)
  • Create MONDO_CACHE and use it everywhere + creation at start
  • Really never try to eject a USB device
  • Fix a issue with &> usage (replaced with 1> and 2>)
  • Adds magic file to depllist in order to have file working + ldd which helps for debugging issues
  • tty modes correct to avoid sh error messages
  • Use ext3 normally and not ext2 instead
  • USB device should be corrected after reading (take 1st part)
  • Adds a mount_USB_here function derived from mount_CDROM_here
  • usb detection place before /dev detection in device name at restore time
  • Fix when restoring from USB: media is asked in interactive mode
  • Adds USB support for mondorestore
  • mount_cdrom => mount_media
  • elilo.efi is now searched throughout /boot/efi and not in a fixed place as there is no standard
  • untar-and-softlink => untar (+ interface change)
  • suppress useless softlinks creation/removal in boot process
  • avoids udevd messages on groups
  • Increase # of disks to 99 as in mindi at restore time (should be a conf file parameter)
  • skip existing big file creation
  • seems to work correctly for USB mindi boot
  • Adds group and tty link to udev conf
  • Always load usb-torage (even 2.6) to initiate USB bus discovery
  • Better printing of messages
  • Attempt to fix a bug in supporting OpenSusE 10.3 kernel for initramfs (mindi may now use multiple regex for kernel initrd detection)
  • Links were not correctly done as non relative for modules in mindi
  • exclusion of modules denied now works
  • Also create modules in their ordinary place, so that classical modprobe works + copy modules.dep
  • Fix bugs for DENY_MODS handling
  • Add device /dev/console for udev
  • ide-generic should now really be excluded
  • Fix a bug in major number for tty
  • If udev then adds modprobe/insmod to rootfs
  • tty0 is also cretaed with udev
  • ide-generic put rather in DENY_MODS
  • udevd remove from deplist s handled in mindi directly
  • better default for mindi when using --usb
  • Handles dynamically linked busybox (in case we want to use it soon ;-)
  • Adds fixed devices to create for udev
  • ide-generic should not be part of the initrd when using libata v2
  • support a dynamically linked udev (case on Ubuntu 7.10 and Mandriva 2008.0 so should be quite generic) This will give incitation to move to dyn. linked binaries in the initrd which will help for other tasks (ia6 4)
  • Improvement in udev support (do not use cl options not available in busybox)
  • Udev in mindi
    • auto creation of the right links at boot time with udev-links.conf(from Mandriva 2008.0)
    • rework startup of udev as current makes kernel crash (from Mandriva 2008.0)
    • add support for 64 bits udev
  • Try to render MyInsmod? silent at boot time
  • Adds udev support (mandatory for newest distributions to avoid remapping of devices in a different way as on the original system)
  • We also need vaft format support for USB boot
  • Adds libusual support (Ubuntu 7.10 needs it for USB)
  • Improve Ubuntu/Debian? keyboard detection and support
  • pbinit adapted to new pb (0.8.10). Filtering of docs done in it
  • Suppress some mondo warnings and errors on USB again
  • Tries to fix lack of files in deb mindi package
  • Verify should now work for USB devices
  • More log/mesages improvement for USB support
  • - Supress g_erase_tmpdir_and_scratchdir
  • Improve some log messages for USB support
  • Try to improve install in mindi to avoid issues with isolinux.cfg not installed vene if in the pkg :-(
  • Improve mindi-busybox build
  • In conformity with pb 0.8.9
  • Add support for Ubuntu 7.10 in build process
  • Add USB Key button to Menu UI (CD streamer removed)
  • Attempt to fix error messages on tmp/scratch files at the end by removing those dir at the latest possible.
  • Fix a bug linked to the size of the -E param which could be used (Arnaud Tiger/René? Ribaud).
  • Integrate ~/.pbrc content into mondorescue.pb (required project-builder >= 0.8.7)
  • Put mondorescue in conformity with new pb filtering rules
  • Add USB support at restore time (no test done yet). New start-usb script PB varibale added where useful
  • Unmounting USB device before removal of temporary scratchdir
  • Stil refining USB copy back to mondo (one command was not executed)
  • No need to have the image subdor in the csratchdir when USB.
  • umount the USB partition before attempting to use it
  • Remove useless copy from mindi to mondo at end of USB handling

(risky merge, we are raising the limits of 2 diverging branches. The status of stable is not completely sure as such. Will need lots of tests, but it's not yet done :-()
(merge -r1692:1769 $SVN_M/branches/2.2.5)

  • Property svn:eol-style set to native
File size: 18.1 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 *  linux/include/linux/ext2_fs.h
4 *
5 * Copyright (C) 1992, 1993, 1994, 1995
6 * Remy Card (card@masi.ibp.fr)
7 * Laboratoire MASI - Institut Blaise Pascal
8 * Universite Pierre et Marie Curie (Paris VI)
9 *
10 * Copyright (C) 1991, 1992  Linus Torvalds
11 */
12
13#ifndef _LINUX_EXT2_FS_H
14#define _LINUX_EXT2_FS_H
15
16/*
17 * Special inode numbers
18 */
19#define EXT2_BAD_INO         1  /* Bad blocks inode */
20#define EXT2_ROOT_INO        2  /* Root inode */
21#define EXT2_ACL_IDX_INO     3  /* ACL inode */
22#define EXT2_ACL_DATA_INO    4  /* ACL inode */
23#define EXT2_BOOT_LOADER_INO     5  /* Boot loader inode */
24#define EXT2_UNDEL_DIR_INO   6  /* Undelete directory inode */
25#define EXT2_RESIZE_INO      7  /* Reserved group descriptors inode */
26#define EXT2_JOURNAL_INO     8  /* Journal inode */
27
28/* First non-reserved inode for old ext2 filesystems */
29#define EXT2_GOOD_OLD_FIRST_INO 11
30
31/*
32 * The second extended file system magic number
33 */
34#define EXT2_SUPER_MAGIC    0xEF53
35
36/* Assume that user mode programs are passing in an ext2fs superblock, not
37 * a kernel struct super_block.  This will allow us to call the feature-test
38 * macros from user land. */
39#define EXT2_SB(sb) (sb)
40
41/*
42 * Maximal count of links to a file
43 */
44#define EXT2_LINK_MAX       32000
45
46/*
47 * Macro-instructions used to manage several block sizes
48 */
49#define EXT2_MIN_BLOCK_LOG_SIZE     10  /* 1024 */
50#define EXT2_MAX_BLOCK_LOG_SIZE     16  /* 65536 */
51#define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE)
52#define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE)
53#define EXT2_BLOCK_SIZE(s)  (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
54#define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
55#define EXT2_INODE_SIZE(s)  (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
56                 EXT2_GOOD_OLD_INODE_SIZE : (s)->s_inode_size)
57#define EXT2_FIRST_INO(s)   (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
58                 EXT2_GOOD_OLD_FIRST_INO : (s)->s_first_ino)
59#define EXT2_ADDR_PER_BLOCK(s)  (EXT2_BLOCK_SIZE(s) / sizeof(uint32_t))
60
61/*
62 * Macro-instructions used to manage fragments
63 */
64#define EXT2_MIN_FRAG_SIZE      EXT2_MIN_BLOCK_SIZE
65#define EXT2_MAX_FRAG_SIZE      EXT2_MAX_BLOCK_SIZE
66#define EXT2_MIN_FRAG_LOG_SIZE      EXT2_MIN_BLOCK_LOG_SIZE
67#define EXT2_FRAG_SIZE(s)       (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
68#define EXT2_FRAGS_PER_BLOCK(s)     (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
69
70/*
71 * ACL structures
72 */
73struct ext2_acl_header {    /* Header of Access Control Lists */
74    uint32_t    aclh_size;
75    uint32_t    aclh_file_count;
76    uint32_t    aclh_acle_count;
77    uint32_t    aclh_first_acle;
78};
79
80struct ext2_acl_entry { /* Access Control List Entry */
81    uint32_t    acle_size;
82    uint16_t    acle_perms; /* Access permissions */
83    uint16_t    acle_type;  /* Type of entry */
84    uint16_t    acle_tag;   /* User or group identity */
85    uint16_t    acle_pad1;
86    uint32_t    acle_next;  /* Pointer on next entry for the */
87                    /* same inode or on next free entry */
88};
89
90/*
91 * Structure of a blocks group descriptor
92 */
93struct ext2_group_desc {
94    uint32_t    bg_block_bitmap;    /* Blocks bitmap block */
95    uint32_t    bg_inode_bitmap;    /* Inodes bitmap block */
96    uint32_t    bg_inode_table;     /* Inodes table block */
97    uint16_t    bg_free_blocks_count;   /* Free blocks count */
98    uint16_t    bg_free_inodes_count;   /* Free inodes count */
99    uint16_t    bg_used_dirs_count; /* Directories count */
100    uint16_t    bg_pad;
101    uint32_t    bg_reserved[3];
102};
103
104/*
105 * Data structures used by the directory indexing feature
106 *
107 * Note: all of the multibyte integer fields are little endian.
108 */
109
110/*
111 * Note: dx_root_info is laid out so that if it should somehow get
112 * overlaid by a dirent the two low bits of the hash version will be
113 * zero.  Therefore, the hash version mod 4 should never be 0.
114 * Sincerely, the paranoia department.
115 */
116struct ext2_dx_root_info {
117    uint32_t    reserved_zero;
118    uint8_t     hash_version; /* 0 now, 1 at release */
119    uint8_t     info_length; /* 8 */
120    uint8_t     indirect_levels;
121    uint8_t     unused_flags;
122};
123
124#define EXT2_HASH_LEGACY    0
125#define EXT2_HASH_HALF_MD4  1
126#define EXT2_HASH_TEA       2
127
128#define EXT2_HASH_FLAG_INCOMPAT 0x1
129
130struct ext2_dx_entry {
131    uint32_t hash;
132    uint32_t block;
133};
134
135struct ext2_dx_countlimit {
136    uint16_t limit;
137    uint16_t count;
138};
139
140
141/*
142 * Macro-instructions used to manage group descriptors
143 */
144#define EXT2_BLOCKS_PER_GROUP(s)    (EXT2_SB(s)->s_blocks_per_group)
145#define EXT2_INODES_PER_GROUP(s)    (EXT2_SB(s)->s_inodes_per_group)
146#define EXT2_INODES_PER_BLOCK(s)    (EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
147/* limits imposed by 16-bit value gd_free_{blocks,inode}_count */
148#define EXT2_MAX_BLOCKS_PER_GROUP(s)    ((1 << 16) - 8)
149#define EXT2_MAX_INODES_PER_GROUP(s)    ((1 << 16) - EXT2_INODES_PER_BLOCK(s))
150#define EXT2_DESC_PER_BLOCK(s)      (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
151
152/*
153 * Constants relative to the data blocks
154 */
155#define EXT2_NDIR_BLOCKS        12
156#define EXT2_IND_BLOCK          EXT2_NDIR_BLOCKS
157#define EXT2_DIND_BLOCK         (EXT2_IND_BLOCK + 1)
158#define EXT2_TIND_BLOCK         (EXT2_DIND_BLOCK + 1)
159#define EXT2_N_BLOCKS           (EXT2_TIND_BLOCK + 1)
160
161/*
162 * Inode flags
163 */
164#define EXT2_SECRM_FL           0x00000001 /* Secure deletion */
165#define EXT2_UNRM_FL            0x00000002 /* Undelete */
166#define EXT2_COMPR_FL           0x00000004 /* Compress file */
167#define EXT2_SYNC_FL            0x00000008 /* Synchronous updates */
168#define EXT2_IMMUTABLE_FL       0x00000010 /* Immutable file */
169#define EXT2_APPEND_FL          0x00000020 /* writes to file may only append */
170#define EXT2_NODUMP_FL          0x00000040 /* do not dump file */
171#define EXT2_NOATIME_FL         0x00000080 /* do not update atime */
172/* Reserved for compression usage... */
173#define EXT2_DIRTY_FL           0x00000100
174#define EXT2_COMPRBLK_FL        0x00000200 /* One or more compressed clusters */
175#define EXT2_NOCOMPR_FL         0x00000400 /* Access raw compressed data */
176#define EXT2_ECOMPR_FL          0x00000800 /* Compression error */
177/* End compression flags --- maybe not all used */
178#define EXT2_BTREE_FL           0x00001000 /* btree format dir */
179#define EXT2_INDEX_FL           0x00001000 /* hash-indexed directory */
180#define EXT2_IMAGIC_FL          0x00002000
181#define EXT3_JOURNAL_DATA_FL        0x00004000 /* file data should be journaled */
182#define EXT2_NOTAIL_FL          0x00008000 /* file tail should not be merged */
183#define EXT2_DIRSYNC_FL         0x00010000 /* Synchronous directory modifications */
184#define EXT2_TOPDIR_FL          0x00020000 /* Top of directory hierarchies*/
185#define EXT3_EXTENTS_FL         0x00080000 /* Inode uses extents */
186#define EXT2_RESERVED_FL        0x80000000 /* reserved for ext2 lib */
187
188#define EXT2_FL_USER_VISIBLE        0x0003DFFF /* User visible flags */
189#define EXT2_FL_USER_MODIFIABLE     0x000080FF /* User modifiable flags */
190
191/*
192 * ioctl commands
193 */
194#define EXT2_IOC_GETFLAGS       _IOR('f', 1, long)
195#define EXT2_IOC_SETFLAGS       _IOW('f', 2, long)
196#define EXT2_IOC_GETVERSION     _IOR('v', 1, long)
197#define EXT2_IOC_SETVERSION     _IOW('v', 2, long)
198
199/*
200 * Structure of an inode on the disk
201 */
202struct ext2_inode {
203    uint16_t    i_mode;     /* File mode */
204    uint16_t    i_uid;      /* Low 16 bits of Owner Uid */
205    uint32_t    i_size;     /* Size in bytes */
206    uint32_t    i_atime;    /* Access time */
207    uint32_t    i_ctime;    /* Creation time */
208    uint32_t    i_mtime;    /* Modification time */
209    uint32_t    i_dtime;    /* Deletion Time */
210    uint16_t    i_gid;      /* Low 16 bits of Group Id */
211    uint16_t    i_links_count;  /* Links count */
212    uint32_t    i_blocks;   /* Blocks count */
213    uint32_t    i_flags;    /* File flags */
214    union {
215        struct {
216            uint32_t  l_i_reserved1;
217        } linux1;
218        struct {
219            uint32_t  h_i_translator;
220        } hurd1;
221        struct {
222            uint32_t  m_i_reserved1;
223        } masix1;
224    } osd1;             /* OS dependent 1 */
225    uint32_t    i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
226    uint32_t    i_generation;   /* File version (for NFS) */
227    uint32_t    i_file_acl; /* File ACL */
228    uint32_t    i_dir_acl;  /* Directory ACL */
229    uint32_t    i_faddr;    /* Fragment address */
230    union {
231        struct {
232            uint8_t     l_i_frag;   /* Fragment number */
233            uint8_t     l_i_fsize;  /* Fragment size */
234            uint16_t    i_pad1;
235            uint16_t    l_i_uid_high;   /* these 2 fields    */
236            uint16_t    l_i_gid_high;   /* were reserved2[0] */
237            uint32_t    l_i_reserved2;
238        } linux2;
239        struct {
240            uint8_t     h_i_frag;   /* Fragment number */
241            uint8_t     h_i_fsize;  /* Fragment size */
242            uint16_t    h_i_mode_high;
243            uint16_t    h_i_uid_high;
244            uint16_t    h_i_gid_high;
245            uint32_t    h_i_author;
246        } hurd2;
247        struct {
248            uint8_t     m_i_frag;   /* Fragment number */
249            uint8_t     m_i_fsize;  /* Fragment size */
250            uint16_t    m_pad1;
251            uint32_t    m_i_reserved2[2];
252        } masix2;
253    } osd2;             /* OS dependent 2 */
254};
255
256/*
257 * Permanent part of an large inode on the disk
258 */
259struct ext2_inode_large {
260    uint16_t    i_mode;     /* File mode */
261    uint16_t    i_uid;      /* Low 16 bits of Owner Uid */
262    uint32_t    i_size;     /* Size in bytes */
263    uint32_t    i_atime;    /* Access time */
264    uint32_t    i_ctime;    /* Creation time */
265    uint32_t    i_mtime;    /* Modification time */
266    uint32_t    i_dtime;    /* Deletion Time */
267    uint16_t    i_gid;      /* Low 16 bits of Group Id */
268    uint16_t    i_links_count;  /* Links count */
269    uint32_t    i_blocks;   /* Blocks count */
270    uint32_t    i_flags;    /* File flags */
271    union {
272        struct {
273            uint32_t  l_i_reserved1;
274        } linux1;
275        struct {
276            uint32_t  h_i_translator;
277        } hurd1;
278        struct {
279            uint32_t  m_i_reserved1;
280        } masix1;
281    } osd1;             /* OS dependent 1 */
282    uint32_t    i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
283    uint32_t    i_generation;   /* File version (for NFS) */
284    uint32_t    i_file_acl; /* File ACL */
285    uint32_t    i_dir_acl;  /* Directory ACL */
286    uint32_t    i_faddr;    /* Fragment address */
287    union {
288        struct {
289            uint8_t     l_i_frag;   /* Fragment number */
290            uint8_t     l_i_fsize;  /* Fragment size */
291            uint16_t    i_pad1;
292            uint16_t    l_i_uid_high;   /* these 2 fields    */
293            uint16_t    l_i_gid_high;   /* were reserved2[0] */
294            uint32_t    l_i_reserved2;
295        } linux2;
296        struct {
297            uint8_t     h_i_frag;   /* Fragment number */
298            uint8_t     h_i_fsize;  /* Fragment size */
299            uint16_t    h_i_mode_high;
300            uint16_t    h_i_uid_high;
301            uint16_t    h_i_gid_high;
302            uint32_t    h_i_author;
303        } hurd2;
304        struct {
305            uint8_t     m_i_frag;   /* Fragment number */
306            uint8_t     m_i_fsize;  /* Fragment size */
307            uint16_t    m_pad1;
308            uint32_t    m_i_reserved2[2];
309        } masix2;
310    } osd2;             /* OS dependent 2 */
311    uint16_t    i_extra_isize;
312    uint16_t    i_pad1;
313};
314
315#define i_size_high i_dir_acl
316
317/*
318 * File system states
319 */
320#define EXT2_VALID_FS           0x0001  /* Unmounted cleanly */
321#define EXT2_ERROR_FS           0x0002  /* Errors detected */
322
323/*
324 * Mount flags
325 */
326#define EXT2_MOUNT_CHECK        0x0001  /* Do mount-time checks */
327#define EXT2_MOUNT_GRPID        0x0004  /* Create files with directory's group */
328#define EXT2_MOUNT_DEBUG        0x0008  /* Some debugging messages */
329#define EXT2_MOUNT_ERRORS_CONT      0x0010  /* Continue on errors */
330#define EXT2_MOUNT_ERRORS_RO        0x0020  /* Remount fs ro on errors */
331#define EXT2_MOUNT_ERRORS_PANIC     0x0040  /* Panic on errors */
332#define EXT2_MOUNT_MINIX_DF     0x0080  /* Mimics the Minix statfs */
333#define EXT2_MOUNT_NO_UID32     0x0200  /* Disable 32-bit UIDs */
334
335#define clear_opt(o, opt)       o &= ~EXT2_MOUNT_##opt
336#define set_opt(o, opt)         o |= EXT2_MOUNT_##opt
337#define test_opt(sb, opt)       (EXT2_SB(sb)->s_mount_opt & \
338                     EXT2_MOUNT_##opt)
339/*
340 * Maximal mount counts between two filesystem checks
341 */
342#define EXT2_DFL_MAX_MNT_COUNT      20  /* Allow 20 mounts */
343#define EXT2_DFL_CHECKINTERVAL      0   /* Don't use interval check */
344
345/*
346 * Behaviour when detecting errors
347 */
348#define EXT2_ERRORS_CONTINUE        1   /* Continue execution */
349#define EXT2_ERRORS_RO          2   /* Remount fs read-only */
350#define EXT2_ERRORS_PANIC       3   /* Panic */
351#define EXT2_ERRORS_DEFAULT     EXT2_ERRORS_CONTINUE
352
353/*
354 * Structure of the super block
355 */
356struct ext2_super_block {
357    uint32_t    s_inodes_count;     /* Inodes count */
358    uint32_t    s_blocks_count;     /* Blocks count */
359    uint32_t    s_r_blocks_count;   /* Reserved blocks count */
360    uint32_t    s_free_blocks_count;    /* Free blocks count */
361    uint32_t    s_free_inodes_count;    /* Free inodes count */
362    uint32_t    s_first_data_block; /* First Data Block */
363    uint32_t    s_log_block_size;   /* Block size */
364    int32_t     s_log_frag_size;    /* Fragment size */
365    uint32_t    s_blocks_per_group; /* # Blocks per group */
366    uint32_t    s_frags_per_group;  /* # Fragments per group */
367    uint32_t    s_inodes_per_group; /* # Inodes per group */
368    uint32_t    s_mtime;        /* Mount time */
369    uint32_t    s_wtime;        /* Write time */
370    uint16_t    s_mnt_count;        /* Mount count */
371    int16_t     s_max_mnt_count;    /* Maximal mount count */
372    uint16_t    s_magic;        /* Magic signature */
373    uint16_t    s_state;        /* File system state */
374    uint16_t    s_errors;       /* Behaviour when detecting errors */
375    uint16_t    s_minor_rev_level;  /* minor revision level */
376    uint32_t    s_lastcheck;        /* time of last check */
377    uint32_t    s_checkinterval;    /* max. time between checks */
378    uint32_t    s_creator_os;       /* OS */
379    uint32_t    s_rev_level;        /* Revision level */
380    uint16_t    s_def_resuid;       /* Default uid for reserved blocks */
381    uint16_t    s_def_resgid;       /* Default gid for reserved blocks */
382    /*
383     * These fields are for EXT2_DYNAMIC_REV superblocks only.
384     *
385     * Note: the difference between the compatible feature set and
386     * the incompatible feature set is that if there is a bit set
387     * in the incompatible feature set that the kernel doesn't
388     * know about, it should refuse to mount the filesystem.
389     *
390     * e2fsck's requirements are more strict; if it doesn't know
391     * about a feature in either the compatible or incompatible
392     * feature set, it must abort and not try to meddle with
393     * things it doesn't understand...
394     */
395    uint32_t    s_first_ino;        /* First non-reserved inode */
396    uint16_t    s_inode_size;       /* size of inode structure */
397    uint16_t    s_block_group_nr;   /* block group # of this superblock */
398    uint32_t    s_feature_compat;   /* compatible feature set */
399    uint32_t    s_feature_incompat; /* incompatible feature set */
400    uint32_t    s_feature_ro_compat;    /* readonly-compatible feature set */
401    uint8_t     s_uuid[16];     /* 128-bit uuid for volume */
402    char        s_volume_name[16];  /* volume name */
403    char        s_last_mounted[64]; /* directory where last mounted */
404    uint32_t    s_algorithm_usage_bitmap; /* For compression */
405    /*
406     * Performance hints.  Directory preallocation should only
407     * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
408     */
409    uint8_t s_prealloc_blocks;  /* Nr of blocks to try to preallocate*/
410    uint8_t s_prealloc_dir_blocks;  /* Nr to preallocate for dirs */
411    uint16_t    s_reserved_gdt_blocks;  /* Per group table for online growth */
412    /*
413     * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
414     */
415    uint8_t     s_journal_uuid[16]; /* uuid of journal superblock */
416    uint32_t    s_journal_inum;     /* inode number of journal file */
417    uint32_t    s_journal_dev;      /* device number of journal file */
418    uint32_t    s_last_orphan;      /* start of list of inodes to delete */
419    uint32_t    s_hash_seed[4];     /* HTREE hash seed */
420    uint8_t     s_def_hash_version; /* Default hash version to use */
421    uint8_t     s_jnl_backup_type;  /* Default type of journal backup */
422    uint16_t    s_reserved_word_pad;
423    uint32_t    s_default_mount_opts;
424    uint32_t    s_first_meta_bg;    /* First metablock group */
425    uint32_t    s_mkfs_time;        /* When the filesystem was created */
426    uint32_t    s_jnl_blocks[17];   /* Backup of the journal inode */
427    uint32_t    s_reserved[172];    /* Padding to the end of the block */
428};
429
430/*
431 * Codes for operating systems
432 */
433#define EXT2_OS_LINUX       0
434#define EXT2_OS_HURD        1
435#define EXT2_OS_MASIX       2
436#define EXT2_OS_FREEBSD     3
437#define EXT2_OS_LITES       4
438
439/*
440 * Revision levels
441 */
442#define EXT2_GOOD_OLD_REV   0   /* The good old (original) format */
443#define EXT2_DYNAMIC_REV    1   /* V2 format w/ dynamic inode sizes */
444
445#define EXT2_CURRENT_REV    EXT2_GOOD_OLD_REV
446#define EXT2_MAX_SUPP_REV   EXT2_DYNAMIC_REV
447
448#define EXT2_GOOD_OLD_INODE_SIZE 128
449
450/*
451 * Journal inode backup types
452 */
453#define EXT3_JNL_BACKUP_BLOCKS  1
454
455/*
456 * Feature set definitions
457 */
458
459#define EXT2_HAS_COMPAT_FEATURE(sb,mask)            \
460    ( EXT2_SB(sb)->s_feature_compat & (mask) )
461#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask)         \
462    ( EXT2_SB(sb)->s_feature_ro_compat & (mask) )
463#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask)          \
464    ( EXT2_SB(sb)->s_feature_incompat & (mask) )
465
466#define EXT2_FEATURE_COMPAT_DIR_PREALLOC    0x0001
467#define EXT2_FEATURE_COMPAT_IMAGIC_INODES   0x0002
468#define EXT3_FEATURE_COMPAT_HAS_JOURNAL     0x0004
469#define EXT2_FEATURE_COMPAT_EXT_ATTR        0x0008
470#define EXT2_FEATURE_COMPAT_RESIZE_INODE    0x0010
471#define EXT2_FEATURE_COMPAT_DIR_INDEX       0x0020
472
473#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
474#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE   0x0002
475/* #define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004 not used */
476
477#define EXT2_FEATURE_INCOMPAT_COMPRESSION   0x0001
478#define EXT2_FEATURE_INCOMPAT_FILETYPE      0x0002
479#define EXT3_FEATURE_INCOMPAT_RECOVER       0x0004 /* Needs recovery */
480#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV   0x0008 /* Journal device */
481#define EXT2_FEATURE_INCOMPAT_META_BG       0x0010
482#define EXT3_FEATURE_INCOMPAT_EXTENTS       0x0040
483
484
485#define EXT2_FEATURE_COMPAT_SUPP    0
486#define EXT2_FEATURE_INCOMPAT_SUPP  (EXT2_FEATURE_INCOMPAT_FILETYPE)
487#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
488                     EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
489                     EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
490
491/*
492 * Default values for user and/or group using reserved blocks
493 */
494#define EXT2_DEF_RESUID     0
495#define EXT2_DEF_RESGID     0
496
497/*
498 * Default mount options
499 */
500#define EXT2_DEFM_DEBUG     0x0001
501#define EXT2_DEFM_BSDGROUPS 0x0002
502#define EXT2_DEFM_XATTR_USER    0x0004
503#define EXT2_DEFM_ACL       0x0008
504#define EXT2_DEFM_UID16     0x0010
505#define EXT3_DEFM_JMODE     0x0060
506#define EXT3_DEFM_JMODE_DATA    0x0020
507#define EXT3_DEFM_JMODE_ORDERED 0x0040
508#define EXT3_DEFM_JMODE_WBACK   0x0060
509
510/*
511 * Structure of a directory entry
512 */
513#define EXT2_NAME_LEN 255
514
515struct ext2_dir_entry {
516    uint32_t    inode;          /* Inode number */
517    uint16_t    rec_len;        /* Directory entry length */
518    uint16_t    name_len;       /* Name length */
519    char        name[EXT2_NAME_LEN];    /* File name */
520};
521
522/*
523 * The new version of the directory entry.  Since EXT2 structures are
524 * stored in intel byte order, and the name_len field could never be
525 * bigger than 255 chars, it's safe to reclaim the extra byte for the
526 * file_type field.
527 */
528struct ext2_dir_entry_2 {
529    uint32_t    inode;          /* Inode number */
530    uint16_t    rec_len;        /* Directory entry length */
531    uint8_t     name_len;       /* Name length */
532    uint8_t     file_type;
533    char        name[EXT2_NAME_LEN];    /* File name */
534};
535
536/*
537 * Ext2 directory file types.  Only the low 3 bits are used.  The
538 * other bits are reserved for now.
539 */
540#define EXT2_FT_UNKNOWN     0
541#define EXT2_FT_REG_FILE    1
542#define EXT2_FT_DIR     2
543#define EXT2_FT_CHRDEV      3
544#define EXT2_FT_BLKDEV      4
545#define EXT2_FT_FIFO        5
546#define EXT2_FT_SOCK        6
547#define EXT2_FT_SYMLINK     7
548
549#define EXT2_FT_MAX     8
550
551/*
552 * EXT2_DIR_PAD defines the directory entries boundaries
553 *
554 * NOTE: It must be a multiple of 4
555 */
556#define EXT2_DIR_PAD            4
557#define EXT2_DIR_ROUND          (EXT2_DIR_PAD - 1)
558#define EXT2_DIR_REC_LEN(name_len)  (((name_len) + 8 + EXT2_DIR_ROUND) & \
559                     ~EXT2_DIR_ROUND)
560
561#endif  /* _LINUX_EXT2_FS_H */
Note: See TracBrowser for help on using the repository browser.