2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-28 15:13:55 +08:00

ext4, doc: remove unnecessary escaping

Signed-off-by: Wang Jianjian <wangjianjian3@huawei.com>
Link: https://lore.kernel.org/r/20220520022255.2120576-2-wangjianjian3@huawei.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Wang Jianjian 2022-05-20 10:22:55 +08:00 committed by Theodore Ts'o
parent 48e02e6113
commit 3103084afc
17 changed files with 810 additions and 810 deletions

View File

@ -13,8 +13,8 @@ disappeared as of Linux 3.0.
There are two places where extended attributes can be found. The first There are two places where extended attributes can be found. The first
place is between the end of each inode entry and the beginning of the place is between the end of each inode entry and the beginning of the
next inode entry. For example, if inode.i\_extra\_isize = 28 and next inode entry. For example, if inode.i_extra_isize = 28 and
sb.inode\_size = 256, then there are 256 - (128 + 28) = 100 bytes sb.inode_size = 256, then there are 256 - (128 + 28) = 100 bytes
available for in-inode extended attribute storage. The second place available for in-inode extended attribute storage. The second place
where extended attributes can be found is in the block pointed to by where extended attributes can be found is in the block pointed to by
``inode.i_file_acl``. As of Linux 3.11, it is not possible for this ``inode.i_file_acl``. As of Linux 3.11, it is not possible for this
@ -38,8 +38,8 @@ Extended attributes, when stored after the inode, have a header
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- h\_magic - h_magic
- Magic number for identification, 0xEA020000. This value is set by the - Magic number for identification, 0xEA020000. This value is set by the
Linux driver, though e2fsprogs doesn't seem to check it(?) Linux driver, though e2fsprogs doesn't seem to check it(?)
@ -55,28 +55,28 @@ The beginning of an extended attribute block is in
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- h\_magic - h_magic
- Magic number for identification, 0xEA020000. - Magic number for identification, 0xEA020000.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- h\_refcount - h_refcount
- Reference count. - Reference count.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- h\_blocks - h_blocks
- Number of disk blocks used. - Number of disk blocks used.
* - 0xC * - 0xC
- \_\_le32 - __le32
- h\_hash - h_hash
- Hash value of all attributes. - Hash value of all attributes.
* - 0x10 * - 0x10
- \_\_le32 - __le32
- h\_checksum - h_checksum
- Checksum of the extended attribute block. - Checksum of the extended attribute block.
* - 0x14 * - 0x14
- \_\_u32 - __u32
- h\_reserved[3] - h_reserved[3]
- Zero. - Zero.
The checksum is calculated against the FS UUID, the 64-bit block number The checksum is calculated against the FS UUID, the 64-bit block number
@ -100,46 +100,46 @@ Attributes stored inside an inode do not need be stored in sorted order.
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_u8 - __u8
- e\_name\_len - e_name_len
- Length of name. - Length of name.
* - 0x1 * - 0x1
- \_\_u8 - __u8
- e\_name\_index - e_name_index
- Attribute name index. There is a discussion of this below. - Attribute name index. There is a discussion of this below.
* - 0x2 * - 0x2
- \_\_le16 - __le16
- e\_value\_offs - e_value_offs
- Location of this attribute's value on the disk block where it is stored. - Location of this attribute's value on the disk block where it is stored.
Multiple attributes can share the same value. For an inode attribute Multiple attributes can share the same value. For an inode attribute
this value is relative to the start of the first entry; for a block this this value is relative to the start of the first entry; for a block this
value is relative to the start of the block (i.e. the header). value is relative to the start of the block (i.e. the header).
* - 0x4 * - 0x4
- \_\_le32 - __le32
- e\_value\_inum - e_value_inum
- The inode where the value is stored. Zero indicates the value is in the - The inode where the value is stored. Zero indicates the value is in the
same block as this entry. This field is only used if the same block as this entry. This field is only used if the
INCOMPAT\_EA\_INODE feature is enabled. INCOMPAT_EA_INODE feature is enabled.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- e\_value\_size - e_value_size
- Length of attribute value. - Length of attribute value.
* - 0xC * - 0xC
- \_\_le32 - __le32
- e\_hash - e_hash
- Hash value of attribute name and attribute value. The kernel doesn't - Hash value of attribute name and attribute value. The kernel doesn't
update the hash for in-inode attributes, so for that case this value update the hash for in-inode attributes, so for that case this value
must be zero, because e2fsck validates any non-zero hash regardless of must be zero, because e2fsck validates any non-zero hash regardless of
where the xattr lives. where the xattr lives.
* - 0x10 * - 0x10
- char - char
- e\_name[e\_name\_len] - e_name[e_name_len]
- Attribute name. Does not include trailing NULL. - Attribute name. Does not include trailing NULL.
Attribute values can follow the end of the entry table. There appears to Attribute values can follow the end of the entry table. There appears to
be a requirement that they be aligned to 4-byte boundaries. The values be a requirement that they be aligned to 4-byte boundaries. The values
are stored starting at the end of the block and grow towards the are stored starting at the end of the block and grow towards the
xattr\_header/xattr\_entry table. When the two collide, the overflow is xattr_header/xattr_entry table. When the two collide, the overflow is
put into a separate disk block. If the disk block fills up, the put into a separate disk block. If the disk block fills up, the
filesystem returns -ENOSPC. filesystem returns -ENOSPC.
@ -167,15 +167,15 @@ the key name. Here is a map of name index values to key prefixes:
* - 1 * - 1
- “user.” - “user.”
* - 2 * - 2
- “system.posix\_acl\_access” - “system.posix_acl_access”
* - 3 * - 3
- “system.posix\_acl\_default” - “system.posix_acl_default”
* - 4 * - 4
- “trusted.” - “trusted.”
* - 6 * - 6
- “security.” - “security.”
* - 7 * - 7
- “system.” (inline\_data only?) - “system.” (inline_data only?)
* - 8 * - 8
- “system.richacl” (SuSE kernels only?) - “system.richacl” (SuSE kernels only?)

View File

@ -23,7 +23,7 @@ means that a block group addresses 32 gigabytes instead of 128 megabytes,
also shrinking the amount of file system overhead for metadata. also shrinking the amount of file system overhead for metadata.
The administrator can set a block cluster size at mkfs time (which is The administrator can set a block cluster size at mkfs time (which is
stored in the s\_log\_cluster\_size field in the superblock); from then stored in the s_log_cluster_size field in the superblock); from then
on, the block bitmaps track clusters, not individual blocks. This means on, the block bitmaps track clusters, not individual blocks. This means
that block groups can be several gigabytes in size (instead of just that block groups can be several gigabytes in size (instead of just
128MiB); however, the minimum allocation unit becomes a cluster, not a 128MiB); however, the minimum allocation unit becomes a cluster, not a

View File

@ -9,15 +9,15 @@ group.
The inode bitmap records which entries in the inode table are in use. The inode bitmap records which entries in the inode table are in use.
As with most bitmaps, one bit represents the usage status of one data As with most bitmaps, one bit represents the usage status of one data
block or inode table entry. This implies a block group size of 8 \* block or inode table entry. This implies a block group size of 8 *
number\_of\_bytes\_in\_a\_logical\_block. number_of_bytes_in_a_logical_block.
NOTE: If ``BLOCK_UNINIT`` is set for a given block group, various parts NOTE: If ``BLOCK_UNINIT`` is set for a given block group, various parts
of the kernel and e2fsprogs code pretends that the block bitmap contains of the kernel and e2fsprogs code pretends that the block bitmap contains
zeros (i.e. all blocks in the group are free). However, it is not zeros (i.e. all blocks in the group are free). However, it is not
necessarily the case that no blocks are in use -- if ``meta_bg`` is set, necessarily the case that no blocks are in use -- if ``meta_bg`` is set,
the bitmaps and group descriptor live inside the group. Unfortunately, the bitmaps and group descriptor live inside the group. Unfortunately,
ext2fs\_test\_block\_bitmap2() will return '0' for those locations, ext2fs_test_block_bitmap2() will return '0' for those locations,
which produces confusing debugfs output. which produces confusing debugfs output.
Inode Table Inode Table

View File

@ -56,39 +56,39 @@ established that the super block and the group descriptor table, if
present, will be at the beginning of the block group. The bitmaps and present, will be at the beginning of the block group. The bitmaps and
the inode table can be anywhere, and it is quite possible for the the inode table can be anywhere, and it is quite possible for the
bitmaps to come after the inode table, or for both to be in different bitmaps to come after the inode table, or for both to be in different
groups (flex\_bg). Leftover space is used for file data blocks, indirect groups (flex_bg). Leftover space is used for file data blocks, indirect
block maps, extent tree blocks, and extended attributes. block maps, extent tree blocks, and extended attributes.
Flexible Block Groups Flexible Block Groups
--------------------- ---------------------
Starting in ext4, there is a new feature called flexible block groups Starting in ext4, there is a new feature called flexible block groups
(flex\_bg). In a flex\_bg, several block groups are tied together as one (flex_bg). In a flex_bg, several block groups are tied together as one
logical block group; the bitmap spaces and the inode table space in the logical block group; the bitmap spaces and the inode table space in the
first block group of the flex\_bg are expanded to include the bitmaps first block group of the flex_bg are expanded to include the bitmaps
and inode tables of all other block groups in the flex\_bg. For example, and inode tables of all other block groups in the flex_bg. For example,
if the flex\_bg size is 4, then group 0 will contain (in order) the if the flex_bg size is 4, then group 0 will contain (in order) the
superblock, group descriptors, data block bitmaps for groups 0-3, inode superblock, group descriptors, data block bitmaps for groups 0-3, inode
bitmaps for groups 0-3, inode tables for groups 0-3, and the remaining bitmaps for groups 0-3, inode tables for groups 0-3, and the remaining
space in group 0 is for file data. The effect of this is to group the space in group 0 is for file data. The effect of this is to group the
block group metadata close together for faster loading, and to enable block group metadata close together for faster loading, and to enable
large files to be continuous on disk. Backup copies of the superblock large files to be continuous on disk. Backup copies of the superblock
and group descriptors are always at the beginning of block groups, even and group descriptors are always at the beginning of block groups, even
if flex\_bg is enabled. The number of block groups that make up a if flex_bg is enabled. The number of block groups that make up a
flex\_bg is given by 2 ^ ``sb.s_log_groups_per_flex``. flex_bg is given by 2 ^ ``sb.s_log_groups_per_flex``.
Meta Block Groups Meta Block Groups
----------------- -----------------
Without the option META\_BG, for safety concerns, all block group Without the option META_BG, for safety concerns, all block group
descriptors copies are kept in the first block group. Given the default descriptors copies are kept in the first block group. Given the default
128MiB(2^27 bytes) block group size and 64-byte group descriptors, ext4 128MiB(2^27 bytes) block group size and 64-byte group descriptors, ext4
can have at most 2^27/64 = 2^21 block groups. This limits the entire can have at most 2^27/64 = 2^21 block groups. This limits the entire
filesystem size to 2^21 * 2^27 = 2^48bytes or 256TiB. filesystem size to 2^21 * 2^27 = 2^48bytes or 256TiB.
The solution to this problem is to use the metablock group feature The solution to this problem is to use the metablock group feature
(META\_BG), which is already in ext3 for all 2.6 releases. With the (META_BG), which is already in ext3 for all 2.6 releases. With the
META\_BG feature, ext4 filesystems are partitioned into many metablock META_BG feature, ext4 filesystems are partitioned into many metablock
groups. Each metablock group is a cluster of block groups whose group groups. Each metablock group is a cluster of block groups whose group
descriptor structures can be stored in a single disk block. For ext4 descriptor structures can be stored in a single disk block. For ext4
filesystems with 4 KB block size, a single metablock group partition filesystems with 4 KB block size, a single metablock group partition
@ -110,7 +110,7 @@ bytes, a meta-block group contains 32 block groups for filesystems with
a 1KB block size, and 128 block groups for filesystems with a 4KB a 1KB block size, and 128 block groups for filesystems with a 4KB
blocksize. Filesystems can either be created using this new block group blocksize. Filesystems can either be created using this new block group
descriptor layout, or existing filesystems can be resized on-line, and descriptor layout, or existing filesystems can be resized on-line, and
the field s\_first\_meta\_bg in the superblock will indicate the first the field s_first_meta_bg in the superblock will indicate the first
block group using this new layout. block group using this new layout.
Please see an important note about ``BLOCK_UNINIT`` in the section about Please see an important note about ``BLOCK_UNINIT`` in the section about
@ -121,15 +121,15 @@ Lazy Block Group Initialization
A new feature for ext4 are three block group descriptor flags that A new feature for ext4 are three block group descriptor flags that
enable mkfs to skip initializing other parts of the block group enable mkfs to skip initializing other parts of the block group
metadata. Specifically, the INODE\_UNINIT and BLOCK\_UNINIT flags mean metadata. Specifically, the INODE_UNINIT and BLOCK_UNINIT flags mean
that the inode and block bitmaps for that group can be calculated and that the inode and block bitmaps for that group can be calculated and
therefore the on-disk bitmap blocks are not initialized. This is therefore the on-disk bitmap blocks are not initialized. This is
generally the case for an empty block group or a block group containing generally the case for an empty block group or a block group containing
only fixed-location block group metadata. The INODE\_ZEROED flag means only fixed-location block group metadata. The INODE_ZEROED flag means
that the inode table has been initialized; mkfs will unset this flag and that the inode table has been initialized; mkfs will unset this flag and
rely on the kernel to initialize the inode tables in the background. rely on the kernel to initialize the inode tables in the background.
By not writing zeroes to the bitmaps and inode table, mkfs time is By not writing zeroes to the bitmaps and inode table, mkfs time is
reduced considerably. Note the feature flag is RO\_COMPAT\_GDT\_CSUM, reduced considerably. Note the feature flag is RO_COMPAT_GDT_CSUM,
but the dumpe2fs output prints this as “uninit\_bg”. They are the same but the dumpe2fs output prints this as “uninit_bg”. They are the same
thing. thing.

View File

@ -1,7 +1,7 @@
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| i.i\_block Offset | Where It Points | | i.i_block Offset | Where It Points |
+=====================+==============================================================================================================================================================================================================================+ +=====================+==============================================================================================================================================================================================================================+
| 0 to 11 | Direct map to file blocks 0 to 11. | | 0 to 11 | Direct map to file blocks 0 to 11. |
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

View File

@ -4,7 +4,7 @@ Checksums
--------- ---------
Starting in early 2012, metadata checksums were added to all major ext4 Starting in early 2012, metadata checksums were added to all major ext4
and jbd2 data structures. The associated feature flag is metadata\_csum. and jbd2 data structures. The associated feature flag is metadata_csum.
The desired checksum algorithm is indicated in the superblock, though as The desired checksum algorithm is indicated in the superblock, though as
of October 2012 the only supported algorithm is crc32c. Some data of October 2012 the only supported algorithm is crc32c. Some data
structures did not have space to fit a full 32-bit checksum, so only the structures did not have space to fit a full 32-bit checksum, so only the
@ -20,7 +20,7 @@ encounters directory blocks that lack sufficient empty space to add a
checksum, it will request that you run ``e2fsck -D`` to have the checksum, it will request that you run ``e2fsck -D`` to have the
directories rebuilt with checksums. This has the added benefit of directories rebuilt with checksums. This has the added benefit of
removing slack space from the directory files and rebalancing the htree removing slack space from the directory files and rebalancing the htree
indexes. If you \_ignore\_ this step, your directories will not be indexes. If you _ignore_ this step, your directories will not be
protected by a checksum! protected by a checksum!
The following table describes the data elements that go into each type The following table describes the data elements that go into each type
@ -35,39 +35,39 @@ of checksum. The checksum function is whatever the superblock describes
- Length - Length
- Ingredients - Ingredients
* - Superblock * - Superblock
- \_\_le32 - __le32
- The entire superblock up to the checksum field. The UUID lives inside - The entire superblock up to the checksum field. The UUID lives inside
the superblock. the superblock.
* - MMP * - MMP
- \_\_le32 - __le32
- UUID + the entire MMP block up to the checksum field. - UUID + the entire MMP block up to the checksum field.
* - Extended Attributes * - Extended Attributes
- \_\_le32 - __le32
- UUID + the entire extended attribute block. The checksum field is set to - UUID + the entire extended attribute block. The checksum field is set to
zero. zero.
* - Directory Entries * - Directory Entries
- \_\_le32 - __le32
- UUID + inode number + inode generation + the directory block up to the - UUID + inode number + inode generation + the directory block up to the
fake entry enclosing the checksum field. fake entry enclosing the checksum field.
* - HTREE Nodes * - HTREE Nodes
- \_\_le32 - __le32
- UUID + inode number + inode generation + all valid extents + HTREE tail. - UUID + inode number + inode generation + all valid extents + HTREE tail.
The checksum field is set to zero. The checksum field is set to zero.
* - Extents * - Extents
- \_\_le32 - __le32
- UUID + inode number + inode generation + the entire extent block up to - UUID + inode number + inode generation + the entire extent block up to
the checksum field. the checksum field.
* - Bitmaps * - Bitmaps
- \_\_le32 or \_\_le16 - __le32 or __le16
- UUID + the entire bitmap. Checksums are stored in the group descriptor, - UUID + the entire bitmap. Checksums are stored in the group descriptor,
and truncated if the group descriptor size is 32 bytes (i.e. ^64bit) and truncated if the group descriptor size is 32 bytes (i.e. ^64bit)
* - Inodes * - Inodes
- \_\_le32 - __le32
- UUID + inode number + inode generation + the entire inode. The checksum - UUID + inode number + inode generation + the entire inode. The checksum
field is set to zero. Each inode has its own checksum. field is set to zero. Each inode has its own checksum.
* - Group Descriptors * - Group Descriptors
- \_\_le16 - __le16
- If metadata\_csum, then UUID + group number + the entire descriptor; - If metadata_csum, then UUID + group number + the entire descriptor;
else if gdt\_csum, then crc16(UUID + group number + the entire else if gdt_csum, then crc16(UUID + group number + the entire
descriptor). In all cases, only the lower 16 bits are stored. descriptor). In all cases, only the lower 16 bits are stored.

