|  | .. SPDX-License-Identifier: GPL-2.0 | 
|  |  | 
|  | Super Block | 
|  | ----------- | 
|  |  | 
|  | The superblock records various information about the enclosing | 
|  | filesystem, such as block counts, inode counts, supported features, | 
|  | maintenance information, and more. | 
|  |  | 
|  | If the sparse\_super feature flag is set, redundant copies of the | 
|  | superblock and group descriptors are kept only in the groups whose group | 
|  | number is either 0 or a power of 3, 5, or 7. If the flag is not set, | 
|  | redundant copies are kept in all groups. | 
|  |  | 
|  | The superblock checksum is calculated against the superblock structure, | 
|  | which includes the FS UUID. | 
|  |  | 
|  | The ext4 superblock is laid out as follows in | 
|  | ``struct ext4_super_block``: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 8 24 40 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Offset | 
|  | - Size | 
|  | - Name | 
|  | - Description | 
|  | * - 0x0 | 
|  | - \_\_le32 | 
|  | - s\_inodes\_count | 
|  | - Total inode count. | 
|  | * - 0x4 | 
|  | - \_\_le32 | 
|  | - s\_blocks\_count\_lo | 
|  | - Total block count. | 
|  | * - 0x8 | 
|  | - \_\_le32 | 
|  | - s\_r\_blocks\_count\_lo | 
|  | - This number of blocks can only be allocated by the super-user. | 
|  | * - 0xC | 
|  | - \_\_le32 | 
|  | - s\_free\_blocks\_count\_lo | 
|  | - Free block count. | 
|  | * - 0x10 | 
|  | - \_\_le32 | 
|  | - s\_free\_inodes\_count | 
|  | - Free inode count. | 
|  | * - 0x14 | 
|  | - \_\_le32 | 
|  | - s\_first\_data\_block | 
|  | - First data block. This must be at least 1 for 1k-block filesystems and | 
|  | is typically 0 for all other block sizes. | 
|  | * - 0x18 | 
|  | - \_\_le32 | 
|  | - s\_log\_block\_size | 
|  | - Block size is 2 ^ (10 + s\_log\_block\_size). | 
|  | * - 0x1C | 
|  | - \_\_le32 | 
|  | - s\_log\_cluster\_size | 
|  | - Cluster size is 2 ^ (10 + s\_log\_cluster\_size) blocks if bigalloc is | 
|  | enabled. Otherwise s\_log\_cluster\_size must equal s\_log\_block\_size. | 
|  | * - 0x20 | 
|  | - \_\_le32 | 
|  | - s\_blocks\_per\_group | 
|  | - Blocks per group. | 
|  | * - 0x24 | 
|  | - \_\_le32 | 
|  | - s\_clusters\_per\_group | 
|  | - Clusters per group, if bigalloc is enabled. Otherwise | 
|  | s\_clusters\_per\_group must equal s\_blocks\_per\_group. | 
|  | * - 0x28 | 
|  | - \_\_le32 | 
|  | - s\_inodes\_per\_group | 
|  | - Inodes per group. | 
|  | * - 0x2C | 
|  | - \_\_le32 | 
|  | - s\_mtime | 
|  | - Mount time, in seconds since the epoch. | 
|  | * - 0x30 | 
|  | - \_\_le32 | 
|  | - s\_wtime | 
|  | - Write time, in seconds since the epoch. | 
|  | * - 0x34 | 
|  | - \_\_le16 | 
|  | - s\_mnt\_count | 
|  | - Number of mounts since the last fsck. | 
|  | * - 0x36 | 
|  | - \_\_le16 | 
|  | - s\_max\_mnt\_count | 
|  | - Number of mounts beyond which a fsck is needed. | 
|  | * - 0x38 | 
|  | - \_\_le16 | 
|  | - s\_magic | 
|  | - Magic signature, 0xEF53 | 
|  | * - 0x3A | 
|  | - \_\_le16 | 
|  | - s\_state | 
|  | - File system state. See super_state_ for more info. | 
|  | * - 0x3C | 
|  | - \_\_le16 | 
|  | - s\_errors | 
|  | - Behaviour when detecting errors. See super_errors_ for more info. | 
|  | * - 0x3E | 
|  | - \_\_le16 | 
|  | - s\_minor\_rev\_level | 
|  | - Minor revision level. | 
|  | * - 0x40 | 
|  | - \_\_le32 | 
|  | - s\_lastcheck | 
|  | - Time of last check, in seconds since the epoch. | 
|  | * - 0x44 | 
|  | - \_\_le32 | 
|  | - s\_checkinterval | 
|  | - Maximum time between checks, in seconds. | 
|  | * - 0x48 | 
|  | - \_\_le32 | 
|  | - s\_creator\_os | 
|  | - Creator OS. See the table super_creator_ for more info. | 
|  | * - 0x4C | 
|  | - \_\_le32 | 
|  | - s\_rev\_level | 
|  | - Revision level. See the table super_revision_ for more info. | 
|  | * - 0x50 | 
|  | - \_\_le16 | 
|  | - s\_def\_resuid | 
|  | - Default uid for reserved blocks. | 
|  | * - 0x52 | 
|  | - \_\_le16 | 
|  | - s\_def\_resgid | 
|  | - Default gid for reserved blocks. | 
|  | * - | 
|  | - | 
|  | - | 
|  | - These fields are for EXT4_DYNAMIC_REV superblocks only. | 
|  |  | 
|  | Note: the difference between the compatible feature set and the | 
|  | incompatible feature set is that if there is a bit set in the | 
|  | incompatible feature set that the kernel doesn't know about, it should | 
|  | refuse to mount the filesystem. | 
|  |  | 
|  | e2fsck's requirements are more strict; if it doesn't know | 
|  | about a feature in either the compatible or incompatible feature set, it | 
|  | must abort and not try to meddle with things it doesn't understand... | 
|  | * - 0x54 | 
|  | - \_\_le32 | 
|  | - s\_first\_ino | 
|  | - First non-reserved inode. | 
|  | * - 0x58 | 
|  | - \_\_le16 | 
|  | - s\_inode\_size | 
|  | - Size of inode structure, in bytes. | 
|  | * - 0x5A | 
|  | - \_\_le16 | 
|  | - s\_block\_group\_nr | 
|  | - Block group # of this superblock. | 
|  | * - 0x5C | 
|  | - \_\_le32 | 
|  | - s\_feature\_compat | 
|  | - Compatible feature set flags. Kernel can still read/write this fs even | 
|  | if it doesn't understand a flag; fsck should not do that. See the | 
|  | super_compat_ table for more info. | 
|  | * - 0x60 | 
|  | - \_\_le32 | 
|  | - s\_feature\_incompat | 
|  | - Incompatible feature set. If the kernel or fsck doesn't understand one | 
|  | of these bits, it should stop. See the super_incompat_ table for more | 
|  | info. | 
|  | * - 0x64 | 
|  | - \_\_le32 | 
|  | - s\_feature\_ro\_compat | 
|  | - Readonly-compatible feature set. If the kernel doesn't understand one of | 
|  | these bits, it can still mount read-only. See the super_rocompat_ table | 
|  | for more info. | 
|  | * - 0x68 | 
|  | - \_\_u8 | 
|  | - s\_uuid[16] | 
|  | - 128-bit UUID for volume. | 
|  | * - 0x78 | 
|  | - char | 
|  | - s\_volume\_name[16] | 
|  | - Volume label. | 
|  | * - 0x88 | 
|  | - char | 
|  | - s\_last\_mounted[64] | 
|  | - Directory where filesystem was last mounted. | 
|  | * - 0xC8 | 
|  | - \_\_le32 | 
|  | - s\_algorithm\_usage\_bitmap | 
|  | - For compression (Not used in e2fsprogs/Linux) | 
|  | * - | 
|  | - | 
|  | - | 
|  | - Performance hints.  Directory preallocation should only happen if the | 
|  | EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on. | 
|  | * - 0xCC | 
|  | - \_\_u8 | 
|  | - s\_prealloc\_blocks | 
|  | - #. of blocks to try to preallocate for ... files? (Not used in | 
|  | e2fsprogs/Linux) | 
|  | * - 0xCD | 
|  | - \_\_u8 | 
|  | - s\_prealloc\_dir\_blocks | 
|  | - #. of blocks to preallocate for directories. (Not used in | 
|  | e2fsprogs/Linux) | 
|  | * - 0xCE | 
|  | - \_\_le16 | 
|  | - s\_reserved\_gdt\_blocks | 
|  | - Number of reserved GDT entries for future filesystem expansion. | 
|  | * - | 
|  | - | 
|  | - | 
|  | - Journalling support is valid only if EXT4_FEATURE_COMPAT_HAS_JOURNAL is | 
|  | set. | 
|  | * - 0xD0 | 
|  | - \_\_u8 | 
|  | - s\_journal\_uuid[16] | 
|  | - UUID of journal superblock | 
|  | * - 0xE0 | 
|  | - \_\_le32 | 
|  | - s\_journal\_inum | 
|  | - inode number of journal file. | 
|  | * - 0xE4 | 
|  | - \_\_le32 | 
|  | - s\_journal\_dev | 
|  | - Device number of journal file, if the external journal feature flag is | 
|  | set. | 
|  | * - 0xE8 | 
|  | - \_\_le32 | 
|  | - s\_last\_orphan | 
|  | - Start of list of orphaned inodes to delete. | 
|  | * - 0xEC | 
|  | - \_\_le32 | 
|  | - s\_hash\_seed[4] | 
|  | - HTREE hash seed. | 
|  | * - 0xFC | 
|  | - \_\_u8 | 
|  | - s\_def\_hash\_version | 
|  | - Default hash algorithm to use for directory hashes. See super_def_hash_ | 
|  | for more info. | 
|  | * - 0xFD | 
|  | - \_\_u8 | 
|  | - s\_jnl\_backup\_type | 
|  | - If this value is 0 or EXT3\_JNL\_BACKUP\_BLOCKS (1), then the | 
|  | ``s_jnl_blocks`` field contains a duplicate copy of the inode's | 
|  | ``i_block[]`` array and ``i_size``. | 
|  | * - 0xFE | 
|  | - \_\_le16 | 
|  | - s\_desc\_size | 
|  | - Size of group descriptors, in bytes, if the 64bit incompat feature flag | 
|  | is set. | 
|  | * - 0x100 | 
|  | - \_\_le32 | 
|  | - s\_default\_mount\_opts | 
|  | - Default mount options. See the super_mountopts_ table for more info. | 
|  | * - 0x104 | 
|  | - \_\_le32 | 
|  | - s\_first\_meta\_bg | 
|  | - First metablock block group, if the meta\_bg feature is enabled. | 
|  | * - 0x108 | 
|  | - \_\_le32 | 
|  | - s\_mkfs\_time | 
|  | - When the filesystem was created, in seconds since the epoch. | 
|  | * - 0x10C | 
|  | - \_\_le32 | 
|  | - s\_jnl\_blocks[17] | 
|  | - Backup copy of the journal inode's ``i_block[]`` array in the first 15 | 
|  | elements and i\_size\_high and i\_size in the 16th and 17th elements, | 
|  | respectively. | 
|  | * - | 
|  | - | 
|  | - | 
|  | - 64bit support is valid only if EXT4_FEATURE_COMPAT_64BIT is set. | 
|  | * - 0x150 | 
|  | - \_\_le32 | 
|  | - s\_blocks\_count\_hi | 
|  | - High 32-bits of the block count. | 
|  | * - 0x154 | 
|  | - \_\_le32 | 
|  | - s\_r\_blocks\_count\_hi | 
|  | - High 32-bits of the reserved block count. | 
|  | * - 0x158 | 
|  | - \_\_le32 | 
|  | - s\_free\_blocks\_count\_hi | 
|  | - High 32-bits of the free block count. | 
|  | * - 0x15C | 
|  | - \_\_le16 | 
|  | - s\_min\_extra\_isize | 
|  | - All inodes have at least # bytes. | 
|  | * - 0x15E | 
|  | - \_\_le16 | 
|  | - s\_want\_extra\_isize | 
|  | - New inodes should reserve # bytes. | 
|  | * - 0x160 | 
|  | - \_\_le32 | 
|  | - s\_flags | 
|  | - Miscellaneous flags. See the super_flags_ table for more info. | 
|  | * - 0x164 | 
|  | - \_\_le16 | 
|  | - s\_raid\_stride | 
|  | - RAID stride. This is the number of logical blocks read from or written | 
|  | to the disk before moving to the next disk. This affects the placement | 
|  | of filesystem metadata, which will hopefully make RAID storage faster. | 
|  | * - 0x166 | 
|  | - \_\_le16 | 
|  | - s\_mmp\_interval | 
|  | - #. seconds to wait in multi-mount prevention (MMP) checking. In theory, | 
|  | MMP is a mechanism to record in the superblock which host and device | 
|  | have mounted the filesystem, in order to prevent multiple mounts. This | 
|  | feature does not seem to be implemented... | 
|  | * - 0x168 | 
|  | - \_\_le64 | 
|  | - s\_mmp\_block | 
|  | - Block # for multi-mount protection data. | 
|  | * - 0x170 | 
|  | - \_\_le32 | 
|  | - s\_raid\_stripe\_width | 
|  | - RAID stripe width. This is the number of logical blocks read from or | 
|  | written to the disk before coming back to the current disk. This is used | 
|  | by the block allocator to try to reduce the number of read-modify-write | 
|  | operations in a RAID5/6. | 
|  | * - 0x174 | 
|  | - \_\_u8 | 
|  | - s\_log\_groups\_per\_flex | 
|  | - Size of a flexible block group is 2 ^ ``s_log_groups_per_flex``. | 
|  | * - 0x175 | 
|  | - \_\_u8 | 
|  | - s\_checksum\_type | 
|  | - Metadata checksum algorithm type. The only valid value is 1 (crc32c). | 
|  | * - 0x176 | 
|  | - \_\_le16 | 
|  | - s\_reserved\_pad | 
|  | - | 
|  | * - 0x178 | 
|  | - \_\_le64 | 
|  | - s\_kbytes\_written | 
|  | - Number of KiB written to this filesystem over its lifetime. | 
|  | * - 0x180 | 
|  | - \_\_le32 | 
|  | - s\_snapshot\_inum | 
|  | - inode number of active snapshot. (Not used in e2fsprogs/Linux.) | 
|  | * - 0x184 | 
|  | - \_\_le32 | 
|  | - s\_snapshot\_id | 
|  | - Sequential ID of active snapshot. (Not used in e2fsprogs/Linux.) | 
|  | * - 0x188 | 
|  | - \_\_le64 | 
|  | - s\_snapshot\_r\_blocks\_count | 
|  | - Number of blocks reserved for active snapshot's future use. (Not used in | 
|  | e2fsprogs/Linux.) | 
|  | * - 0x190 | 
|  | - \_\_le32 | 
|  | - s\_snapshot\_list | 
|  | - inode number of the head of the on-disk snapshot list. (Not used in | 
|  | e2fsprogs/Linux.) | 
|  | * - 0x194 | 
|  | - \_\_le32 | 
|  | - s\_error\_count | 
|  | - Number of errors seen. | 
|  | * - 0x198 | 
|  | - \_\_le32 | 
|  | - s\_first\_error\_time | 
|  | - First time an error happened, in seconds since the epoch. | 
|  | * - 0x19C | 
|  | - \_\_le32 | 
|  | - s\_first\_error\_ino | 
|  | - inode involved in first error. | 
|  | * - 0x1A0 | 
|  | - \_\_le64 | 
|  | - s\_first\_error\_block | 
|  | - Number of block involved of first error. | 
|  | * - 0x1A8 | 
|  | - \_\_u8 | 
|  | - s\_first\_error\_func[32] | 
|  | - Name of function where the error happened. | 
|  | * - 0x1C8 | 
|  | - \_\_le32 | 
|  | - s\_first\_error\_line | 
|  | - Line number where error happened. | 
|  | * - 0x1CC | 
|  | - \_\_le32 | 
|  | - s\_last\_error\_time | 
|  | - Time of most recent error, in seconds since the epoch. | 
|  | * - 0x1D0 | 
|  | - \_\_le32 | 
|  | - s\_last\_error\_ino | 
|  | - inode involved in most recent error. | 
|  | * - 0x1D4 | 
|  | - \_\_le32 | 
|  | - s\_last\_error\_line | 
|  | - Line number where most recent error happened. | 
|  | * - 0x1D8 | 
|  | - \_\_le64 | 
|  | - s\_last\_error\_block | 
|  | - Number of block involved in most recent error. | 
|  | * - 0x1E0 | 
|  | - \_\_u8 | 
|  | - s\_last\_error\_func[32] | 
|  | - Name of function where the most recent error happened. | 
|  | * - 0x200 | 
|  | - \_\_u8 | 
|  | - s\_mount\_opts[64] | 
|  | - ASCIIZ string of mount options. | 
|  | * - 0x240 | 
|  | - \_\_le32 | 
|  | - s\_usr\_quota\_inum | 
|  | - Inode number of user `quota <quota>`__ file. | 
|  | * - 0x244 | 
|  | - \_\_le32 | 
|  | - s\_grp\_quota\_inum | 
|  | - Inode number of group `quota <quota>`__ file. | 
|  | * - 0x248 | 
|  | - \_\_le32 | 
|  | - s\_overhead\_blocks | 
|  | - Overhead blocks/clusters in fs. (Huh? This field is always zero, which | 
|  | means that the kernel calculates it dynamically.) | 
|  | * - 0x24C | 
|  | - \_\_le32 | 
|  | - s\_backup\_bgs[2] | 
|  | - Block groups containing superblock backups (if sparse\_super2) | 
|  | * - 0x254 | 
|  | - \_\_u8 | 
|  | - s\_encrypt\_algos[4] | 
|  | - Encryption algorithms in use. There can be up to four algorithms in use | 
|  | at any time; valid algorithm codes are given in the super_encrypt_ table | 
|  | below. | 
|  | * - 0x258 | 
|  | - \_\_u8 | 
|  | - s\_encrypt\_pw\_salt[16] | 
|  | - Salt for the string2key algorithm for encryption. | 
|  | * - 0x268 | 
|  | - \_\_le32 | 
|  | - s\_lpf\_ino | 
|  | - Inode number of lost+found | 
|  | * - 0x26C | 
|  | - \_\_le32 | 
|  | - s\_prj\_quota\_inum | 
|  | - Inode that tracks project quotas. | 
|  | * - 0x270 | 
|  | - \_\_le32 | 
|  | - s\_checksum\_seed | 
|  | - Checksum seed used for metadata\_csum calculations. This value is | 
|  | crc32c(~0, $orig\_fs\_uuid). | 
|  | * - 0x274 | 
|  | - \_\_u8 | 
|  | - s\_wtime_hi | 
|  | - Upper 8 bits of the s_wtime field. | 
|  | * - 0x275 | 
|  | - \_\_u8 | 
|  | - s\_mtime_hi | 
|  | - Upper 8 bits of the s_mtime field. | 
|  | * - 0x276 | 
|  | - \_\_u8 | 
|  | - s\_mkfs_time_hi | 
|  | - Upper 8 bits of the s_mkfs_time field. | 
|  | * - 0x277 | 
|  | - \_\_u8 | 
|  | - s\_lastcheck_hi | 
|  | - Upper 8 bits of the s_lastcheck_hi field. | 
|  | * - 0x278 | 
|  | - \_\_u8 | 
|  | - s\_first_error_time_hi | 
|  | - Upper 8 bits of the s_first_error_time_hi field. | 
|  | * - 0x279 | 
|  | - \_\_u8 | 
|  | - s\_last_error_time_hi | 
|  | - Upper 8 bits of the s_last_error_time_hi field. | 
|  | * - 0x27A | 
|  | - \_\_u8 | 
|  | - s\_pad[2] | 
|  | - Zero padding. | 
|  | * - 0x27C | 
|  | - \_\_le16 | 
|  | - s\_encoding | 
|  | - Filename charset encoding. | 
|  | * - 0x27E | 
|  | - \_\_le16 | 
|  | - s\_encoding_flags | 
|  | - Filename charset encoding flags. | 
|  | * - 0x280 | 
|  | - \_\_le32 | 
|  | - s\_reserved[95] | 
|  | - Padding to the end of the block. | 
|  | * - 0x3FC | 
|  | - \_\_le32 | 
|  | - s\_checksum | 
|  | - Superblock checksum. | 
|  |  | 
|  | .. _super_state: | 
|  |  | 
|  | The superblock state is some combination of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x0001 | 
|  | - Cleanly umounted | 
|  | * - 0x0002 | 
|  | - Errors detected | 
|  | * - 0x0004 | 
|  | - Orphans being recovered | 
|  |  | 
|  | .. _super_errors: | 
|  |  | 
|  | The superblock error policy is one of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 1 | 
|  | - Continue | 
|  | * - 2 | 
|  | - Remount read-only | 
|  | * - 3 | 
|  | - Panic | 
|  |  | 
|  | .. _super_creator: | 
|  |  | 
|  | The filesystem creator is one of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0 | 
|  | - Linux | 
|  | * - 1 | 
|  | - Hurd | 
|  | * - 2 | 
|  | - Masix | 
|  | * - 3 | 
|  | - FreeBSD | 
|  | * - 4 | 
|  | - Lites | 
|  |  | 
|  | .. _super_revision: | 
|  |  | 
|  | The superblock revision is one of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0 | 
|  | - Original format | 
|  | * - 1 | 
|  | - v2 format w/ dynamic inode sizes | 
|  |  | 
|  | Note that ``EXT4_DYNAMIC_REV`` refers to a revision 1 or newer filesystem. | 
|  |  | 
|  | .. _super_compat: | 
|  |  | 
|  | The superblock compatible features field is a combination of any of the | 
|  | following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 16 64 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x1 | 
|  | - Directory preallocation (COMPAT\_DIR\_PREALLOC). | 
|  | * - 0x2 | 
|  | - “imagic inodes”. Not clear from the code what this does | 
|  | (COMPAT\_IMAGIC\_INODES). | 
|  | * - 0x4 | 
|  | - Has a journal (COMPAT\_HAS\_JOURNAL). | 
|  | * - 0x8 | 
|  | - Supports extended attributes (COMPAT\_EXT\_ATTR). | 
|  | * - 0x10 | 
|  | - Has reserved GDT blocks for filesystem expansion | 
|  | (COMPAT\_RESIZE\_INODE). Requires RO\_COMPAT\_SPARSE\_SUPER. | 
|  | * - 0x20 | 
|  | - Has directory indices (COMPAT\_DIR\_INDEX). | 
|  | * - 0x40 | 
|  | - “Lazy BG”. Not in Linux kernel, seems to have been for uninitialized | 
|  | block groups? (COMPAT\_LAZY\_BG) | 
|  | * - 0x80 | 
|  | - “Exclude inode”. Not used. (COMPAT\_EXCLUDE\_INODE). | 
|  | * - 0x100 | 
|  | - “Exclude bitmap”. Seems to be used to indicate the presence of | 
|  | snapshot-related exclude bitmaps? Not defined in kernel or used in | 
|  | e2fsprogs (COMPAT\_EXCLUDE\_BITMAP). | 
|  | * - 0x200 | 
|  | - Sparse Super Block, v2. If this flag is set, the SB field s\_backup\_bgs | 
|  | points to the two block groups that contain backup superblocks | 
|  | (COMPAT\_SPARSE\_SUPER2). | 
|  |  | 
|  | .. _super_incompat: | 
|  |  | 
|  | The superblock incompatible features field is a combination of any of the | 
|  | following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 16 64 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x1 | 
|  | - Compression (INCOMPAT\_COMPRESSION). | 
|  | * - 0x2 | 
|  | - Directory entries record the file type. See ext4\_dir\_entry\_2 below | 
|  | (INCOMPAT\_FILETYPE). | 
|  | * - 0x4 | 
|  | - Filesystem needs recovery (INCOMPAT\_RECOVER). | 
|  | * - 0x8 | 
|  | - Filesystem has a separate journal device (INCOMPAT\_JOURNAL\_DEV). | 
|  | * - 0x10 | 
|  | - Meta block groups. See the earlier discussion of this feature | 
|  | (INCOMPAT\_META\_BG). | 
|  | * - 0x40 | 
|  | - Files in this filesystem use extents (INCOMPAT\_EXTENTS). | 
|  | * - 0x80 | 
|  | - Enable a filesystem size of 2^64 blocks (INCOMPAT\_64BIT). | 
|  | * - 0x100 | 
|  | - Multiple mount protection (INCOMPAT\_MMP). | 
|  | * - 0x200 | 
|  | - Flexible block groups. See the earlier discussion of this feature | 
|  | (INCOMPAT\_FLEX\_BG). | 
|  | * - 0x400 | 
|  | - Inodes can be used to store large extended attribute values | 
|  | (INCOMPAT\_EA\_INODE). | 
|  | * - 0x1000 | 
|  | - Data in directory entry (INCOMPAT\_DIRDATA). (Not implemented?) | 
|  | * - 0x2000 | 
|  | - Metadata checksum seed is stored in the superblock. This feature enables | 
|  | the administrator to change the UUID of a metadata\_csum filesystem | 
|  | while the filesystem is mounted; without it, the checksum definition | 
|  | requires all metadata blocks to be rewritten (INCOMPAT\_CSUM\_SEED). | 
|  | * - 0x4000 | 
|  | - Large directory >2GB or 3-level htree (INCOMPAT\_LARGEDIR). Prior to | 
|  | this feature, directories could not be larger than 4GiB and could not | 
|  | have an htree more than 2 levels deep. If this feature is enabled, | 
|  | directories can be larger than 4GiB and have a maximum htree depth of 3. | 
|  | * - 0x8000 | 
|  | - Data in inode (INCOMPAT\_INLINE\_DATA). | 
|  | * - 0x10000 | 
|  | - Encrypted inodes are present on the filesystem. (INCOMPAT\_ENCRYPT). | 
|  |  | 
|  | .. _super_rocompat: | 
|  |  | 
|  | The superblock read-only compatible features field is a combination of any of | 
|  | the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 16 64 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x1 | 
|  | - Sparse superblocks. See the earlier discussion of this feature | 
|  | (RO\_COMPAT\_SPARSE\_SUPER). | 
|  | * - 0x2 | 
|  | - This filesystem has been used to store a file greater than 2GiB | 
|  | (RO\_COMPAT\_LARGE\_FILE). | 
|  | * - 0x4 | 
|  | - Not used in kernel or e2fsprogs (RO\_COMPAT\_BTREE\_DIR). | 
|  | * - 0x8 | 
|  | - This filesystem has files whose sizes are represented in units of | 
|  | logical blocks, not 512-byte sectors. This implies a very large file | 
|  | indeed! (RO\_COMPAT\_HUGE\_FILE) | 
|  | * - 0x10 | 
|  | - Group descriptors have checksums. In addition to detecting corruption, | 
|  | this is useful for lazy formatting with uninitialized groups | 
|  | (RO\_COMPAT\_GDT\_CSUM). | 
|  | * - 0x20 | 
|  | - Indicates that the old ext3 32,000 subdirectory limit no longer applies | 
|  | (RO\_COMPAT\_DIR\_NLINK). A directory's i\_links\_count will be set to 1 | 
|  | if it is incremented past 64,999. | 
|  | * - 0x40 | 
|  | - Indicates that large inodes exist on this filesystem | 
|  | (RO\_COMPAT\_EXTRA\_ISIZE). | 
|  | * - 0x80 | 
|  | - This filesystem has a snapshot (RO\_COMPAT\_HAS\_SNAPSHOT). | 
|  | * - 0x100 | 
|  | - `Quota <Quota>`__ (RO\_COMPAT\_QUOTA). | 
|  | * - 0x200 | 
|  | - This filesystem supports “bigalloc”, which means that file extents are | 
|  | tracked in units of clusters (of blocks) instead of blocks | 
|  | (RO\_COMPAT\_BIGALLOC). | 
|  | * - 0x400 | 
|  | - This filesystem supports metadata checksumming. | 
|  | (RO\_COMPAT\_METADATA\_CSUM; implies RO\_COMPAT\_GDT\_CSUM, though | 
|  | GDT\_CSUM must not be set) | 
|  | * - 0x800 | 
|  | - Filesystem supports replicas. This feature is neither in the kernel nor | 
|  | e2fsprogs. (RO\_COMPAT\_REPLICA) | 
|  | * - 0x1000 | 
|  | - Read-only filesystem image; the kernel will not mount this image | 
|  | read-write and most tools will refuse to write to the image. | 
|  | (RO\_COMPAT\_READONLY) | 
|  | * - 0x2000 | 
|  | - Filesystem tracks project quotas. (RO\_COMPAT\_PROJECT) | 
|  | * - 0x8000 | 
|  | - Verity inodes may be present on the filesystem. (RO\_COMPAT\_VERITY) | 
|  |  | 
|  | .. _super_def_hash: | 
|  |  | 
|  | The ``s_def_hash_version`` field is one of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x0 | 
|  | - Legacy. | 
|  | * - 0x1 | 
|  | - Half MD4. | 
|  | * - 0x2 | 
|  | - Tea. | 
|  | * - 0x3 | 
|  | - Legacy, unsigned. | 
|  | * - 0x4 | 
|  | - Half MD4, unsigned. | 
|  | * - 0x5 | 
|  | - Tea, unsigned. | 
|  |  | 
|  | .. _super_mountopts: | 
|  |  | 
|  | The ``s_default_mount_opts`` field is any combination of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x0001 | 
|  | - Print debugging info upon (re)mount. (EXT4\_DEFM\_DEBUG) | 
|  | * - 0x0002 | 
|  | - New files take the gid of the containing directory (instead of the fsgid | 
|  | of the current process). (EXT4\_DEFM\_BSDGROUPS) | 
|  | * - 0x0004 | 
|  | - Support userspace-provided extended attributes. (EXT4\_DEFM\_XATTR\_USER) | 
|  | * - 0x0008 | 
|  | - Support POSIX access control lists (ACLs). (EXT4\_DEFM\_ACL) | 
|  | * - 0x0010 | 
|  | - Do not support 32-bit UIDs. (EXT4\_DEFM\_UID16) | 
|  | * - 0x0020 | 
|  | - All data and metadata are commited to the journal. | 
|  | (EXT4\_DEFM\_JMODE\_DATA) | 
|  | * - 0x0040 | 
|  | - All data are flushed to the disk before metadata are committed to the | 
|  | journal. (EXT4\_DEFM\_JMODE\_ORDERED) | 
|  | * - 0x0060 | 
|  | - Data ordering is not preserved; data may be written after the metadata | 
|  | has been written. (EXT4\_DEFM\_JMODE\_WBACK) | 
|  | * - 0x0100 | 
|  | - Disable write flushes. (EXT4\_DEFM\_NOBARRIER) | 
|  | * - 0x0200 | 
|  | - Track which blocks in a filesystem are metadata and therefore should not | 
|  | be used as data blocks. This option will be enabled by default on 3.18, | 
|  | hopefully. (EXT4\_DEFM\_BLOCK\_VALIDITY) | 
|  | * - 0x0400 | 
|  | - Enable DISCARD support, where the storage device is told about blocks | 
|  | becoming unused. (EXT4\_DEFM\_DISCARD) | 
|  | * - 0x0800 | 
|  | - Disable delayed allocation. (EXT4\_DEFM\_NODELALLOC) | 
|  |  | 
|  | .. _super_flags: | 
|  |  | 
|  | The ``s_flags`` field is any combination of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0x0001 | 
|  | - Signed directory hash in use. | 
|  | * - 0x0002 | 
|  | - Unsigned directory hash in use. | 
|  | * - 0x0004 | 
|  | - To test development code. | 
|  |  | 
|  | .. _super_encrypt: | 
|  |  | 
|  | The ``s_encrypt_algos`` list can contain any of the following: | 
|  |  | 
|  | .. list-table:: | 
|  | :widths: 8 72 | 
|  | :header-rows: 1 | 
|  |  | 
|  | * - Value | 
|  | - Description | 
|  | * - 0 | 
|  | - Invalid algorithm (ENCRYPTION\_MODE\_INVALID). | 
|  | * - 1 | 
|  | - 256-bit AES in XTS mode (ENCRYPTION\_MODE\_AES\_256\_XTS). | 
|  | * - 2 | 
|  | - 256-bit AES in GCM mode (ENCRYPTION\_MODE\_AES\_256\_GCM). | 
|  | * - 3 | 
|  | - 256-bit AES in CBC mode (ENCRYPTION\_MODE\_AES\_256\_CBC). | 
|  |  | 
|  | Total size of the superblock is 1024 bytes. |