View File

@ -42,24 +42,24 @@ is at most 263 bytes long, though on disk you'll need to reference
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- inode - inode
- Number of the inode that this directory entry points to. - Number of the inode that this directory entry points to.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- rec\_len - rec_len
- Length of this directory entry. Must be a multiple of 4. - Length of this directory entry. Must be a multiple of 4.
* - 0x6 * - 0x6
- \_\_le16 - __le16
- name\_len - name_len
- Length of the file name. - Length of the file name.
* - 0x8 * - 0x8
- char - char
- name[EXT4\_NAME\_LEN] - name[EXT4_NAME_LEN]
- File name. - File name.
Since file names cannot be longer than 255 bytes, the new directory Since file names cannot be longer than 255 bytes, the new directory
entry format shortens the name\_len field and uses the space for a file entry format shortens the name_len field and uses the space for a file
type flag, probably to avoid having to load every inode during directory type flag, probably to avoid having to load every inode during directory
tree traversal. This format is ``ext4_dir_entry_2``, which is at most tree traversal. This format is ``ext4_dir_entry_2``, which is at most
263 bytes long, though on disk you'll need to reference 263 bytes long, though on disk you'll need to reference
@ -74,24 +74,24 @@ tree traversal. This format is ``ext4_dir_entry_2``, which is at most
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- inode - inode
- Number of the inode that this directory entry points to. - Number of the inode that this directory entry points to.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- rec\_len - rec_len
- Length of this directory entry. - Length of this directory entry.
* - 0x6 * - 0x6
- \_\_u8 - __u8
- name\_len - name_len
- Length of the file name. - Length of the file name.
* - 0x7 * - 0x7
- \_\_u8 - __u8
- file\_type - file_type
- File type code, see ftype_ table below. - File type code, see ftype_ table below.
* - 0x8 * - 0x8
- char - char
- name[EXT4\_NAME\_LEN] - name[EXT4_NAME_LEN]
- File name. - File name.
.. _ftype: .. _ftype:
@ -137,19 +137,19 @@ entry uses this extension, it may be up to 271 bytes.
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- hash - hash
- The hash of the directory name - The hash of the directory name
* - 0x4 * - 0x4
- \_\_le32 - __le32
- minor\_hash - minor_hash
- The minor hash of the directory name - The minor hash of the directory name
In order to add checksums to these classic directory blocks, a phony In order to add checksums to these classic directory blocks, a phony
``struct ext4_dir_entry`` is placed at the end of each leaf block to ``struct ext4_dir_entry`` is placed at the end of each leaf block to
hold the checksum. The directory entry is 12 bytes long. The inode hold the checksum. The directory entry is 12 bytes long. The inode
number and name\_len fields are set to zero to fool old software into number and name_len fields are set to zero to fool old software into
ignoring an apparently empty directory entry, and the checksum is stored ignoring an apparently empty directory entry, and the checksum is stored
in the place where the name normally goes. The structure is in the place where the name normally goes. The structure is
``struct ext4_dir_entry_tail``: ``struct ext4_dir_entry_tail``:
@ -163,24 +163,24 @@ in the place where the name normally goes. The structure is
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- det\_reserved\_zero1 - det_reserved_zero1
- Inode number, which must be zero. - Inode number, which must be zero.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- det\_rec\_len - det_rec_len
- Length of this directory entry, which must be 12. - Length of this directory entry, which must be 12.
* - 0x6 * - 0x6
- \_\_u8 - __u8
- det\_reserved\_zero2 - det_reserved_zero2
- Length of the file name, which must be zero. - Length of the file name, which must be zero.
* - 0x7 * - 0x7
- \_\_u8 - __u8
- det\_reserved\_ft - det_reserved_ft
- File type, which must be 0xDE. - File type, which must be 0xDE.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- det\_checksum - det_checksum
- Directory leaf block checksum. - Directory leaf block checksum.
The leaf directory block checksum is calculated against the FS UUID, the The leaf directory block checksum is calculated against the FS UUID, the
@ -194,7 +194,7 @@ Hash Tree Directories
A linear array of directory entries isn't great for performance, so a A linear array of directory entries isn't great for performance, so a
new feature was added to ext3 to provide a faster (but peculiar) new feature was added to ext3 to provide a faster (but peculiar)
balanced tree keyed off a hash of the directory entry name. If the balanced tree keyed off a hash of the directory entry name. If the
EXT4\_INDEX\_FL (0x1000) flag is set in the inode, this directory uses a EXT4_INDEX_FL (0x1000) flag is set in the inode, this directory uses a
hashed btree (htree) to organize and find directory entries. For hashed btree (htree) to organize and find directory entries. For
backwards read-only compatibility with ext2, this tree is actually backwards read-only compatibility with ext2, this tree is actually
hidden inside the directory file, masquerading as “empty” directory data hidden inside the directory file, masquerading as “empty” directory data
@ -206,14 +206,14 @@ rest of the directory block is empty so that it moves on.
The root of the tree always lives in the first data block of the The root of the tree always lives in the first data block of the
directory. By ext2 custom, the '.' and '..' entries must appear at the directory. By ext2 custom, the '.' and '..' entries must appear at the
beginning of this first block, so they are put here as two beginning of this first block, so they are put here as two
``struct ext4_dir_entry_2``\ s and not stored in the tree. The rest of ``struct ext4_dir_entry_2`` s and not stored in the tree. The rest of
the root node contains metadata about the tree and finally a hash->block the root node contains metadata about the tree and finally a hash->block
map to find nodes that are lower in the htree. If map to find nodes that are lower in the htree. If
``dx_root.info.indirect_levels`` is non-zero then the htree has two ``dx_root.info.indirect_levels`` is non-zero then the htree has two
levels; the data block pointed to by the root node's map is an interior levels; the data block pointed to by the root node's map is an interior
node, which is indexed by a minor hash. Interior nodes in this tree node, which is indexed by a minor hash. Interior nodes in this tree
contains a zeroed out ``struct ext4_dir_entry_2`` followed by a contains a zeroed out ``struct ext4_dir_entry_2`` followed by a
minor\_hash->block map to find leafe nodes. Leaf nodes contain a linear minor_hash->block map to find leafe nodes. Leaf nodes contain a linear
array of all ``struct ext4_dir_entry_2``; all of these entries array of all ``struct ext4_dir_entry_2``; all of these entries
(presumably) hash to the same value. If there is an overflow, the (presumably) hash to the same value. If there is an overflow, the
entries simply overflow into the next leaf node, and the entries simply overflow into the next leaf node, and the
@ -245,83 +245,83 @@ of a data block:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- dot.inode - dot.inode
- inode number of this directory. - inode number of this directory.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- dot.rec\_len - dot.rec_len
- Length of this record, 12. - Length of this record, 12.
* - 0x6 * - 0x6
- u8 - u8
- dot.name\_len - dot.name_len
- Length of the name, 1. - Length of the name, 1.
* - 0x7 * - 0x7
- u8 - u8
- dot.file\_type - dot.file_type
- File type of this entry, 0x2 (directory) (if the feature flag is set). - File type of this entry, 0x2 (directory) (if the feature flag is set).
* - 0x8 * - 0x8
- char - char
- dot.name[4] - dot.name[4]
- “.\\0\\0\\0” - “.\0\0\0”
* - 0xC * - 0xC
- \_\_le32 - __le32
- dotdot.inode - dotdot.inode
- inode number of parent directory. - inode number of parent directory.
* - 0x10 * - 0x10
- \_\_le16 - __le16
- dotdot.rec\_len - dotdot.rec_len
- block\_size - 12. The record length is long enough to cover all htree - block_size - 12. The record length is long enough to cover all htree
data. data.
* - 0x12 * - 0x12
- u8 - u8
- dotdot.name\_len - dotdot.name_len
- Length of the name, 2. - Length of the name, 2.
* - 0x13 * - 0x13
- u8 - u8
- dotdot.file\_type - dotdot.file_type
- File type of this entry, 0x2 (directory) (if the feature flag is set). - File type of this entry, 0x2 (directory) (if the feature flag is set).
* - 0x14 * - 0x14
- char - char
- dotdot\_name[4] - dotdot_name[4]
- “..\\0\\0” - “..\0\0”
* - 0x18 * - 0x18
- \_\_le32 - __le32
- struct dx\_root\_info.reserved\_zero - struct dx_root_info.reserved_zero
- Zero. - Zero.
* - 0x1C * - 0x1C
- u8 - u8
- struct dx\_root\_info.hash\_version - struct dx_root_info.hash_version
- Hash type, see dirhash_ table below. - Hash type, see dirhash_ table below.
* - 0x1D * - 0x1D
- u8 - u8
- struct dx\_root\_info.info\_length - struct dx_root_info.info_length
- Length of the tree information, 0x8. - Length of the tree information, 0x8.
* - 0x1E * - 0x1E
- u8 - u8
- struct dx\_root\_info.indirect\_levels - struct dx_root_info.indirect_levels
- Depth of the htree. Cannot be larger than 3 if the INCOMPAT\_LARGEDIR - Depth of the htree. Cannot be larger than 3 if the INCOMPAT_LARGEDIR
feature is set; cannot be larger than 2 otherwise. feature is set; cannot be larger than 2 otherwise.
* - 0x1F * - 0x1F
- u8 - u8
- struct dx\_root\_info.unused\_flags - struct dx_root_info.unused_flags
- -
* - 0x20 * - 0x20
- \_\_le16 - __le16
- limit - limit
- Maximum number of dx\_entries that can follow this header, plus 1 for - Maximum number of dx_entries that can follow this header, plus 1 for
the header itself. the header itself.
* - 0x22 * - 0x22
- \_\_le16 - __le16
- count - count
- Actual number of dx\_entries that follow this header, plus 1 for the - Actual number of dx_entries that follow this header, plus 1 for the
header itself. header itself.
* - 0x24 * - 0x24
- \_\_le32 - __le32
- block - block
- The block number (within the directory file) that goes with hash=0. - The block number (within the directory file) that goes with hash=0.
* - 0x28 * - 0x28
- struct dx\_entry - struct dx_entry
- entries[0] - entries[0]
- As many 8-byte ``struct dx_entry`` as fits in the rest of the data block. - As many 8-byte ``struct dx_entry`` as fits in the rest of the data block.
@ -362,38 +362,38 @@ also the full length of a data block:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- fake.inode - fake.inode
- Zero, to make it look like this entry is not in use. - Zero, to make it look like this entry is not in use.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- fake.rec\_len - fake.rec_len
- The size of the block, in order to hide all of the dx\_node data. - The size of the block, in order to hide all of the dx_node data.
* - 0x6 * - 0x6
- u8 - u8
- name\_len - name_len
- Zero. There is no name for this “unused” directory entry. - Zero. There is no name for this “unused” directory entry.
* - 0x7 * - 0x7
- u8 - u8
- file\_type - file_type
- Zero. There is no file type for this “unused” directory entry. - Zero. There is no file type for this “unused” directory entry.
* - 0x8 * - 0x8
- \_\_le16 - __le16
- limit - limit
- Maximum number of dx\_entries that can follow this header, plus 1 for - Maximum number of dx_entries that can follow this header, plus 1 for
the header itself. the header itself.
* - 0xA * - 0xA
- \_\_le16 - __le16
- count - count
- Actual number of dx\_entries that follow this header, plus 1 for the - Actual number of dx_entries that follow this header, plus 1 for the
header itself. header itself.
* - 0xE * - 0xE
- \_\_le32 - __le32
- block - block
- The block number (within the directory file) that goes with the lowest - The block number (within the directory file) that goes with the lowest
hash value of this block. This value is stored in the parent block. hash value of this block. This value is stored in the parent block.
* - 0x12 * - 0x12
- struct dx\_entry - struct dx_entry
- entries[0] - entries[0]
- As many 8-byte ``struct dx_entry`` as fits in the rest of the data block. - As many 8-byte ``struct dx_entry`` as fits in the rest of the data block.
@ -410,11 +410,11 @@ long:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- hash - hash
- Hash code. - Hash code.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- block - block
- Block number (within the directory file, not filesystem blocks) of the - Block number (within the directory file, not filesystem blocks) of the
next node in the htree. next node in the htree.
@ -423,13 +423,13 @@ long:
author.) author.)
If metadata checksums are enabled, the last 8 bytes of the directory If metadata checksums are enabled, the last 8 bytes of the directory
block (precisely the length of one dx\_entry) are used to store a block (precisely the length of one dx_entry) are used to store a
``struct dx_tail``, which contains the checksum. The ``limit`` and ``struct dx_tail``, which contains the checksum. The ``limit`` and
``count`` entries in the dx\_root/dx\_node structures are adjusted as ``count`` entries in the dx_root/dx_node structures are adjusted as
necessary to fit the dx\_tail into the block. If there is no space for necessary to fit the dx_tail into the block. If there is no space for
the dx\_tail, the user is notified to run e2fsck -D to rebuild the the dx_tail, the user is notified to run e2fsck -D to rebuild the
directory index (which will ensure that there's space for the checksum. directory index (which will ensure that there's space for the checksum.
The dx\_tail structure is 8 bytes long and looks like this: The dx_tail structure is 8 bytes long and looks like this:
.. list-table:: .. list-table::
:widths: 8 8 24 40 :widths: 8 8 24 40
@ -441,13 +441,13 @@ The dx\_tail structure is 8 bytes long and looks like this:
- Description - Description
* - 0x0 * - 0x0
- u32 - u32
- dt\_reserved - dt_reserved
- Zero. - Zero.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- dt\_checksum - dt_checksum
- Checksum of the htree directory block. - Checksum of the htree directory block.
The checksum is calculated against the FS UUID, the htree index header The checksum is calculated against the FS UUID, the htree index header
(dx\_root or dx\_node), all of the htree indices (dx\_entry) that are in (dx_root or dx_node), all of the htree indices (dx_entry) that are in
use, and the tail block (dx\_tail). use, and the tail block (dx_tail).

View File

@ -5,14 +5,14 @@ Large Extended Attribute Values
To enable ext4 to store extended attribute values that do not fit in the To enable ext4 to store extended attribute values that do not fit in the
inode or in the single extended attribute block attached to an inode, inode or in the single extended attribute block attached to an inode,
the EA\_INODE feature allows us to store the value in the data blocks of the EA_INODE feature allows us to store the value in the data blocks of
a regular file inode. This “EA inode” is linked only from the extended a regular file inode. This “EA inode” is linked only from the extended
attribute name index and must not appear in a directory entry. The attribute name index and must not appear in a directory entry. The
inode's i\_atime field is used to store a checksum of the xattr value; inode's i_atime field is used to store a checksum of the xattr value;
and i\_ctime/i\_version store a 64-bit reference count, which enables and i_ctime/i_version store a 64-bit reference count, which enables
sharing of large xattr values between multiple owning inodes. For sharing of large xattr values between multiple owning inodes. For
backward compatibility with older versions of this feature, the backward compatibility with older versions of this feature, the
i\_mtime/i\_generation *may* store a back-reference to the inode number i_mtime/i_generation *may* store a back-reference to the inode number
and i\_generation of the **one** owning inode (in cases where the EA and i_generation of the **one** owning inode (in cases where the EA
inode is not referenced by multiple inodes) to verify that the EA inode inode is not referenced by multiple inodes) to verify that the EA inode
is the correct one being accessed. is the correct one being accessed.

View File

@ -7,34 +7,34 @@ Each block group on the filesystem has one of these descriptors
associated with it. As noted in the Layout section above, the group associated with it. As noted in the Layout section above, the group
descriptors (if present) are the second item in the block group. The descriptors (if present) are the second item in the block group. The
standard configuration is for each block group to contain a full copy of standard configuration is for each block group to contain a full copy of
the block group descriptor table unless the sparse\_super feature flag the block group descriptor table unless the sparse_super feature flag
is set. is set.
Notice how the group descriptor records the location of both bitmaps and Notice how the group descriptor records the location of both bitmaps and
the inode table (i.e. they can float). This means that within a block the inode table (i.e. they can float). This means that within a block
group, the only data structures with fixed locations are the superblock group, the only data structures with fixed locations are the superblock
and the group descriptor table. The flex\_bg mechanism uses this and the group descriptor table. The flex_bg mechanism uses this
property to group several block groups into a flex group and lay out all property to group several block groups into a flex group and lay out all
of the groups' bitmaps and inode tables into one long run in the first of the groups' bitmaps and inode tables into one long run in the first
group of the flex group. group of the flex group.
If the meta\_bg feature flag is set, then several block groups are If the meta_bg feature flag is set, then several block groups are
grouped together into a meta group. Note that in the meta\_bg case, grouped together into a meta group. Note that in the meta_bg case,
however, the first and last two block groups within the larger meta however, the first and last two block groups within the larger meta
group contain only group descriptors for the groups inside the meta group contain only group descriptors for the groups inside the meta
group. group.
flex\_bg and meta\_bg do not appear to be mutually exclusive features. flex_bg and meta_bg do not appear to be mutually exclusive features.
In ext2, ext3, and ext4 (when the 64bit feature is not enabled), the In ext2, ext3, and ext4 (when the 64bit feature is not enabled), the
block group descriptor was only 32 bytes long and therefore ends at block group descriptor was only 32 bytes long and therefore ends at
bg\_checksum. On an ext4 filesystem with the 64bit feature enabled, the bg_checksum. On an ext4 filesystem with the 64bit feature enabled, the
block group descriptor expands to at least the 64 bytes described below; block group descriptor expands to at least the 64 bytes described below;
the size is stored in the superblock. the size is stored in the superblock.
If gdt\_csum is set and metadata\_csum is not set, the block group If gdt_csum is set and metadata_csum is not set, the block group
checksum is the crc16 of the FS UUID, the group number, and the group checksum is the crc16 of the FS UUID, the group number, and the group
descriptor structure. If metadata\_csum is set, then the block group descriptor structure. If metadata_csum is set, then the block group
checksum is the lower 16 bits of the checksum of the FS UUID, the group checksum is the lower 16 bits of the checksum of the FS UUID, the group
number, and the group descriptor structure. Both block and inode bitmap number, and the group descriptor structure. Both block and inode bitmap
checksums are calculated against the FS UUID, the group number, and the checksums are calculated against the FS UUID, the group number, and the
@ -51,59 +51,59 @@ The block group descriptor is laid out in ``struct ext4_group_desc``.
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- bg\_block\_bitmap\_lo - bg_block_bitmap_lo
- Lower 32-bits of location of block bitmap. - Lower 32-bits of location of block bitmap.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- bg\_inode\_bitmap\_lo - bg_inode_bitmap_lo
- Lower 32-bits of location of inode bitmap. - Lower 32-bits of location of inode bitmap.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- bg\_inode\_table\_lo - bg_inode_table_lo
- Lower 32-bits of location of inode table. - Lower 32-bits of location of inode table.
* - 0xC * - 0xC
- \_\_le16 - __le16
- bg\_free\_blocks\_count\_lo - bg_free_blocks_count_lo
- Lower 16-bits of free block count. - Lower 16-bits of free block count.
* - 0xE * - 0xE
- \_\_le16 - __le16
- bg\_free\_inodes\_count\_lo - bg_free_inodes_count_lo
- Lower 16-bits of free inode count. - Lower 16-bits of free inode count.
* - 0x10 * - 0x10
- \_\_le16 - __le16
- bg\_used\_dirs\_count\_lo - bg_used_dirs_count_lo
- Lower 16-bits of directory count. - Lower 16-bits of directory count.
* - 0x12 * - 0x12
- \_\_le16 - __le16
- bg\_flags - bg_flags
- Block group flags. See the bgflags_ table below. - Block group flags. See the bgflags_ table below.
* - 0x14 * - 0x14
- \_\_le32 - __le32
- bg\_exclude\_bitmap\_lo - bg_exclude_bitmap_lo
- Lower 32-bits of location of snapshot exclusion bitmap. - Lower 32-bits of location of snapshot exclusion bitmap.
* - 0x18 * - 0x18
- \_\_le16 - __le16
- bg\_block\_bitmap\_csum\_lo - bg_block_bitmap_csum_lo
- Lower 16-bits of the block bitmap checksum. - Lower 16-bits of the block bitmap checksum.
* - 0x1A * - 0x1A
- \_\_le16 - __le16
- bg\_inode\_bitmap\_csum\_lo - bg_inode_bitmap_csum_lo
- Lower 16-bits of the inode bitmap checksum. - Lower 16-bits of the inode bitmap checksum.
* - 0x1C * - 0x1C
- \_\_le16 - __le16
- bg\_itable\_unused\_lo - bg_itable_unused_lo
- Lower 16-bits of unused inode count. If set, we needn't scan past the - Lower 16-bits of unused inode count. If set, we needn't scan past the
``(sb.s_inodes_per_group - gdt.bg_itable_unused)``\ th entry in the ``(sb.s_inodes_per_group - gdt.bg_itable_unused)`` th entry in the
inode table for this group. inode table for this group.
* - 0x1E * - 0x1E
- \_\_le16 - __le16
- bg\_checksum - bg_checksum
- Group descriptor checksum; crc16(sb\_uuid+group\_num+bg\_desc) if the - Group descriptor checksum; crc16(sb_uuid+group_num+bg_desc) if the
RO\_COMPAT\_GDT\_CSUM feature is set, or RO_COMPAT_GDT_CSUM feature is set, or
crc32c(sb\_uuid+group\_num+bg\_desc) & 0xFFFF if the crc32c(sb_uuid+group_num+bg_desc) & 0xFFFF if the
RO\_COMPAT\_METADATA\_CSUM feature is set. The bg\_checksum RO_COMPAT_METADATA_CSUM feature is set. The bg_checksum
field in bg\_desc is skipped when calculating crc16 checksum, field in bg_desc is skipped when calculating crc16 checksum,
and set to zero if crc32c checksum is used. and set to zero if crc32c checksum is used.
* - * -
- -
@ -111,48 +111,48 @@ The block group descriptor is laid out in ``struct ext4_group_desc``.
- These fields only exist if the 64bit feature is enabled and s_desc_size - These fields only exist if the 64bit feature is enabled and s_desc_size
> 32. > 32.
* - 0x20 * - 0x20
- \_\_le32 - __le32
- bg\_block\_bitmap\_hi - bg_block_bitmap_hi
- Upper 32-bits of location of block bitmap. - Upper 32-bits of location of block bitmap.
* - 0x24 * - 0x24
- \_\_le32 - __le32
- bg\_inode\_bitmap\_hi - bg_inode_bitmap_hi
- Upper 32-bits of location of inodes bitmap. - Upper 32-bits of location of inodes bitmap.
* - 0x28 * - 0x28
- \_\_le32 - __le32
- bg\_inode\_table\_hi - bg_inode_table_hi
- Upper 32-bits of location of inodes table. - Upper 32-bits of location of inodes table.
* - 0x2C * - 0x2C
- \_\_le16 - __le16
- bg\_free\_blocks\_count\_hi - bg_free_blocks_count_hi
- Upper 16-bits of free block count. - Upper 16-bits of free block count.
* - 0x2E * - 0x2E
- \_\_le16 - __le16
- bg\_free\_inodes\_count\_hi - bg_free_inodes_count_hi
- Upper 16-bits of free inode count. - Upper 16-bits of free inode count.
* - 0x30 * - 0x30
- \_\_le16 - __le16
- bg\_used\_dirs\_count\_hi - bg_used_dirs_count_hi
- Upper 16-bits of directory count. - Upper 16-bits of directory count.
* - 0x32 * - 0x32
- \_\_le16 - __le16
- bg\_itable\_unused\_hi - bg_itable_unused_hi
- Upper 16-bits of unused inode count. - Upper 16-bits of unused inode count.
* - 0x34 * - 0x34
- \_\_le32 - __le32
- bg\_exclude\_bitmap\_hi - bg_exclude_bitmap_hi
- Upper 32-bits of location of snapshot exclusion bitmap. - Upper 32-bits of location of snapshot exclusion bitmap.
* - 0x38 * - 0x38
- \_\_le16 - __le16
- bg\_block\_bitmap\_csum\_hi - bg_block_bitmap_csum_hi
- Upper 16-bits of the block bitmap checksum. - Upper 16-bits of the block bitmap checksum.
* - 0x3A * - 0x3A
- \_\_le16 - __le16
- bg\_inode\_bitmap\_csum\_hi - bg_inode_bitmap_csum_hi
- Upper 16-bits of the inode bitmap checksum. - Upper 16-bits of the inode bitmap checksum.
* - 0x3C * - 0x3C
- \_\_u32 - __u32
- bg\_reserved - bg_reserved
- Padding to 64 bytes. - Padding to 64 bytes.
.. _bgflags: .. _bgflags:
@ -166,8 +166,8 @@ Block group flags can be any combination of the following:
* - Value * - Value
- Description - Description
* - 0x1 * - 0x1
- inode table and bitmap are not initialized (EXT4\_BG\_INODE\_UNINIT). - inode table and bitmap are not initialized (EXT4_BG_INODE_UNINIT).
* - 0x2 * - 0x2
- block bitmap is not initialized (EXT4\_BG\_BLOCK\_UNINIT). - block bitmap is not initialized (EXT4_BG_BLOCK_UNINIT).
* - 0x4 * - 0x4
- inode table is zeroed (EXT4\_BG\_INODE\_ZEROED). - inode table is zeroed (EXT4_BG_INODE_ZEROED).

View File

@ -1,6 +1,6 @@
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
The Contents of inode.i\_block The Contents of inode.i_block
------------------------------ ------------------------------
Depending on the type of file an inode describes, the 60 bytes of Depending on the type of file an inode describes, the 60 bytes of
@ -47,7 +47,7 @@ In ext4, the file to logical block map has been replaced with an extent
tree. Under the old scheme, allocating a contiguous run of 1,000 blocks tree. Under the old scheme, allocating a contiguous run of 1,000 blocks
requires an indirect block to map all 1,000 entries; with extents, the requires an indirect block to map all 1,000 entries; with extents, the
mapping is reduced to a single ``struct ext4_extent`` with mapping is reduced to a single ``struct ext4_extent`` with
``ee_len = 1000``. If flex\_bg is enabled, it is possible to allocate ``ee_len = 1000``. If flex_bg is enabled, it is possible to allocate
very large files with a single extent, at a considerable reduction in very large files with a single extent, at a considerable reduction in
metadata block use, and some improvement in disk efficiency. The inode metadata block use, and some improvement in disk efficiency. The inode
must have the extents flag (0x80000) flag set for this feature to be in must have the extents flag (0x80000) flag set for this feature to be in
@ -76,28 +76,28 @@ which is 12 bytes long:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le16 - __le16
- eh\_magic - eh_magic
- Magic number, 0xF30A. - Magic number, 0xF30A.
* - 0x2 * - 0x2
- \_\_le16 - __le16
- eh\_entries - eh_entries
- Number of valid entries following the header. - Number of valid entries following the header.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- eh\_max - eh_max
- Maximum number of entries that could follow the header. - Maximum number of entries that could follow the header.
* - 0x6 * - 0x6
- \_\_le16 - __le16
- eh\_depth - eh_depth
- Depth of this extent node in the extent tree. 0 = this extent node - Depth of this extent node in the extent tree. 0 = this extent node
points to data blocks; otherwise, this extent node points to other points to data blocks; otherwise, this extent node points to other
extent nodes. The extent tree can be at most 5 levels deep: a logical extent nodes. The extent tree can be at most 5 levels deep: a logical
block number can be at most ``2^32``, and the smallest ``n`` that block number can be at most ``2^32``, and the smallest ``n`` that
satisfies ``4*(((blocksize - 12)/12)^n) >= 2^32`` is 5. satisfies ``4*(((blocksize - 12)/12)^n) >= 2^32`` is 5.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- eh\_generation - eh_generation
- Generation of the tree. (Used by Lustre, but not standard ext4). - Generation of the tree. (Used by Lustre, but not standard ext4).
Internal nodes of the extent tree, also known as index nodes, are Internal nodes of the extent tree, also known as index nodes, are
@ -112,22 +112,22 @@ recorded as ``struct ext4_extent_idx``, and are 12 bytes long:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- ei\_block - ei_block
- This index node covers file blocks from 'block' onward. - This index node covers file blocks from 'block' onward.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- ei\_leaf\_lo - ei_leaf_lo
- Lower 32-bits of the block number of the extent node that is the next - Lower 32-bits of the block number of the extent node that is the next
level lower in the tree. The tree node pointed to can be either another level lower in the tree. The tree node pointed to can be either another
internal node or a leaf node, described below. internal node or a leaf node, described below.
* - 0x8 * - 0x8
- \_\_le16 - __le16
- ei\_leaf\_hi - ei_leaf_hi
- Upper 16-bits of the previous field. - Upper 16-bits of the previous field.
* - 0xA * - 0xA
- \_\_u16 - __u16
- ei\_unused - ei_unused
- -
Leaf nodes of the extent tree are recorded as ``struct ext4_extent``, Leaf nodes of the extent tree are recorded as ``struct ext4_extent``,
@ -142,24 +142,24 @@ and are also 12 bytes long:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- ee\_block - ee_block
- First file block number that this extent covers. - First file block number that this extent covers.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- ee\_len - ee_len
- Number of blocks covered by extent. If the value of this field is <= - Number of blocks covered by extent. If the value of this field is <=
32768, the extent is initialized. If the value of the field is > 32768, 32768, the extent is initialized. If the value of the field is > 32768,
the extent is uninitialized and the actual extent length is ``ee_len`` - the extent is uninitialized and the actual extent length is ``ee_len`` -
32768. Therefore, the maximum length of a initialized extent is 32768 32768. Therefore, the maximum length of a initialized extent is 32768
blocks, and the maximum length of an uninitialized extent is 32767. blocks, and the maximum length of an uninitialized extent is 32767.
* - 0x6 * - 0x6
- \_\_le16 - __le16
- ee\_start\_hi - ee_start_hi
- Upper 16-bits of the block number to which this extent points. - Upper 16-bits of the block number to which this extent points.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- ee\_start\_lo - ee_start_lo
- Lower 32-bits of the block number to which this extent points. - Lower 32-bits of the block number to which this extent points.
Prior to the introduction of metadata checksums, the extent header + Prior to the introduction of metadata checksums, the extent header +
@ -182,8 +182,8 @@ including) the checksum itself.
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- eb\_checksum - eb_checksum
- Checksum of the extent block, crc32c(uuid+inum+igeneration+extentblock) - Checksum of the extent block, crc32c(uuid+inum+igeneration+extentblock)
Inline Data Inline Data

View File

@ -11,12 +11,12 @@ file is smaller than 60 bytes, then the data are stored inline in
attribute space, then it might be found as an extended attribute attribute space, then it might be found as an extended attribute
“system.data” within the inode body (“ibody EA”). This of course “system.data” within the inode body (“ibody EA”). This of course
constrains the amount of extended attributes one can attach to an inode. constrains the amount of extended attributes one can attach to an inode.
If the data size increases beyond i\_block + ibody EA, a regular block If the data size increases beyond i_block + ibody EA, a regular block
is allocated and the contents moved to that block. is allocated and the contents moved to that block.
Pending a change to compact the extended attribute key used to store Pending a change to compact the extended attribute key used to store
inline data, one ought to be able to store 160 bytes of data in a inline data, one ought to be able to store 160 bytes of data in a
256-byte inode (as of June 2015, when i\_extra\_isize is 28). Prior to 256-byte inode (as of June 2015, when i_extra_isize is 28). Prior to
that, the limit was 156 bytes due to inefficient use of inode space. that, the limit was 156 bytes due to inefficient use of inode space.
The inline data feature requires the presence of an extended attribute The inline data feature requires the presence of an extended attribute
@ -25,12 +25,12 @@ for “system.data”, even if the attribute value is zero length.
Inline Directories Inline Directories
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
The first four bytes of i\_block are the inode number of the parent The first four bytes of i_block are the inode number of the parent
directory. Following that is a 56-byte space for an array of directory directory. Following that is a 56-byte space for an array of directory
entries; see ``struct ext4_dir_entry``. If there is a “system.data” entries; see ``struct ext4_dir_entry``. If there is a “system.data”
attribute in the inode body, the EA value is an array of attribute in the inode body, the EA value is an array of
``struct ext4_dir_entry`` as well. Note that for inline directories, the ``struct ext4_dir_entry`` as well. Note that for inline directories, the
i\_block and EA space are treated as separate dirent blocks; directory i_block and EA space are treated as separate dirent blocks; directory
entries cannot span the two. entries cannot span the two.
Inline directory entries are not checksummed, as the inode checksum Inline directory entries are not checksummed, as the inode checksum

View File

@ -38,138 +38,138 @@ The inode table entry is laid out in ``struct ext4_inode``.
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le16 - __le16
- i\_mode - i_mode
- File mode. See the table i_mode_ below. - File mode. See the table i_mode_ below.
* - 0x2 * - 0x2
- \_\_le16 - __le16
- i\_uid - i_uid
- Lower 16-bits of Owner UID. - Lower 16-bits of Owner UID.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- i\_size\_lo - i_size_lo
- Lower 32-bits of size in bytes. - Lower 32-bits of size in bytes.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- i\_atime - i_atime
- Last access time, in seconds since the epoch. However, if the EA\_INODE - Last access time, in seconds since the epoch. However, if the EA_INODE
inode flag is set, this inode stores an extended attribute value and inode flag is set, this inode stores an extended attribute value and
this field contains the checksum of the value. this field contains the checksum of the value.
* - 0xC * - 0xC
- \_\_le32 - __le32
- i\_ctime - i_ctime
- Last inode change time, in seconds since the epoch. However, if the - Last inode change time, in seconds since the epoch. However, if the
EA\_INODE inode flag is set, this inode stores an extended attribute EA_INODE inode flag is set, this inode stores an extended attribute
value and this field contains the lower 32 bits of the attribute value's value and this field contains the lower 32 bits of the attribute value's
reference count. reference count.
* - 0x10 * - 0x10
- \_\_le32 - __le32
- i\_mtime - i_mtime
- Last data modification time, in seconds since the epoch. However, if the - Last data modification time, in seconds since the epoch. However, if the
EA\_INODE inode flag is set, this inode stores an extended attribute EA_INODE inode flag is set, this inode stores an extended attribute
value and this field contains the number of the inode that owns the value and this field contains the number of the inode that owns the
extended attribute. extended attribute.
* - 0x14 * - 0x14
- \_\_le32 - __le32
- i\_dtime - i_dtime
- Deletion Time, in seconds since the epoch. - Deletion Time, in seconds since the epoch.
* - 0x18 * - 0x18
- \_\_le16 - __le16
- i\_gid - i_gid
- Lower 16-bits of GID. - Lower 16-bits of GID.
* - 0x1A * - 0x1A
- \_\_le16 - __le16
- i\_links\_count - i_links_count
- Hard link count. Normally, ext4 does not permit an inode to have more - Hard link count. Normally, ext4 does not permit an inode to have more
than 65,000 hard links. This applies to files as well as directories, than 65,000 hard links. This applies to files as well as directories,
which means that there cannot be more than 64,998 subdirectories in a which means that there cannot be more than 64,998 subdirectories in a
directory (each subdirectory's '..' entry counts as a hard link, as does directory (each subdirectory's '..' entry counts as a hard link, as does
the '.' entry in the directory itself). With the DIR\_NLINK feature the '.' entry in the directory itself). With the DIR_NLINK feature
enabled, ext4 supports more than 64,998 subdirectories by setting this enabled, ext4 supports more than 64,998 subdirectories by setting this
field to 1 to indicate that the number of hard links is not known. field to 1 to indicate that the number of hard links is not known.
* - 0x1C * - 0x1C
- \_\_le32 - __le32
- i\_blocks\_lo - i_blocks_lo
- Lower 32-bits of “block” count. If the huge\_file feature flag is not - Lower 32-bits of “block” count. If the huge_file feature flag is not
set on the filesystem, the file consumes ``i_blocks_lo`` 512-byte blocks set on the filesystem, the file consumes ``i_blocks_lo`` 512-byte blocks
on disk. If huge\_file is set and EXT4\_HUGE\_FILE\_FL is NOT set in on disk. If huge_file is set and EXT4_HUGE_FILE_FL is NOT set in
``inode.i_flags``, then the file consumes ``i_blocks_lo + (i_blocks_hi ``inode.i_flags``, then the file consumes ``i_blocks_lo + (i_blocks_hi
<< 32)`` 512-byte blocks on disk. If huge\_file is set and << 32)`` 512-byte blocks on disk. If huge_file is set and
EXT4\_HUGE\_FILE\_FL IS set in ``inode.i_flags``, then this file EXT4_HUGE_FILE_FL IS set in ``inode.i_flags``, then this file
consumes (``i_blocks_lo + i_blocks_hi`` << 32) filesystem blocks on consumes (``i_blocks_lo + i_blocks_hi`` << 32) filesystem blocks on
disk. disk.
* - 0x20 * - 0x20
- \_\_le32 - __le32
- i\_flags - i_flags
- Inode flags. See the table i_flags_ below. - Inode flags. See the table i_flags_ below.
* - 0x24 * - 0x24
- 4 bytes - 4 bytes
- i\_osd1 - i_osd1
- See the table i_osd1_ for more details. - See the table i_osd1_ for more details.
* - 0x28 * - 0x28
- 60 bytes - 60 bytes
- i\_block[EXT4\_N\_BLOCKS=15] - i_block[EXT4_N_BLOCKS=15]
- Block map or extent tree. See the section “The Contents of inode.i\_block”. - Block map or extent tree. See the section “The Contents of inode.i_block”.
* - 0x64 * - 0x64
- \_\_le32 - __le32
- i\_generation - i_generation
- File version (for NFS). - File version (for NFS).
* - 0x68 * - 0x68
- \_\_le32 - __le32
- i\_file\_acl\_lo - i_file_acl_lo
- Lower 32-bits of extended attribute block. ACLs are of course one of - Lower 32-bits of extended attribute block. ACLs are of course one of
many possible extended attributes; I think the name of this field is a many possible extended attributes; I think the name of this field is a
result of the first use of extended attributes being for ACLs. result of the first use of extended attributes being for ACLs.
* - 0x6C * - 0x6C
- \_\_le32 - __le32
- i\_size\_high / i\_dir\_acl - i_size_high / i_dir_acl
- Upper 32-bits of file/directory size. In ext2/3 this field was named - Upper 32-bits of file/directory size. In ext2/3 this field was named
i\_dir\_acl, though it was usually set to zero and never used. i_dir_acl, though it was usually set to zero and never used.
* - 0x70 * - 0x70
- \_\_le32 - __le32
- i\_obso\_faddr - i_obso_faddr
- (Obsolete) fragment address. - (Obsolete) fragment address.
* - 0x74 * - 0x74
- 12 bytes - 12 bytes
- i\_osd2 - i_osd2
- See the table i_osd2_ for more details. - See the table i_osd2_ for more details.
* - 0x80 * - 0x80
- \_\_le16 - __le16
- i\_extra\_isize - i_extra_isize
- Size of this inode - 128. Alternately, the size of the extended inode - Size of this inode - 128. Alternately, the size of the extended inode
fields beyond the original ext2 inode, including this field. fields beyond the original ext2 inode, including this field.
* - 0x82 * - 0x82
- \_\_le16 - __le16
- i\_checksum\_hi - i_checksum_hi
- Upper 16-bits of the inode checksum. - Upper 16-bits of the inode checksum.
* - 0x84 * - 0x84
- \_\_le32 - __le32
- i\_ctime\_extra - i_ctime_extra
- Extra change time bits. This provides sub-second precision. See Inode - Extra change time bits. This provides sub-second precision. See Inode
Timestamps section. Timestamps section.
* - 0x88 * - 0x88
- \_\_le32 - __le32
- i\_mtime\_extra - i_mtime_extra
- Extra modification time bits. This provides sub-second precision. - Extra modification time bits. This provides sub-second precision.
* - 0x8C * - 0x8C
- \_\_le32 - __le32
- i\_atime\_extra - i_atime_extra
- Extra access time bits. This provides sub-second precision. - Extra access time bits. This provides sub-second precision.
* - 0x90 * - 0x90
- \_\_le32 - __le32
- i\_crtime - i_crtime
- File creation time, in seconds since the epoch. - File creation time, in seconds since the epoch.
* - 0x94 * - 0x94
- \_\_le32 - __le32
- i\_crtime\_extra - i_crtime_extra
- Extra file creation time bits. This provides sub-second precision. - Extra file creation time bits. This provides sub-second precision.
* - 0x98 * - 0x98
- \_\_le32 - __le32
- i\_version\_hi - i_version_hi
- Upper 32-bits for version number. - Upper 32-bits for version number.
* - 0x9C * - 0x9C
- \_\_le32 - __le32
- i\_projid - i_projid
- Project ID. - Project ID.
.. _i_mode: .. _i_mode:
@ -183,45 +183,45 @@ The ``i_mode`` value is a combination of the following flags:
* - Value * - Value
- Description - Description
* - 0x1 * - 0x1
- S\_IXOTH (Others may execute) - S_IXOTH (Others may execute)
* - 0x2 * - 0x2
- S\_IWOTH (Others may write) - S_IWOTH (Others may write)
* - 0x4 * - 0x4
- S\_IROTH (Others may read) - S_IROTH (Others may read)
* - 0x8 * - 0x8
- S\_IXGRP (Group members may execute) - S_IXGRP (Group members may execute)
* - 0x10 * - 0x10
- S\_IWGRP (Group members may write) - S_IWGRP (Group members may write)
* - 0x20 * - 0x20
- S\_IRGRP (Group members may read) - S_IRGRP (Group members may read)
* - 0x40 * - 0x40
- S\_IXUSR (Owner may execute) - S_IXUSR (Owner may execute)
* - 0x80 * - 0x80
- S\_IWUSR (Owner may write) - S_IWUSR (Owner may write)
* - 0x100 * - 0x100
- S\_IRUSR (Owner may read) - S_IRUSR (Owner may read)
* - 0x200 * - 0x200
- S\_ISVTX (Sticky bit) - S_ISVTX (Sticky bit)
* - 0x400 * - 0x400
- S\_ISGID (Set GID) - S_ISGID (Set GID)
* - 0x800 * - 0x800
- S\_ISUID (Set UID) - S_ISUID (Set UID)
* - * -
- These are mutually-exclusive file types: - These are mutually-exclusive file types:
* - 0x1000 * - 0x1000
- S\_IFIFO (FIFO) - S_IFIFO (FIFO)
* - 0x2000 * - 0x2000
- S\_IFCHR (Character device) - S_IFCHR (Character device)
* - 0x4000 * - 0x4000
- S\_IFDIR (Directory) - S_IFDIR (Directory)
* - 0x6000 * - 0x6000
- S\_IFBLK (Block device) - S_IFBLK (Block device)
* - 0x8000 * - 0x8000
- S\_IFREG (Regular file) - S_IFREG (Regular file)
* - 0xA000 * - 0xA000
- S\_IFLNK (Symbolic link) - S_IFLNK (Symbolic link)
* - 0xC000 * - 0xC000
- S\_IFSOCK (Socket) - S_IFSOCK (Socket)
.. _i_flags: .. _i_flags:
@ -234,56 +234,56 @@ The ``i_flags`` field is a combination of these values:
* - Value * - Value
- Description - Description
* - 0x1 * - 0x1
- This file requires secure deletion (EXT4\_SECRM\_FL). (not implemented) - This file requires secure deletion (EXT4_SECRM_FL). (not implemented)
* - 0x2 * - 0x2
- This file should be preserved, should undeletion be desired - This file should be preserved, should undeletion be desired
(EXT4\_UNRM\_FL). (not implemented) (EXT4_UNRM_FL). (not implemented)
* - 0x4 * - 0x4
- File is compressed (EXT4\_COMPR\_FL). (not really implemented) - File is compressed (EXT4_COMPR_FL). (not really implemented)
* - 0x8 * - 0x8
- All writes to the file must be synchronous (EXT4\_SYNC\_FL). - All writes to the file must be synchronous (EXT4_SYNC_FL).
* - 0x10 * - 0x10
- File is immutable (EXT4\_IMMUTABLE\_FL). - File is immutable (EXT4_IMMUTABLE_FL).
* - 0x20 * - 0x20
- File can only be appended (EXT4\_APPEND\_FL). - File can only be appended (EXT4_APPEND_FL).
* - 0x40 * - 0x40
- The dump(1) utility should not dump this file (EXT4\_NODUMP\_FL). - The dump(1) utility should not dump this file (EXT4_NODUMP_FL).
* - 0x80 * - 0x80
- Do not update access time (EXT4\_NOATIME\_FL). - Do not update access time (EXT4_NOATIME_FL).
* - 0x100 * - 0x100
- Dirty compressed file (EXT4\_DIRTY\_FL). (not used) - Dirty compressed file (EXT4_DIRTY_FL). (not used)
* - 0x200 * - 0x200
- File has one or more compressed clusters (EXT4\_COMPRBLK\_FL). (not used) - File has one or more compressed clusters (EXT4_COMPRBLK_FL). (not used)
* - 0x400 * - 0x400
- Do not compress file (EXT4\_NOCOMPR\_FL). (not used) - Do not compress file (EXT4_NOCOMPR_FL). (not used)
* - 0x800 * - 0x800
- Encrypted inode (EXT4\_ENCRYPT\_FL). This bit value previously was - Encrypted inode (EXT4_ENCRYPT_FL). This bit value previously was
EXT4\_ECOMPR\_FL (compression error), which was never used. EXT4_ECOMPR_FL (compression error), which was never used.
* - 0x1000 * - 0x1000
- Directory has hashed indexes (EXT4\_INDEX\_FL). - Directory has hashed indexes (EXT4_INDEX_FL).
* - 0x2000 * - 0x2000
- AFS magic directory (EXT4\_IMAGIC\_FL). - AFS magic directory (EXT4_IMAGIC_FL).
* - 0x4000 * - 0x4000
- File data must always be written through the journal - File data must always be written through the journal
(EXT4\_JOURNAL\_DATA\_FL). (EXT4_JOURNAL_DATA_FL).
* - 0x8000 * - 0x8000
- File tail should not be merged (EXT4\_NOTAIL\_FL). (not used by ext4) - File tail should not be merged (EXT4_NOTAIL_FL). (not used by ext4)
* - 0x10000 * - 0x10000
- All directory entry data should be written synchronously (see - All directory entry data should be written synchronously (see
``dirsync``) (EXT4\_DIRSYNC\_FL). ``dirsync``) (EXT4_DIRSYNC_FL).
* - 0x20000 * - 0x20000
- Top of directory hierarchy (EXT4\_TOPDIR\_FL). - Top of directory hierarchy (EXT4_TOPDIR_FL).
* - 0x40000 * - 0x40000
- This is a huge file (EXT4\_HUGE\_FILE\_FL). - This is a huge file (EXT4_HUGE_FILE_FL).
* - 0x80000 * - 0x80000
- Inode uses extents (EXT4\_EXTENTS\_FL). - Inode uses extents (EXT4_EXTENTS_FL).
* - 0x100000 * - 0x100000
- Verity protected file (EXT4\_VERITY\_FL). - Verity protected file (EXT4_VERITY_FL).
* - 0x200000 * - 0x200000
- Inode stores a large extended attribute value in its data blocks - Inode stores a large extended attribute value in its data blocks
(EXT4\_EA\_INODE\_FL). (EXT4_EA_INODE_FL).
* - 0x400000 * - 0x400000
- This file has blocks allocated past EOF (EXT4\_EOFBLOCKS\_FL). - This file has blocks allocated past EOF (EXT4_EOFBLOCKS_FL).
(deprecated) (deprecated)
* - 0x01000000 * - 0x01000000
- Inode is a snapshot (``EXT4_SNAPFILE_FL``). (not in mainline) - Inode is a snapshot (``EXT4_SNAPFILE_FL``). (not in mainline)
@ -294,21 +294,21 @@ The ``i_flags`` field is a combination of these values:
- Snapshot shrink has completed (``EXT4_SNAPFILE_SHRUNK_FL``). (not in - Snapshot shrink has completed (``EXT4_SNAPFILE_SHRUNK_FL``). (not in
mainline) mainline)
* - 0x10000000 * - 0x10000000
- Inode has inline data (EXT4\_INLINE\_DATA\_FL). - Inode has inline data (EXT4_INLINE_DATA_FL).
* - 0x20000000 * - 0x20000000
- Create children with the same project ID (EXT4\_PROJINHERIT\_FL). - Create children with the same project ID (EXT4_PROJINHERIT_FL).
* - 0x80000000 * - 0x80000000
- Reserved for ext4 library (EXT4\_RESERVED\_FL). - Reserved for ext4 library (EXT4_RESERVED_FL).
* - * -
- Aggregate flags: - Aggregate flags:
* - 0x705BDFFF * - 0x705BDFFF
- User-visible flags. - User-visible flags.
* - 0x604BC0FF * - 0x604BC0FF
- User-modifiable flags. Note that while EXT4\_JOURNAL\_DATA\_FL and - User-modifiable flags. Note that while EXT4_JOURNAL_DATA_FL and
EXT4\_EXTENTS\_FL can be set with setattr, they are not in the kernel's EXT4_EXTENTS_FL can be set with setattr, they are not in the kernel's
EXT4\_FL\_USER\_MODIFIABLE mask, since it needs to handle the setting of EXT4_FL_USER_MODIFIABLE mask, since it needs to handle the setting of
these flags in a special manner and they are masked out of the set of these flags in a special manner and they are masked out of the set of
flags that are saved directly to i\_flags. flags that are saved directly to i_flags.
.. _i_osd1: .. _i_osd1:
@ -325,9 +325,9 @@ Linux:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- l\_i\_version - l_i_version
- Inode version. However, if the EA\_INODE inode flag is set, this inode - Inode version. However, if the EA_INODE inode flag is set, this inode
stores an extended attribute value and this field contains the upper 32 stores an extended attribute value and this field contains the upper 32
bits of the attribute value's reference count. bits of the attribute value's reference count.
@ -342,8 +342,8 @@ Hurd:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- h\_i\_translator - h_i_translator
- ?? - ??
Masix: Masix:
@ -357,8 +357,8 @@ Masix:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- m\_i\_reserved - m_i_reserved
- ?? - ??
.. _i_osd2: .. _i_osd2:
@ -376,30 +376,30 @@ Linux:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le16 - __le16
- l\_i\_blocks\_high - l_i_blocks_high
- Upper 16-bits of the block count. Please see the note attached to - Upper 16-bits of the block count. Please see the note attached to
i\_blocks\_lo. i_blocks_lo.
* - 0x2 * - 0x2
- \_\_le16 - __le16
- l\_i\_file\_acl\_high - l_i_file_acl_high
- Upper 16-bits of the extended attribute block (historically, the file - Upper 16-bits of the extended attribute block (historically, the file
ACL location). See the Extended Attributes section below. ACL location). See the Extended Attributes section below.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- l\_i\_uid\_high - l_i_uid_high
- Upper 16-bits of the Owner UID. - Upper 16-bits of the Owner UID.
* - 0x6 * - 0x6
- \_\_le16 - __le16
- l\_i\_gid\_high - l_i_gid_high
- Upper 16-bits of the GID. - Upper 16-bits of the GID.
* - 0x8 * - 0x8
- \_\_le16 - __le16
- l\_i\_checksum\_lo - l_i_checksum_lo
- Lower 16-bits of the inode checksum. - Lower 16-bits of the inode checksum.
* - 0xA * - 0xA
- \_\_le16 - __le16
- l\_i\_reserved - l_i_reserved
- Unused. - Unused.
Hurd: Hurd:
@ -413,24 +413,24 @@ Hurd:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le16 - __le16
- h\_i\_reserved1 - h_i_reserved1
- ?? - ??
* - 0x2 * - 0x2
- \_\_u16 - __u16
- h\_i\_mode\_high - h_i_mode_high
- Upper 16-bits of the file mode. - Upper 16-bits of the file mode.
* - 0x4 * - 0x4
- \_\_le16 - __le16
- h\_i\_uid\_high - h_i_uid_high
- Upper 16-bits of the Owner UID. - Upper 16-bits of the Owner UID.
* - 0x6 * - 0x6
- \_\_le16 - __le16
- h\_i\_gid\_high - h_i_gid_high
- Upper 16-bits of the GID. - Upper 16-bits of the GID.
* - 0x8 * - 0x8
- \_\_u32 - __u32
- h\_i\_author - h_i_author
- Author code? - Author code?
Masix: Masix:
@ -444,17 +444,17 @@ Masix:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le16 - __le16
- h\_i\_reserved1 - h_i_reserved1
- ?? - ??
* - 0x2 * - 0x2
- \_\_u16 - __u16
- m\_i\_file\_acl\_high - m_i_file_acl_high
- Upper 16-bits of the extended attribute block (historically, the file - Upper 16-bits of the extended attribute block (historically, the file
ACL location). ACL location).
* - 0x4 * - 0x4
- \_\_u32 - __u32
- m\_i\_reserved2[2] - m_i_reserved2[2]
- ?? - ??
Inode Size Inode Size
@ -466,11 +466,11 @@ In ext2 and ext3, the inode structure size was fixed at 128 bytes
on-disk inode at format time for all inodes in the filesystem to provide on-disk inode at format time for all inodes in the filesystem to provide
space beyond the end of the original ext2 inode. The on-disk inode space beyond the end of the original ext2 inode. The on-disk inode
record size is recorded in the superblock as ``s_inode_size``. The record size is recorded in the superblock as ``s_inode_size``. The
number of bytes actually used by struct ext4\_inode beyond the original number of bytes actually used by struct ext4_inode beyond the original
128-byte ext2 inode is recorded in the ``i_extra_isize`` field for each 128-byte ext2 inode is recorded in the ``i_extra_isize`` field for each
inode, which allows struct ext4\_inode to grow for a new kernel without inode, which allows struct ext4_inode to grow for a new kernel without
having to upgrade all of the on-disk inodes. Access to fields beyond having to upgrade all of the on-disk inodes. Access to fields beyond
EXT2\_GOOD\_OLD\_INODE\_SIZE should be verified to be within EXT2_GOOD_OLD_INODE_SIZE should be verified to be within
``i_extra_isize``. By default, ext4 inode records are 256 bytes, and (as ``i_extra_isize``. By default, ext4 inode records are 256 bytes, and (as
of August 2019) the inode structure is 160 bytes of August 2019) the inode structure is 160 bytes
(``i_extra_isize = 32``). The extra space between the end of the inode (``i_extra_isize = 32``). The extra space between the end of the inode
@ -516,7 +516,7 @@ creation time (crtime); this field is 64-bits wide and decoded in the
same manner as 64-bit [cma]time. Neither crtime nor dtime are accessible same manner as 64-bit [cma]time. Neither crtime nor dtime are accessible
through the regular stat() interface, though debugfs will report them. through the regular stat() interface, though debugfs will report them.
We use the 32-bit signed time value plus (2^32 \* (extra epoch bits)). We use the 32-bit signed time value plus (2^32 * (extra epoch bits)).
In other words: In other words:
.. list-table:: .. list-table::
@ -525,8 +525,8 @@ In other words:
* - Extra epoch bits * - Extra epoch bits
- MSB of 32-bit time - MSB of 32-bit time
- Adjustment for signed 32-bit to 64-bit tv\_sec - Adjustment for signed 32-bit to 64-bit tv_sec
- Decoded 64-bit tv\_sec - Decoded 64-bit tv_sec
- valid time range - valid time range
* - 0 0 * - 0 0
- 1 - 1

View File

@ -63,8 +63,8 @@ Generally speaking, the journal has this format:
:header-rows: 1 :header-rows: 1
* - Superblock * - Superblock
- descriptor\_block (data\_blocks or revocation\_block) [more data or - descriptor_block (data_blocks or revocation_block) [more data or
revocations] commmit\_block revocations] commmit_block
- [more transactions...] - [more transactions...]
* - * -
- One transaction - One transaction
@ -93,8 +93,8 @@ superblock.
* - 1024 bytes of padding * - 1024 bytes of padding
- ext4 Superblock - ext4 Superblock
- Journal Superblock - Journal Superblock
- descriptor\_block (data\_blocks or revocation\_block) [more data or - descriptor_block (data_blocks or revocation_block) [more data or
revocations] commmit\_block revocations] commmit_block
- [more transactions...] - [more transactions...]
* - * -
- -
@ -117,17 +117,17 @@ Every block in the journal starts with a common 12-byte header
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_be32 - __be32
- h\_magic - h_magic
- jbd2 magic number, 0xC03B3998. - jbd2 magic number, 0xC03B3998.
* - 0x4 * - 0x4
- \_\_be32 - __be32
- h\_blocktype - h_blocktype
- Description of what this block contains. See the jbd2_blocktype_ table - Description of what this block contains. See the jbd2_blocktype_ table
below. below.
* - 0x8 * - 0x8
- \_\_be32 - __be32
- h\_sequence - h_sequence
- The transaction ID that goes with this block. - The transaction ID that goes with this block.
.. _jbd2_blocktype: .. _jbd2_blocktype:
@ -177,99 +177,99 @@ which is 1024 bytes long:
- -
- Static information describing the journal. - Static information describing the journal.
* - 0x0 * - 0x0
- journal\_header\_t (12 bytes) - journal_header_t (12 bytes)
- s\_header - s_header
- Common header identifying this as a superblock. - Common header identifying this as a superblock.
* - 0xC * - 0xC
- \_\_be32 - __be32
- s\_blocksize - s_blocksize
- Journal device block size. - Journal device block size.
* - 0x10 * - 0x10
- \_\_be32 - __be32
- s\_maxlen - s_maxlen
- Total number of blocks in this journal. - Total number of blocks in this journal.
* - 0x14 * - 0x14
- \_\_be32 - __be32
- s\_first - s_first
- First block of log information. - First block of log information.
* - * -
- -
- -
- Dynamic information describing the current state of the log. - Dynamic information describing the current state of the log.
* - 0x18 * - 0x18
- \_\_be32 - __be32
- s\_sequence - s_sequence
- First commit ID expected in log. - First commit ID expected in log.
* - 0x1C * - 0x1C
- \_\_be32 - __be32
- s\_start - s_start
- Block number of the start of log. Contrary to the comments, this field - Block number of the start of log. Contrary to the comments, this field
being zero does not imply that the journal is clean! being zero does not imply that the journal is clean!
* - 0x20 * - 0x20
- \_\_be32 - __be32
- s\_errno - s_errno
- Error value, as set by jbd2\_journal\_abort(). - Error value, as set by jbd2_journal_abort().
* - * -
- -
- -
- The remaining fields are only valid in a v2 superblock. - The remaining fields are only valid in a v2 superblock.
* - 0x24 * - 0x24
- \_\_be32 - __be32
- s\_feature\_compat; - s_feature_compat;
- Compatible feature set. See the table jbd2_compat_ below. - Compatible feature set. See the table jbd2_compat_ below.
* - 0x28 * - 0x28
- \_\_be32 - __be32
- s\_feature\_incompat - s_feature_incompat
- Incompatible feature set. See the table jbd2_incompat_ below. - Incompatible feature set. See the table jbd2_incompat_ below.
* - 0x2C * - 0x2C
- \_\_be32 - __be32
- s\_feature\_ro\_compat - s_feature_ro_compat
- Read-only compatible feature set. There aren't any of these currently. - Read-only compatible feature set. There aren't any of these currently.
* - 0x30 * - 0x30
- \_\_u8 - __u8
- s\_uuid[16] - s_uuid[16]
- 128-bit uuid for journal. This is compared against the copy in the ext4 - 128-bit uuid for journal. This is compared against the copy in the ext4
super block at mount time. super block at mount time.
* - 0x40 * - 0x40
- \_\_be32 - __be32
- s\_nr\_users - s_nr_users
- Number of file systems sharing this journal. - Number of file systems sharing this journal.
* - 0x44 * - 0x44
- \_\_be32 - __be32
- s\_dynsuper - s_dynsuper
- Location of dynamic super block copy. (Not used?) - Location of dynamic super block copy. (Not used?)
* - 0x48 * - 0x48
- \_\_be32 - __be32
- s\_max\_transaction - s_max_transaction
- Limit of journal blocks per transaction. (Not used?) - Limit of journal blocks per transaction. (Not used?)
* - 0x4C * - 0x4C
- \_\_be32 - __be32
- s\_max\_trans\_data - s_max_trans_data
- Limit of data blocks per transaction. (Not used?) - Limit of data blocks per transaction. (Not used?)
* - 0x50 * - 0x50
- \_\_u8 - __u8
- s\_checksum\_type - s_checksum_type
- Checksum algorithm used for the journal. See jbd2_checksum_type_ for - Checksum algorithm used for the journal. See jbd2_checksum_type_ for
more info. more info.
* - 0x51 * - 0x51
- \_\_u8[3] - __u8[3]
- s\_padding2 - s_padding2
- -
* - 0x54 * - 0x54
- \_\_be32 - __be32
- s\_num\_fc\_blocks - s_num_fc_blocks
- Number of fast commit blocks in the journal. - Number of fast commit blocks in the journal.
* - 0x58 * - 0x58
- \_\_u32 - __u32
- s\_padding[42] - s_padding[42]
- -
* - 0xFC * - 0xFC
- \_\_be32 - __be32
- s\_checksum - s_checksum
- Checksum of the entire superblock, with this field set to zero. - Checksum of the entire superblock, with this field set to zero.
* - 0x100 * - 0x100
- \_\_u8 - __u8
- s\_users[16\*48] - s_users[16*48]
- ids of all file systems sharing the log. e2fsprogs/Linux don't allow - ids of all file systems sharing the log. e2fsprogs/Linux don't allow
shared external journals, but I imagine Lustre (or ocfs2?), which use shared external journals, but I imagine Lustre (or ocfs2?), which use
the jbd2 code, might. the jbd2 code, might.
@ -286,7 +286,7 @@ The journal compat features are any combination of the following:
- Description - Description
* - 0x1 * - 0x1
- Journal maintains checksums on the data blocks. - Journal maintains checksums on the data blocks.
(JBD2\_FEATURE\_COMPAT\_CHECKSUM) (JBD2_FEATURE_COMPAT_CHECKSUM)
.. _jbd2_incompat: .. _jbd2_incompat:
@ -299,23 +299,23 @@ The journal incompat features are any combination of the following:
* - Value * - Value
- Description - Description
* - 0x1 * - 0x1
- Journal has block revocation records. (JBD2\_FEATURE\_INCOMPAT\_REVOKE) - Journal has block revocation records. (JBD2_FEATURE_INCOMPAT_REVOKE)
* - 0x2 * - 0x2
- Journal can deal with 64-bit block numbers. - Journal can deal with 64-bit block numbers.
(JBD2\_FEATURE\_INCOMPAT\_64BIT) (JBD2_FEATURE_INCOMPAT_64BIT)
* - 0x4 * - 0x4
- Journal commits asynchronously. (JBD2\_FEATURE\_INCOMPAT\_ASYNC\_COMMIT) - Journal commits asynchronously. (JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT)
* - 0x8 * - 0x8
- This journal uses v2 of the checksum on-disk format. Each journal - This journal uses v2 of the checksum on-disk format. Each journal
metadata block gets its own checksum, and the block tags in the metadata block gets its own checksum, and the block tags in the
descriptor table contain checksums for each of the data blocks in the descriptor table contain checksums for each of the data blocks in the
journal. (JBD2\_FEATURE\_INCOMPAT\_CSUM\_V2) journal. (JBD2_FEATURE_INCOMPAT_CSUM_V2)
* - 0x10 * - 0x10
- This journal uses v3 of the checksum on-disk format. This is the same as - This journal uses v3 of the checksum on-disk format. This is the same as
v2, but the journal block tag size is fixed regardless of the size of v2, but the journal block tag size is fixed regardless of the size of
block numbers. (JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3) block numbers. (JBD2_FEATURE_INCOMPAT_CSUM_V3)
* - 0x20 * - 0x20
- Journal has fast commit blocks. (JBD2\_FEATURE\_INCOMPAT\_FAST\_COMMIT) - Journal has fast commit blocks. (JBD2_FEATURE_INCOMPAT_FAST_COMMIT)
.. _jbd2_checksum_type: .. _jbd2_checksum_type:
@ -355,11 +355,11 @@ Descriptor blocks consume at least 36 bytes, but use a full block:
- Name - Name
- Descriptor - Descriptor
* - 0x0 * - 0x0
- journal\_header\_t - journal_header_t
- (open coded) - (open coded)
- Common block header. - Common block header.
* - 0xC * - 0xC
- struct journal\_block\_tag\_s - struct journal_block_tag_s
- open coded array[] - open coded array[]
- Enough tags either to fill up the block or to describe all the data - Enough tags either to fill up the block or to describe all the data
blocks that follow this descriptor block. blocks that follow this descriptor block.
@ -367,7 +367,7 @@ Descriptor blocks consume at least 36 bytes, but use a full block:
Journal block tags have any of the following formats, depending on which Journal block tags have any of the following formats, depending on which
journal feature and block tag flags are set. journal feature and block tag flags are set.
If JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3 is set, the journal block tag is If JBD2_FEATURE_INCOMPAT_CSUM_V3 is set, the journal block tag is
defined as ``struct journal_block_tag3_s``, which looks like the defined as ``struct journal_block_tag3_s``, which looks like the
following. The size is 16 or 32 bytes. following. The size is 16 or 32 bytes.
@ -380,24 +380,24 @@ following. The size is 16 or 32 bytes.
- Name - Name
- Descriptor - Descriptor
* - 0x0 * - 0x0
- \_\_be32 - __be32
- t\_blocknr - t_blocknr
- Lower 32-bits of the location of where the corresponding data block - Lower 32-bits of the location of where the corresponding data block
should end up on disk. should end up on disk.
* - 0x4 * - 0x4
- \_\_be32 - __be32
- t\_flags - t_flags
- Flags that go with the descriptor. See the table jbd2_tag_flags_ for - Flags that go with the descriptor. See the table jbd2_tag_flags_ for
more info. more info.
* - 0x8 * - 0x8
- \_\_be32 - __be32
- t\_blocknr\_high - t_blocknr_high
- Upper 32-bits of the location of where the corresponding data block - Upper 32-bits of the location of where the corresponding data block
should end up on disk. This is zero if JBD2\_FEATURE\_INCOMPAT\_64BIT is should end up on disk. This is zero if JBD2_FEATURE_INCOMPAT_64BIT is
not enabled. not enabled.
* - 0xC * - 0xC
- \_\_be32 - __be32
- t\_checksum - t_checksum
- Checksum of the journal UUID, the sequence number, and the data block. - Checksum of the journal UUID, the sequence number, and the data block.
* - * -
- -
@ -433,7 +433,7 @@ The journal tag flags are any combination of the following:
* - 0x8 * - 0x8
- This is the last tag in this descriptor block. - This is the last tag in this descriptor block.
If JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3 is NOT set, the journal block tag If JBD2_FEATURE_INCOMPAT_CSUM_V3 is NOT set, the journal block tag
is defined as ``struct journal_block_tag_s``, which looks like the is defined as ``struct journal_block_tag_s``, which looks like the
following. The size is 8, 12, 24, or 28 bytes: following. The size is 8, 12, 24, or 28 bytes:
@ -446,18 +446,18 @@ following. The size is 8, 12, 24, or 28 bytes:
- Name - Name
- Descriptor - Descriptor
* - 0x0 * - 0x0
- \_\_be32 - __be32
- t\_blocknr - t_blocknr
- Lower 32-bits of the location of where the corresponding data block - Lower 32-bits of the location of where the corresponding data block
should end up on disk. should end up on disk.
* - 0x4 * - 0x4
- \_\_be16 - __be16
- t\_checksum - t_checksum
- Checksum of the journal UUID, the sequence number, and the data block. - Checksum of the journal UUID, the sequence number, and the data block.
Note that only the lower 16 bits are stored. Note that only the lower 16 bits are stored.
* - 0x6 * - 0x6
- \_\_be16 - __be16
- t\_flags - t_flags
- Flags that go with the descriptor. See the table jbd2_tag_flags_ for - Flags that go with the descriptor. See the table jbd2_tag_flags_ for
more info. more info.
* - * -
@ -466,8 +466,8 @@ following. The size is 8, 12, 24, or 28 bytes:
- This next field is only present if the super block indicates support for - This next field is only present if the super block indicates support for
64-bit block numbers. 64-bit block numbers.
* - 0x8 * - 0x8
- \_\_be32 - __be32
- t\_blocknr\_high - t_blocknr_high
- Upper 32-bits of the location of where the corresponding data block - Upper 32-bits of the location of where the corresponding data block
should end up on disk. should end up on disk.
* - * -
@ -483,8 +483,8 @@ following. The size is 8, 12, 24, or 28 bytes:
``j_uuid`` field in ``struct journal_s``, but only tune2fs touches that ``j_uuid`` field in ``struct journal_s``, but only tune2fs touches that
field. field.
If JBD2\_FEATURE\_INCOMPAT\_CSUM\_V2 or If JBD2_FEATURE_INCOMPAT_CSUM_V2 or
JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3 are set, the end of the block is a JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the end of the block is a
``struct jbd2_journal_block_tail``, which looks like this: ``struct jbd2_journal_block_tail``, which looks like this:
.. list-table:: .. list-table::
@ -496,8 +496,8 @@ JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3 are set, the end of the block is a
- Name - Name
- Descriptor - Descriptor
* - 0x0 * - 0x0
- \_\_be32 - __be32
- t\_checksum - t_checksum
- Checksum of the journal UUID + the descriptor block, with this field set - Checksum of the journal UUID + the descriptor block, with this field set
to zero. to zero.
@ -538,25 +538,25 @@ length, but use a full block:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- journal\_header\_t - journal_header_t
- r\_header - r_header
- Common block header. - Common block header.
* - 0xC * - 0xC
- \_\_be32 - __be32
- r\_count - r_count
- Number of bytes used in this block. - Number of bytes used in this block.
* - 0x10 * - 0x10
- \_\_be32 or \_\_be64 - __be32 or __be64
- blocks[0] - blocks[0]
- Blocks to revoke. - Blocks to revoke.
After r\_count is a linear array of block numbers that are effectively After r_count is a linear array of block numbers that are effectively
revoked by this transaction. The size of each block number is 8 bytes if revoked by this transaction. The size of each block number is 8 bytes if
the superblock advertises 64-bit block number support, or 4 bytes the superblock advertises 64-bit block number support, or 4 bytes
otherwise. otherwise.
If JBD2\_FEATURE\_INCOMPAT\_CSUM\_V2 or If JBD2_FEATURE_INCOMPAT_CSUM_V2 or
JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3 are set, the end of the revocation JBD2_FEATURE_INCOMPAT_CSUM_V3 are set, the end of the revocation
block is a ``struct jbd2_journal_revoke_tail``, which has this format: block is a ``struct jbd2_journal_revoke_tail``, which has this format:
.. list-table:: .. list-table::
@ -568,8 +568,8 @@ block is a ``struct jbd2_journal_revoke_tail``, which has this format:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_be32 - __be32
- r\_checksum - r_checksum
- Checksum of the journal UUID + revocation block - Checksum of the journal UUID + revocation block
Commit Block Commit Block
@ -592,38 +592,38 @@ bytes long (but uses a full block):
- Name - Name
- Descriptor - Descriptor
* - 0x0 * - 0x0
- journal\_header\_s - journal_header_s
- (open coded) - (open coded)
- Common block header. - Common block header.
* - 0xC * - 0xC
- unsigned char - unsigned char
- h\_chksum\_type - h_chksum_type
- The type of checksum to use to verify the integrity of the data blocks - The type of checksum to use to verify the integrity of the data blocks
in the transaction. See jbd2_checksum_type_ for more info. in the transaction. See jbd2_checksum_type_ for more info.
* - 0xD * - 0xD
- unsigned char - unsigned char
- h\_chksum\_size - h_chksum_size
- The number of bytes used by the checksum. Most likely 4. - The number of bytes used by the checksum. Most likely 4.
* - 0xE * - 0xE
- unsigned char - unsigned char
- h\_padding[2] - h_padding[2]
- -
* - 0x10 * - 0x10
- \_\_be32 - __be32
- h\_chksum[JBD2\_CHECKSUM\_BYTES] - h_chksum[JBD2_CHECKSUM_BYTES]
- 32 bytes of space to store checksums. If - 32 bytes of space to store checksums. If
JBD2\_FEATURE\_INCOMPAT\_CSUM\_V2 or JBD2\_FEATURE\_INCOMPAT\_CSUM\_V3 JBD2_FEATURE_INCOMPAT_CSUM_V2 or JBD2_FEATURE_INCOMPAT_CSUM_V3
are set, the first ``__be32`` is the checksum of the journal UUID and are set, the first ``__be32`` is the checksum of the journal UUID and
the entire commit block, with this field zeroed. If the entire commit block, with this field zeroed. If
JBD2\_FEATURE\_COMPAT\_CHECKSUM is set, the first ``__be32`` is the JBD2_FEATURE_COMPAT_CHECKSUM is set, the first ``__be32`` is the
crc32 of all the blocks already written to the transaction. crc32 of all the blocks already written to the transaction.
* - 0x30 * - 0x30
- \_\_be64 - __be64
- h\_commit\_sec - h_commit_sec
- The time that the transaction was committed, in seconds since the epoch. - The time that the transaction was committed, in seconds since the epoch.
* - 0x38 * - 0x38
- \_\_be32 - __be32
- h\_commit\_nsec - h_commit_nsec
- Nanoseconds component of the above timestamp. - Nanoseconds component of the above timestamp.
Fast commits Fast commits

View File

@ -7,8 +7,8 @@ Multiple mount protection (MMP) is a feature that protects the
filesystem against multiple hosts trying to use the filesystem filesystem against multiple hosts trying to use the filesystem
simultaneously. When a filesystem is opened (for mounting, or fsck, simultaneously. When a filesystem is opened (for mounting, or fsck,
etc.), the MMP code running on the node (call it node A) checks a etc.), the MMP code running on the node (call it node A) checks a
sequence number. If the sequence number is EXT4\_MMP\_SEQ\_CLEAN, the sequence number. If the sequence number is EXT4_MMP_SEQ_CLEAN, the
open continues. If the sequence number is EXT4\_MMP\_SEQ\_FSCK, then open continues. If the sequence number is EXT4_MMP_SEQ_FSCK, then
fsck is (hopefully) running, and open fails immediately. Otherwise, the fsck is (hopefully) running, and open fails immediately. Otherwise, the
open code will wait for twice the specified MMP check interval and check open code will wait for twice the specified MMP check interval and check
the sequence number again. If the sequence number has changed, then the the sequence number again. If the sequence number has changed, then the
@ -40,38 +40,38 @@ The MMP structure (``struct mmp_struct``) is as follows:
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- mmp\_magic - mmp_magic
- Magic number for MMP, 0x004D4D50 (“MMP”). - Magic number for MMP, 0x004D4D50 (“MMP”).
* - 0x4 * - 0x4
- \_\_le32 - __le32
- mmp\_seq - mmp_seq
- Sequence number, updated periodically. - Sequence number, updated periodically.
* - 0x8 * - 0x8
- \_\_le64 - __le64
- mmp\_time - mmp_time
- Time that the MMP block was last updated. - Time that the MMP block was last updated.
* - 0x10 * - 0x10
- char[64] - char[64]
- mmp\_nodename - mmp_nodename
- Hostname of the node that opened the filesystem. - Hostname of the node that opened the filesystem.
* - 0x50 * - 0x50
- char[32] - char[32]
- mmp\_bdevname - mmp_bdevname
- Block device name of the filesystem. - Block device name of the filesystem.
* - 0x70 * - 0x70
- \_\_le16 - __le16
- mmp\_check\_interval - mmp_check_interval
- The MMP re-check interval, in seconds. - The MMP re-check interval, in seconds.
* - 0x72 * - 0x72
- \_\_le16 - __le16
- mmp\_pad1 - mmp_pad1
- Zero. - Zero.
* - 0x74 * - 0x74
- \_\_le32[226] - __le32[226]
- mmp\_pad2 - mmp_pad2
- Zero. - Zero.
* - 0x3FC * - 0x3FC
- \_\_le32 - __le32
- mmp\_checksum - mmp_checksum
- Checksum of the MMP block. - Checksum of the MMP block.

View File

@ -7,7 +7,7 @@ An ext4 file system is split into a series of block groups. To reduce
performance difficulties due to fragmentation, the block allocator tries performance difficulties due to fragmentation, the block allocator tries
very hard to keep each file's blocks within the same group, thereby very hard to keep each file's blocks within the same group, thereby
reducing seek times. The size of a block group is specified in reducing seek times. The size of a block group is specified in
``sb.s_blocks_per_group`` blocks, though it can also calculated as 8 \* ``sb.s_blocks_per_group`` blocks, though it can also calculated as 8 *
``block_size_in_bytes``. With the default block size of 4KiB, each group ``block_size_in_bytes``. With the default block size of 4KiB, each group
will contain 32,768 blocks, for a length of 128MiB. The number of block will contain 32,768 blocks, for a length of 128MiB. The number of block
groups is the size of the device divided by the size of a block group. groups is the size of the device divided by the size of a block group.

View File

@ -34,7 +34,7 @@ ext4 reserves some inode for special features, as follows:
* - 10 * - 10
- Replica inode, used for some non-upstream feature? - Replica inode, used for some non-upstream feature?
* - 11 * - 11
- Traditional first non-reserved inode. Usually this is the lost+found directory. See s\_first\_ino in the superblock. - Traditional first non-reserved inode. Usually this is the lost+found directory. See s_first_ino in the superblock.
Note that there are also some inodes allocated from non-reserved inode numbers Note that there are also some inodes allocated from non-reserved inode numbers
for other filesystem features which are not referenced from standard directory for other filesystem features which are not referenced from standard directory
@ -47,9 +47,9 @@ hierarchy. These are generally reference from the superblock. They are:
* - Superblock field * - Superblock field
- Description - Description
* - s\_lpf\_ino * - s_lpf_ino
- Inode number of lost+found directory. - Inode number of lost+found directory.
* - s\_prj\_quota\_inum * - s_prj_quota_inum
- Inode number of quota file tracking project quotas - Inode number of quota file tracking project quotas
* - s\_orphan\_file\_inum * - s_orphan_file_inum
- Inode number of file tracking orphan inodes. - Inode number of file tracking orphan inodes.

View File

@ -7,7 +7,7 @@ The superblock records various information about the enclosing
filesystem, such as block counts, inode counts, supported features, filesystem, such as block counts, inode counts, supported features,
maintenance information, and more. maintenance information, and more.
If the sparse\_super feature flag is set, redundant copies of the If the sparse_super feature flag is set, redundant copies of the
superblock and group descriptors are kept only in the groups whose group 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, 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. redundant copies are kept in all groups.
@ -27,107 +27,107 @@ The ext4 superblock is laid out as follows in
- Name - Name
- Description - Description
* - 0x0 * - 0x0
- \_\_le32 - __le32
- s\_inodes\_count - s_inodes_count
- Total inode count. - Total inode count.
* - 0x4 * - 0x4
- \_\_le32 - __le32
- s\_blocks\_count\_lo - s_blocks_count_lo
- Total block count. - Total block count.
* - 0x8 * - 0x8
- \_\_le32 - __le32
- s\_r\_blocks\_count\_lo - s_r_blocks_count_lo
- This number of blocks can only be allocated by the super-user. - This number of blocks can only be allocated by the super-user.
* - 0xC * - 0xC
- \_\_le32 - __le32
- s\_free\_blocks\_count\_lo - s_free_blocks_count_lo
- Free block count. - Free block count.
* - 0x10 * - 0x10
- \_\_le32 - __le32
- s\_free\_inodes\_count - s_free_inodes_count
- Free inode count. - Free inode count.
* - 0x14 * - 0x14
- \_\_le32 - __le32
- s\_first\_data\_block - s_first_data_block
- First data block. This must be at least 1 for 1k-block filesystems and - First data block. This must be at least 1 for 1k-block filesystems and
is typically 0 for all other block sizes. is typically 0 for all other block sizes.
* - 0x18 * - 0x18
- \_\_le32 - __le32
- s\_log\_block\_size - s_log_block_size
- Block size is 2 ^ (10 + s\_log\_block\_size). - Block size is 2 ^ (10 + s_log_block_size).
* - 0x1C * - 0x1C
- \_\_le32 - __le32
- s\_log\_cluster\_size - s_log_cluster_size
- Cluster size is 2 ^ (10 + s\_log\_cluster\_size) blocks if bigalloc is - 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. enabled. Otherwise s_log_cluster_size must equal s_log_block_size.
* - 0x20 * - 0x20
- \_\_le32 - __le32
- s\_blocks\_per\_group - s_blocks_per_group
- Blocks per group. - Blocks per group.
* - 0x24 * - 0x24
- \_\_le32 - __le32
- s\_clusters\_per\_group - s_clusters_per_group
- Clusters per group, if bigalloc is enabled. Otherwise - Clusters per group, if bigalloc is enabled. Otherwise
s\_clusters\_per\_group must equal s\_blocks\_per\_group. s_clusters_per_group must equal s_blocks_per_group.
* - 0x28 * - 0x28
- \_\_le32 - __le32
- s\_inodes\_per\_group - s_inodes_per_group
- Inodes per group. - Inodes per group.
* - 0x2C * - 0x2C
- \_\_le32 - __le32
- s\_mtime - s_mtime
- Mount time, in seconds since the epoch. - Mount time, in seconds since the epoch.
* - 0x30 * - 0x30
- \_\_le32 - __le32
- s\_wtime - s_wtime
- Write time, in seconds since the epoch. - Write time, in seconds since the epoch.
* - 0x34 * - 0x34
- \_\_le16 - __le16
- s\_mnt\_count - s_mnt_count
- Number of mounts since the last fsck. - Number of mounts since the last fsck.
* - 0x36 * - 0x36
- \_\_le16 - __le16
- s\_max\_mnt\_count - s_max_mnt_count
- Number of mounts beyond which a fsck is needed. - Number of mounts beyond which a fsck is needed.
* - 0x38 * - 0x38
- \_\_le16 - __le16
- s\_magic - s_magic
- Magic signature, 0xEF53 - Magic signature, 0xEF53
* - 0x3A * - 0x3A
- \_\_le16 - __le16
- s\_state - s_state
- File system state. See super_state_ for more info. - File system state. See super_state_ for more info.
* - 0x3C * - 0x3C
- \_\_le16 - __le16
- s\_errors - s_errors
- Behaviour when detecting errors. See super_errors_ for more info. - Behaviour when detecting errors. See super_errors_ for more info.
* - 0x3E * - 0x3E
- \_\_le16 - __le16
- s\_minor\_rev\_level - s_minor_rev_level
- Minor revision level. - Minor revision level.
* - 0x40 * - 0x40
- \_\_le32 - __le32
- s\_lastcheck - s_lastcheck
- Time of last check, in seconds since the epoch. - Time of last check, in seconds since the epoch.
* - 0x44 * - 0x44
- \_\_le32 - __le32
- s\_checkinterval - s_checkinterval
- Maximum time between checks, in seconds. - Maximum time between checks, in seconds.
* - 0x48 * - 0x48
- \_\_le32 - __le32
- s\_creator\_os - s_creator_os
- Creator OS. See the table super_creator_ for more info. - Creator OS. See the table super_creator_ for more info.
* - 0x4C * - 0x4C
- \_\_le32 - __le32
- s\_rev\_level - s_rev_level
- Revision level. See the table super_revision_ for more info. - Revision level. See the table super_revision_ for more info.
* - 0x50 * - 0x50
- \_\_le16 - __le16
- s\_def\_resuid - s_def_resuid
- Default uid for reserved blocks. - Default uid for reserved blocks.
* - 0x52 * - 0x52
- \_\_le16 - __le16
- s\_def\_resgid - s_def_resgid
- Default gid for reserved blocks. - Default gid for reserved blocks.
* - * -
- -
@ -143,50 +143,50 @@ The ext4 superblock is laid out as follows in
about a feature in either the compatible or incompatible feature set, it 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... must abort and not try to meddle with things it doesn't understand...
* - 0x54 * - 0x54
- \_\_le32 - __le32
- s\_first\_ino - s_first_ino
- First non-reserved inode. - First non-reserved inode.
* - 0x58 * - 0x58
- \_\_le16 - __le16
- s\_inode\_size - s_inode_size
- Size of inode structure, in bytes. - Size of inode structure, in bytes.
* - 0x5A * - 0x5A
- \_\_le16 - __le16
- s\_block\_group\_nr - s_block_group_nr
- Block group # of this superblock. - Block group # of this superblock.
* - 0x5C * - 0x5C
- \_\_le32 - __le32
- s\_feature\_compat - s_feature_compat
- Compatible feature set flags. Kernel can still read/write this fs even - 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 if it doesn't understand a flag; fsck should not do that. See the
super_compat_ table for more info. super_compat_ table for more info.
* - 0x60 * - 0x60
- \_\_le32 - __le32
- s\_feature\_incompat - s_feature_incompat
- Incompatible feature set. If the kernel or fsck doesn't understand one - 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 of these bits, it should stop. See the super_incompat_ table for more
info. info.
* - 0x64 * - 0x64
- \_\_le32 - __le32
- s\_feature\_ro\_compat - s_feature_ro_compat
- Readonly-compatible feature set. If the kernel doesn't understand one of - 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 these bits, it can still mount read-only. See the super_rocompat_ table
for more info. for more info.
* - 0x68 * - 0x68
- \_\_u8 - __u8
- s\_uuid[16] - s_uuid[16]
- 128-bit UUID for volume. - 128-bit UUID for volume.
* - 0x78 * - 0x78
- char - char
- s\_volume\_name[16] - s_volume_name[16]
- Volume label. - Volume label.
* - 0x88 * - 0x88
- char - char
- s\_last\_mounted[64] - s_last_mounted[64]
- Directory where filesystem was last mounted. - Directory where filesystem was last mounted.
* - 0xC8 * - 0xC8
- \_\_le32 - __le32
- s\_algorithm\_usage\_bitmap - s_algorithm_usage_bitmap
- For compression (Not used in e2fsprogs/Linux) - For compression (Not used in e2fsprogs/Linux)
* - * -
- -
@ -194,18 +194,18 @@ The ext4 superblock is laid out as follows in
- Performance hints. Directory preallocation should only happen if the - Performance hints. Directory preallocation should only happen if the
EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on. EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on.
* - 0xCC * - 0xCC
- \_\_u8 - __u8
- s\_prealloc\_blocks - s_prealloc_blocks
- #. of blocks to try to preallocate for ... files? (Not used in - #. of blocks to try to preallocate for ... files? (Not used in
e2fsprogs/Linux) e2fsprogs/Linux)
* - 0xCD * - 0xCD
- \_\_u8 - __u8
- s\_prealloc\_dir\_blocks - s_prealloc_dir_blocks
- #. of blocks to preallocate for directories. (Not used in - #. of blocks to preallocate for directories. (Not used in
e2fsprogs/Linux) e2fsprogs/Linux)
* - 0xCE * - 0xCE
- \_\_le16 - __le16
- s\_reserved\_gdt\_blocks - s_reserved_gdt_blocks
- Number of reserved GDT entries for future filesystem expansion. - Number of reserved GDT entries for future filesystem expansion.
* - * -
- -
@ -213,281 +213,281 @@ The ext4 superblock is laid out as follows in
- Journalling support is valid only if EXT4_FEATURE_COMPAT_HAS_JOURNAL is - Journalling support is valid only if EXT4_FEATURE_COMPAT_HAS_JOURNAL is
set. set.
* - 0xD0 * - 0xD0
- \_\_u8 - __u8
- s\_journal\_uuid[16] - s_journal_uuid[16]
- UUID of journal superblock - UUID of journal superblock
* - 0xE0 * - 0xE0
- \_\_le32 - __le32
- s\_journal\_inum - s_journal_inum
- inode number of journal file. - inode number of journal file.
* - 0xE4 * - 0xE4
- \_\_le32 - __le32
- s\_journal\_dev - s_journal_dev
- Device number of journal file, if the external journal feature flag is - Device number of journal file, if the external journal feature flag is
set. set.
* - 0xE8 * - 0xE8
- \_\_le32 - __le32
- s\_last\_orphan - s_last_orphan
- Start of list of orphaned inodes to delete. - Start of list of orphaned inodes to delete.
* - 0xEC * - 0xEC
- \_\_le32 - __le32
- s\_hash\_seed[4] - s_hash_seed[4]
- HTREE hash seed. - HTREE hash seed.
* - 0xFC * - 0xFC
- \_\_u8 - __u8
- s\_def\_hash\_version - s_def_hash_version
- Default hash algorithm to use for directory hashes. See super_def_hash_ - Default hash algorithm to use for directory hashes. See super_def_hash_
for more info. for more info.
* - 0xFD * - 0xFD
- \_\_u8 - __u8
- s\_jnl\_backup\_type - s_jnl_backup_type
- If this value is 0 or EXT3\_JNL\_BACKUP\_BLOCKS (1), then the - 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 ``s_jnl_blocks`` field contains a duplicate copy of the inode's
``i_block[]`` array and ``i_size``. ``i_block[]`` array and ``i_size``.
* - 0xFE * - 0xFE
- \_\_le16 - __le16
- s\_desc\_size - s_desc_size
- Size of group descriptors, in bytes, if the 64bit incompat feature flag - Size of group descriptors, in bytes, if the 64bit incompat feature flag
is set. is set.
* - 0x100 * - 0x100
- \_\_le32 - __le32
- s\_default\_mount\_opts - s_default_mount_opts
- Default mount options. See the super_mountopts_ table for more info. - Default mount options. See the super_mountopts_ table for more info.
* - 0x104 * - 0x104
- \_\_le32 - __le32
- s\_first\_meta\_bg - s_first_meta_bg
- First metablock block group, if the meta\_bg feature is enabled. - First metablock block group, if the meta_bg feature is enabled.
* - 0x108 * - 0x108
- \_\_le32 - __le32
- s\_mkfs\_time - s_mkfs_time
- When the filesystem was created, in seconds since the epoch. - When the filesystem was created, in seconds since the epoch.
* - 0x10C * - 0x10C
- \_\_le32 - __le32
- s\_jnl\_blocks[17] - s_jnl_blocks[17]
- Backup copy of the journal inode's ``i_block[]`` array in the first 15 - 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, elements and i_size_high and i_size in the 16th and 17th elements,
respectively. respectively.
* - * -
- -
- -
- 64bit support is valid only if EXT4_FEATURE_COMPAT_64BIT is set. - 64bit support is valid only if EXT4_FEATURE_COMPAT_64BIT is set.
* - 0x150 * - 0x150
- \_\_le32 - __le32
- s\_blocks\_count\_hi - s_blocks_count_hi
- High 32-bits of the block count. - High 32-bits of the block count.
* - 0x154 * - 0x154
- \_\_le32 - __le32
- s\_r\_blocks\_count\_hi - s_r_blocks_count_hi
- High 32-bits of the reserved block count. - High 32-bits of the reserved block count.
* - 0x158 * - 0x158
- \_\_le32 - __le32
- s\_free\_blocks\_count\_hi - s_free_blocks_count_hi
- High 32-bits of the free block count. - High 32-bits of the free block count.
* - 0x15C * - 0x15C
- \_\_le16 - __le16
- s\_min\_extra\_isize - s_min_extra_isize
- All inodes have at least # bytes. - All inodes have at least # bytes.
* - 0x15E * - 0x15E
- \_\_le16 - __le16
- s\_want\_extra\_isize - s_want_extra_isize
- New inodes should reserve # bytes. - New inodes should reserve # bytes.
* - 0x160 * - 0x160
- \_\_le32 - __le32
- s\_flags - s_flags
- Miscellaneous flags. See the super_flags_ table for more info. - Miscellaneous flags. See the super_flags_ table for more info.
* - 0x164 * - 0x164
- \_\_le16 - __le16
- s\_raid\_stride - s_raid_stride
- RAID stride. This is the number of logical blocks read from or written - 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 to the disk before moving to the next disk. This affects the placement
of filesystem metadata, which will hopefully make RAID storage faster. of filesystem metadata, which will hopefully make RAID storage faster.
* - 0x166 * - 0x166
- \_\_le16 - __le16
- s\_mmp\_interval - s_mmp_interval
- #. seconds to wait in multi-mount prevention (MMP) checking. In theory, - #. seconds to wait in multi-mount prevention (MMP) checking. In theory,
MMP is a mechanism to record in the superblock which host and device MMP is a mechanism to record in the superblock which host and device
have mounted the filesystem, in order to prevent multiple mounts. This have mounted the filesystem, in order to prevent multiple mounts. This
feature does not seem to be implemented... feature does not seem to be implemented...
* - 0x168 * - 0x168
- \_\_le64 - __le64
- s\_mmp\_block - s_mmp_block
- Block # for multi-mount protection data. - Block # for multi-mount protection data.
* - 0x170 * - 0x170
- \_\_le32 - __le32
- s\_raid\_stripe\_width - s_raid_stripe_width
- RAID stripe width. This is the number of logical blocks read from or - 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 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 by the block allocator to try to reduce the number of read-modify-write
operations in a RAID5/6. operations in a RAID5/6.
* - 0x174 * - 0x174
- \_\_u8 - __u8
- s\_log\_groups\_per\_flex - s_log_groups_per_flex
- Size of a flexible block group is 2 ^ ``s_log_groups_per_flex``. - Size of a flexible block group is 2 ^ ``s_log_groups_per_flex``.
* - 0x175 * - 0x175
- \_\_u8 - __u8
- s\_checksum\_type - s_checksum_type
- Metadata checksum algorithm type. The only valid value is 1 (crc32c). - Metadata checksum algorithm type. The only valid value is 1 (crc32c).
* - 0x176 * - 0x176
- \_\_le16 - __le16
- s\_reserved\_pad - s_reserved_pad
- -
* - 0x178 * - 0x178
- \_\_le64 - __le64
- s\_kbytes\_written - s_kbytes_written
- Number of KiB written to this filesystem over its lifetime. - Number of KiB written to this filesystem over its lifetime.
* - 0x180 * - 0x180
- \_\_le32 - __le32
- s\_snapshot\_inum - s_snapshot_inum
- inode number of active snapshot. (Not used in e2fsprogs/Linux.) - inode number of active snapshot. (Not used in e2fsprogs/Linux.)
* - 0x184 * - 0x184
- \_\_le32 - __le32
- s\_snapshot\_id - s_snapshot_id
- Sequential ID of active snapshot. (Not used in e2fsprogs/Linux.) - Sequential ID of active snapshot. (Not used in e2fsprogs/Linux.)
* - 0x188 * - 0x188
- \_\_le64 - __le64
- s\_snapshot\_r\_blocks\_count - s_snapshot_r_blocks_count
- Number of blocks reserved for active snapshot's future use. (Not used in - Number of blocks reserved for active snapshot's future use. (Not used in
e2fsprogs/Linux.) e2fsprogs/Linux.)
* - 0x190 * - 0x190
- \_\_le32 - __le32
- s\_snapshot\_list - s_snapshot_list
- inode number of the head of the on-disk snapshot list. (Not used in - inode number of the head of the on-disk snapshot list. (Not used in
e2fsprogs/Linux.) e2fsprogs/Linux.)
* - 0x194 * - 0x194
- \_\_le32 - __le32
- s\_error\_count - s_error_count
- Number of errors seen. - Number of errors seen.
* - 0x198 * - 0x198
- \_\_le32 - __le32
- s\_first\_error\_time - s_first_error_time
- First time an error happened, in seconds since the epoch. - First time an error happened, in seconds since the epoch.
* - 0x19C * - 0x19C
- \_\_le32 - __le32
- s\_first\_error\_ino - s_first_error_ino
- inode involved in first error. - inode involved in first error.
* - 0x1A0 * - 0x1A0
- \_\_le64 - __le64
- s\_first\_error\_block - s_first_error_block
- Number of block involved of first error. - Number of block involved of first error.
* - 0x1A8 * - 0x1A8
- \_\_u8 - __u8
- s\_first\_error\_func[32] - s_first_error_func[32]
- Name of function where the error happened. - Name of function where the error happened.
* - 0x1C8 * - 0x1C8
- \_\_le32 - __le32
- s\_first\_error\_line - s_first_error_line
- Line number where error happened. - Line number where error happened.
* - 0x1CC * - 0x1CC
- \_\_le32 - __le32
- s\_last\_error\_time - s_last_error_time
- Time of most recent error, in seconds since the epoch. - Time of most recent error, in seconds since the epoch.
* - 0x1D0 * - 0x1D0
- \_\_le32 - __le32
- s\_last\_error\_ino - s_last_error_ino
- inode involved in most recent error. - inode involved in most recent error.
* - 0x1D4 * - 0x1D4
- \_\_le32 - __le32
- s\_last\_error\_line - s_last_error_line
- Line number where most recent error happened. - Line number where most recent error happened.
* - 0x1D8 * - 0x1D8
- \_\_le64 - __le64
- s\_last\_error\_block - s_last_error_block
- Number of block involved in most recent error. - Number of block involved in most recent error.
* - 0x1E0 * - 0x1E0
- \_\_u8 - __u8
- s\_last\_error\_func[32] - s_last_error_func[32]
- Name of function where the most recent error happened. - Name of function where the most recent error happened.
* - 0x200 * - 0x200
- \_\_u8 - __u8
- s\_mount\_opts[64] - s_mount_opts[64]
- ASCIIZ string of mount options. - ASCIIZ string of mount options.
* - 0x240 * - 0x240
- \_\_le32 - __le32
- s\_usr\_quota\_inum - s_usr_quota_inum
- Inode number of user `quota <quota>`__ file. - Inode number of user `quota <quota>`__ file.
* - 0x244 * - 0x244
- \_\_le32 - __le32
- s\_grp\_quota\_inum - s_grp_quota_inum
- Inode number of group `quota <quota>`__ file. - Inode number of group `quota <quota>`__ file.
* - 0x248 * - 0x248
- \_\_le32 - __le32
- s\_overhead\_blocks - s_overhead_blocks
- Overhead blocks/clusters in fs. (Huh? This field is always zero, which - Overhead blocks/clusters in fs. (Huh? This field is always zero, which
means that the kernel calculates it dynamically.) means that the kernel calculates it dynamically.)
* - 0x24C * - 0x24C
- \_\_le32 - __le32
- s\_backup\_bgs[2] - s_backup_bgs[2]
- Block groups containing superblock backups (if sparse\_super2) - Block groups containing superblock backups (if sparse_super2)
* - 0x254 * - 0x254
- \_\_u8 - __u8
- s\_encrypt\_algos[4] - s_encrypt_algos[4]
- Encryption algorithms in use. There can be up to four algorithms in use - 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 at any time; valid algorithm codes are given in the super_encrypt_ table
below. below.
* - 0x258 * - 0x258
- \_\_u8 - __u8
- s\_encrypt\_pw\_salt[16] - s_encrypt_pw_salt[16]
- Salt for the string2key algorithm for encryption. - Salt for the string2key algorithm for encryption.
* - 0x268 * - 0x268
- \_\_le32 - __le32
- s\_lpf\_ino - s_lpf_ino
- Inode number of lost+found - Inode number of lost+found
* - 0x26C * - 0x26C
- \_\_le32 - __le32
- s\_prj\_quota\_inum - s_prj_quota_inum
- Inode that tracks project quotas. - Inode that tracks project quotas.
* - 0x270 * - 0x270
- \_\_le32 - __le32
- s\_checksum\_seed - s_checksum_seed
- Checksum seed used for metadata\_csum calculations. This value is - Checksum seed used for metadata_csum calculations. This value is
crc32c(~0, $orig\_fs\_uuid). crc32c(~0, $orig_fs_uuid).
* - 0x274 * - 0x274
- \_\_u8 - __u8
- s\_wtime_hi - s_wtime_hi
- Upper 8 bits of the s_wtime field. - Upper 8 bits of the s_wtime field.
* - 0x275 * - 0x275
- \_\_u8 - __u8
- s\_mtime_hi - s_mtime_hi
- Upper 8 bits of the s_mtime field. - Upper 8 bits of the s_mtime field.
* - 0x276 * - 0x276
- \_\_u8 - __u8
- s\_mkfs_time_hi - s_mkfs_time_hi
- Upper 8 bits of the s_mkfs_time field. - Upper 8 bits of the s_mkfs_time field.
* - 0x277 * - 0x277
- \_\_u8 - __u8
- s\_lastcheck_hi - s_lastcheck_hi
- Upper 8 bits of the s_lastcheck_hi field. - Upper 8 bits of the s_lastcheck_hi field.
* - 0x278 * - 0x278
- \_\_u8 - __u8
- s\_first_error_time_hi - s_first_error_time_hi
- Upper 8 bits of the s_first_error_time_hi field. - Upper 8 bits of the s_first_error_time_hi field.
* - 0x279 * - 0x279
- \_\_u8 - __u8
- s\_last_error_time_hi - s_last_error_time_hi
- Upper 8 bits of the s_last_error_time_hi field. - Upper 8 bits of the s_last_error_time_hi field.
* - 0x27A * - 0x27A
- \_\_u8 - __u8
- s\_pad[2] - s_pad[2]
- Zero padding. - Zero padding.
* - 0x27C * - 0x27C
- \_\_le16 - __le16
- s\_encoding - s_encoding
- Filename charset encoding. - Filename charset encoding.
* - 0x27E * - 0x27E
- \_\_le16 - __le16
- s\_encoding_flags - s_encoding_flags
- Filename charset encoding flags. - Filename charset encoding flags.
* - 0x280 * - 0x280
- \_\_le32 - __le32
- s\_orphan\_file\_inum - s_orphan_file_inum
- Orphan file inode number. - Orphan file inode number.
* - 0x284 * - 0x284
- \_\_le32 - __le32
- s\_reserved[94] - s_reserved[94]
- Padding to the end of the block. - Padding to the end of the block.
* - 0x3FC * - 0x3FC
- \_\_le32 - __le32
- s\_checksum - s_checksum
- Superblock checksum. - Superblock checksum.
.. _super_state: .. _super_state:
@ -574,44 +574,44 @@ following:
* - Value * - Value
- Description - Description
* - 0x1 * - 0x1
- Directory preallocation (COMPAT\_DIR\_PREALLOC). - Directory preallocation (COMPAT_DIR_PREALLOC).
* - 0x2 * - 0x2
- “imagic inodes”. Not clear from the code what this does - “imagic inodes”. Not clear from the code what this does
(COMPAT\_IMAGIC\_INODES). (COMPAT_IMAGIC_INODES).
* - 0x4 * - 0x4
- Has a journal (COMPAT\_HAS\_JOURNAL). - Has a journal (COMPAT_HAS_JOURNAL).
* - 0x8 * - 0x8
- Supports extended attributes (COMPAT\_EXT\_ATTR). - Supports extended attributes (COMPAT_EXT_ATTR).
* - 0x10 * - 0x10
- Has reserved GDT blocks for filesystem expansion - Has reserved GDT blocks for filesystem expansion
(COMPAT\_RESIZE\_INODE). Requires RO\_COMPAT\_SPARSE\_SUPER. (COMPAT_RESIZE_INODE). Requires RO_COMPAT_SPARSE_SUPER.
* - 0x20 * - 0x20
- Has directory indices (COMPAT\_DIR\_INDEX). - Has directory indices (COMPAT_DIR_INDEX).
* - 0x40 * - 0x40
- “Lazy BG”. Not in Linux kernel, seems to have been for uninitialized - “Lazy BG”. Not in Linux kernel, seems to have been for uninitialized
block groups? (COMPAT\_LAZY\_BG) block groups? (COMPAT_LAZY_BG)
* - 0x80 * - 0x80
- “Exclude inode”. Not used. (COMPAT\_EXCLUDE\_INODE). - “Exclude inode”. Not used. (COMPAT_EXCLUDE_INODE).
* - 0x100 * - 0x100
- “Exclude bitmap”. Seems to be used to indicate the presence of - “Exclude bitmap”. Seems to be used to indicate the presence of
snapshot-related exclude bitmaps? Not defined in kernel or used in snapshot-related exclude bitmaps? Not defined in kernel or used in
e2fsprogs (COMPAT\_EXCLUDE\_BITMAP). e2fsprogs (COMPAT_EXCLUDE_BITMAP).
* - 0x200 * - 0x200
- Sparse Super Block, v2. If this flag is set, the SB field s\_backup\_bgs - 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 points to the two block groups that contain backup superblocks
(COMPAT\_SPARSE\_SUPER2). (COMPAT_SPARSE_SUPER2).
* - 0x400 * - 0x400
- Fast commits supported. Although fast commits blocks are - Fast commits supported. Although fast commits blocks are
backward incompatible, fast commit blocks are not always backward incompatible, fast commit blocks are not always
present in the journal. If fast commit blocks are present in present in the journal. If fast commit blocks are present in
the journal, JBD2 incompat feature the journal, JBD2 incompat feature
(JBD2\_FEATURE\_INCOMPAT\_FAST\_COMMIT) gets (JBD2_FEATURE_INCOMPAT_FAST_COMMIT) gets
set (COMPAT\_FAST\_COMMIT). set (COMPAT_FAST_COMMIT).
* - 0x1000 * - 0x1000
- Orphan file allocated. This is the special file for more efficient - Orphan file allocated. This is the special file for more efficient
tracking of unlinked but still open inodes. When there may be any tracking of unlinked but still open inodes. When there may be any
entries in the file, we additionally set proper rocompat feature entries in the file, we additionally set proper rocompat feature
(RO\_COMPAT\_ORPHAN\_PRESENT). (RO_COMPAT_ORPHAN_PRESENT).
.. _super_incompat: .. _super_incompat:
@ -625,45 +625,45 @@ following:
* - Value * - Value
- Description - Description
* - 0x1 * - 0x1
- Compression (INCOMPAT\_COMPRESSION). - Compression (INCOMPAT_COMPRESSION).
* - 0x2 * - 0x2
- Directory entries record the file type. See ext4\_dir\_entry\_2 below - Directory entries record the file type. See ext4_dir_entry_2 below
(INCOMPAT\_FILETYPE). (INCOMPAT_FILETYPE).
* - 0x4 * - 0x4
- Filesystem needs recovery (INCOMPAT\_RECOVER). - Filesystem needs recovery (INCOMPAT_RECOVER).
* - 0x8 * - 0x8
- Filesystem has a separate journal device (INCOMPAT\_JOURNAL\_DEV). - Filesystem has a separate journal device (INCOMPAT_JOURNAL_DEV).
* - 0x10 * - 0x10
- Meta block groups. See the earlier discussion of this feature - Meta block groups. See the earlier discussion of this feature
(INCOMPAT\_META\_BG). (INCOMPAT_META_BG).
* - 0x40 * - 0x40
- Files in this filesystem use extents (INCOMPAT\_EXTENTS). - Files in this filesystem use extents (INCOMPAT_EXTENTS).
* - 0x80 * - 0x80
- Enable a filesystem size of 2^64 blocks (INCOMPAT\_64BIT). - Enable a filesystem size of 2^64 blocks (INCOMPAT_64BIT).
* - 0x100 * - 0x100
- Multiple mount protection (INCOMPAT\_MMP). - Multiple mount protection (INCOMPAT_MMP).
* - 0x200 * - 0x200
- Flexible block groups. See the earlier discussion of this feature - Flexible block groups. See the earlier discussion of this feature
(INCOMPAT\_FLEX\_BG). (INCOMPAT_FLEX_BG).
* - 0x400 * - 0x400
- Inodes can be used to store large extended attribute values - Inodes can be used to store large extended attribute values
(INCOMPAT\_EA\_INODE). (INCOMPAT_EA_INODE).
* - 0x1000 * - 0x1000
- Data in directory entry (INCOMPAT\_DIRDATA). (Not implemented?) - Data in directory entry (INCOMPAT_DIRDATA). (Not implemented?)
* - 0x2000 * - 0x2000
- Metadata checksum seed is stored in the superblock. This feature enables - Metadata checksum seed is stored in the superblock. This feature enables
the administrator to change the UUID of a metadata\_csum filesystem the administrator to change the UUID of a metadata_csum filesystem
while the filesystem is mounted; without it, the checksum definition while the filesystem is mounted; without it, the checksum definition
requires all metadata blocks to be rewritten (INCOMPAT\_CSUM\_SEED). requires all metadata blocks to be rewritten (INCOMPAT_CSUM_SEED).
* - 0x4000 * - 0x4000
- Large directory >2GB or 3-level htree (INCOMPAT\_LARGEDIR). Prior to - Large directory >2GB or 3-level htree (INCOMPAT_LARGEDIR). Prior to
this feature, directories could not be larger than 4GiB and could not 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, 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. directories can be larger than 4GiB and have a maximum htree depth of 3.
* - 0x8000 * - 0x8000
- Data in inode (INCOMPAT\_INLINE\_DATA). - Data in inode (INCOMPAT_INLINE_DATA).
* - 0x10000 * - 0x10000
- Encrypted inodes are present on the filesystem. (INCOMPAT\_ENCRYPT). - Encrypted inodes are present on the filesystem. (INCOMPAT_ENCRYPT).
.. _super_rocompat: .. _super_rocompat:
@ -678,54 +678,54 @@ the following:
- Description - Description
* - 0x1 * - 0x1
- Sparse superblocks. See the earlier discussion of this feature - Sparse superblocks. See the earlier discussion of this feature
(RO\_COMPAT\_SPARSE\_SUPER). (RO_COMPAT_SPARSE_SUPER).
* - 0x2 * - 0x2
- This filesystem has been used to store a file greater than 2GiB - This filesystem has been used to store a file greater than 2GiB
(RO\_COMPAT\_LARGE\_FILE). (RO_COMPAT_LARGE_FILE).
* - 0x4 * - 0x4
- Not used in kernel or e2fsprogs (RO\_COMPAT\_BTREE\_DIR). - Not used in kernel or e2fsprogs (RO_COMPAT_BTREE_DIR).
* - 0x8 * - 0x8
- This filesystem has files whose sizes are represented in units of - This filesystem has files whose sizes are represented in units of
logical blocks, not 512-byte sectors. This implies a very large file logical blocks, not 512-byte sectors. This implies a very large file
indeed! (RO\_COMPAT\_HUGE\_FILE) indeed! (RO_COMPAT_HUGE_FILE)
* - 0x10 * - 0x10
- Group descriptors have checksums. In addition to detecting corruption, - Group descriptors have checksums. In addition to detecting corruption,
this is useful for lazy formatting with uninitialized groups this is useful for lazy formatting with uninitialized groups
(RO\_COMPAT\_GDT\_CSUM). (RO_COMPAT_GDT_CSUM).
* - 0x20 * - 0x20
- Indicates that the old ext3 32,000 subdirectory limit no longer applies - 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 (RO_COMPAT_DIR_NLINK). A directory's i_links_count will be set to 1
if it is incremented past 64,999. if it is incremented past 64,999.
* - 0x40 * - 0x40
- Indicates that large inodes exist on this filesystem - Indicates that large inodes exist on this filesystem
(RO\_COMPAT\_EXTRA\_ISIZE). (RO_COMPAT_EXTRA_ISIZE).
* - 0x80 * - 0x80
- This filesystem has a snapshot (RO\_COMPAT\_HAS\_SNAPSHOT). - This filesystem has a snapshot (RO_COMPAT_HAS_SNAPSHOT).
* - 0x100 * - 0x100
- `Quota <Quota>`__ (RO\_COMPAT\_QUOTA). - `Quota <Quota>`__ (RO_COMPAT_QUOTA).
* - 0x200 * - 0x200
- This filesystem supports “bigalloc”, which means that file extents are - This filesystem supports “bigalloc”, which means that file extents are
tracked in units of clusters (of blocks) instead of blocks tracked in units of clusters (of blocks) instead of blocks
(RO\_COMPAT\_BIGALLOC). (RO_COMPAT_BIGALLOC).
* - 0x400 * - 0x400
- This filesystem supports metadata checksumming. - This filesystem supports metadata checksumming.
(RO\_COMPAT\_METADATA\_CSUM; implies RO\_COMPAT\_GDT\_CSUM, though (RO_COMPAT_METADATA_CSUM; implies RO_COMPAT_GDT_CSUM, though
GDT\_CSUM must not be set) GDT_CSUM must not be set)
* - 0x800 * - 0x800
- Filesystem supports replicas. This feature is neither in the kernel nor - Filesystem supports replicas. This feature is neither in the kernel nor
e2fsprogs. (RO\_COMPAT\_REPLICA) e2fsprogs. (RO_COMPAT_REPLICA)
* - 0x1000 * - 0x1000
- Read-only filesystem image; the kernel will not mount this image - Read-only filesystem image; the kernel will not mount this image
read-write and most tools will refuse to write to the image. read-write and most tools will refuse to write to the image.
(RO\_COMPAT\_READONLY) (RO_COMPAT_READONLY)
* - 0x2000 * - 0x2000
- Filesystem tracks project quotas. (RO\_COMPAT\_PROJECT) - Filesystem tracks project quotas. (RO_COMPAT_PROJECT)
* - 0x8000 * - 0x8000
- Verity inodes may be present on the filesystem. (RO\_COMPAT\_VERITY) - Verity inodes may be present on the filesystem. (RO_COMPAT_VERITY)
* - 0x10000 * - 0x10000
- Indicates orphan file may have valid orphan entries and thus we need - Indicates orphan file may have valid orphan entries and thus we need
to clean them up when mounting the filesystem to clean them up when mounting the filesystem
(RO\_COMPAT\_ORPHAN\_PRESENT). (RO_COMPAT_ORPHAN_PRESENT).
.. _super_def_hash: .. _super_def_hash:
@ -761,36 +761,36 @@ The ``s_default_mount_opts`` field is any combination of the following:
* - Value * - Value
- Description - Description
* - 0x0001 * - 0x0001
- Print debugging info upon (re)mount. (EXT4\_DEFM\_DEBUG) - Print debugging info upon (re)mount. (EXT4_DEFM_DEBUG)
* - 0x0002 * - 0x0002
- New files take the gid of the containing directory (instead of the fsgid - New files take the gid of the containing directory (instead of the fsgid
of the current process). (EXT4\_DEFM\_BSDGROUPS) of the current process). (EXT4_DEFM_BSDGROUPS)
* - 0x0004 * - 0x0004
- Support userspace-provided extended attributes. (EXT4\_DEFM\_XATTR\_USER) - Support userspace-provided extended attributes. (EXT4_DEFM_XATTR_USER)
* - 0x0008 * - 0x0008
- Support POSIX access control lists (ACLs). (EXT4\_DEFM\_ACL) - Support POSIX access control lists (ACLs). (EXT4_DEFM_ACL)
* - 0x0010 * - 0x0010
- Do not support 32-bit UIDs. (EXT4\_DEFM\_UID16) - Do not support 32-bit UIDs. (EXT4_DEFM_UID16)
* - 0x0020 * - 0x0020
- All data and metadata are commited to the journal. - All data and metadata are commited to the journal.
(EXT4\_DEFM\_JMODE\_DATA) (EXT4_DEFM_JMODE_DATA)
* - 0x0040 * - 0x0040
- All data are flushed to the disk before metadata are committed to the - All data are flushed to the disk before metadata are committed to the
journal. (EXT4\_DEFM\_JMODE\_ORDERED) journal. (EXT4_DEFM_JMODE_ORDERED)
* - 0x0060 * - 0x0060
- Data ordering is not preserved; data may be written after the metadata - Data ordering is not preserved; data may be written after the metadata
has been written. (EXT4\_DEFM\_JMODE\_WBACK) has been written. (EXT4_DEFM_JMODE_WBACK)
* - 0x0100 * - 0x0100
- Disable write flushes. (EXT4\_DEFM\_NOBARRIER) - Disable write flushes. (EXT4_DEFM_NOBARRIER)
* - 0x0200 * - 0x0200
- Track which blocks in a filesystem are metadata and therefore should not - 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, be used as data blocks. This option will be enabled by default on 3.18,
hopefully. (EXT4\_DEFM\_BLOCK\_VALIDITY) hopefully. (EXT4_DEFM_BLOCK_VALIDITY)
* - 0x0400 * - 0x0400
- Enable DISCARD support, where the storage device is told about blocks - Enable DISCARD support, where the storage device is told about blocks
becoming unused. (EXT4\_DEFM\_DISCARD) becoming unused. (EXT4_DEFM_DISCARD)
* - 0x0800 * - 0x0800
- Disable delayed allocation. (EXT4\_DEFM\_NODELALLOC) - Disable delayed allocation. (EXT4_DEFM_NODELALLOC)
.. _super_flags: .. _super_flags:
@ -820,12 +820,12 @@ The ``s_encrypt_algos`` list can contain any of the following:
* - Value * - Value
- Description - Description
* - 0 * - 0
- Invalid algorithm (ENCRYPTION\_MODE\_INVALID). - Invalid algorithm (ENCRYPTION_MODE_INVALID).
* - 1 * - 1
- 256-bit AES in XTS mode (ENCRYPTION\_MODE\_AES\_256\_XTS). - 256-bit AES in XTS mode (ENCRYPTION_MODE_AES_256_XTS).
* - 2 * - 2
- 256-bit AES in GCM mode (ENCRYPTION\_MODE\_AES\_256\_GCM). - 256-bit AES in GCM mode (ENCRYPTION_MODE_AES_256_GCM).
* - 3 * - 3
- 256-bit AES in CBC mode (ENCRYPTION\_MODE\_AES\_256\_CBC). - 256-bit AES in CBC mode (ENCRYPTION_MODE_AES_256_CBC).
Total size of the superblock is 1024 bytes. Total size of the superblock is 1024 bytes.