| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- .. SPDX-License-Identifier: GPL-2.0
- The Contents of inode.i\_block
- ------------------------------
- Depending on the type of file an inode describes, the 60 bytes of
- storage in ``inode.i_block`` can be used in different ways. In general,
- regular files and directories will use it for file block indexing
- information, and special files will use it for special purposes.
- Symbolic Links
- ~~~~~~~~~~~~~~
- The target of a symbolic link will be stored in this field if the target
- string is less than 60 bytes long. Otherwise, either extents or block
- maps will be used to allocate data blocks to store the link target.
- Direct/Indirect Block Addressing
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- In ext2/3, file block numbers were mapped to logical block numbers by
- means of an (up to) three level 1-1 block map. To find the logical block
- that stores a particular file block, the code would navigate through
- this increasingly complicated structure. Notice that there is neither a
- magic number nor a checksum to provide any level of confidence that the
- block isn't full of garbage.
- .. ifconfig:: builder != 'latex'
- .. include:: blockmap.rst
- .. ifconfig:: builder == 'latex'
- [Table omitted because LaTeX doesn't support nested tables.]
- Note that with this block mapping scheme, it is necessary to fill out a
- lot of mapping data even for a large contiguous file! This inefficiency
- led to the creation of the extent mapping scheme, discussed below.
- Notice also that a file using this mapping scheme cannot be placed
- higher than 2^32 blocks.
- Extent Tree
- ~~~~~~~~~~~
- 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
- requires an indirect block to map all 1,000 entries; with extents, the
- mapping is reduced to a single ``struct ext4_extent`` with
- ``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
- 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
- use.
- Extents are arranged as a tree. Each node of the tree begins with a
- ``struct ext4_extent_header``. If the node is an interior node
- (``eh.eh_depth`` > 0), the header is followed by ``eh.eh_entries``
- instances of ``struct ext4_extent_idx``; each of these index entries
- points to a block containing more nodes in the extent tree. If the node
- is a leaf node (``eh.eh_depth == 0``), then the header is followed by
- ``eh.eh_entries`` instances of ``struct ext4_extent``; these instances
- point to the file's data blocks. The root node of the extent tree is
- stored in ``inode.i_block``, which allows for the first four extents to
- be recorded without the use of extra metadata blocks.
- The extent tree header is recorded in ``struct ext4_extent_header``,
- which is 12 bytes long:
- .. list-table::
- :widths: 1 1 1 77
- :header-rows: 1
- * - Offset
- - Size
- - Name
- - Description
- * - 0x0
- - \_\_le16
- - eh\_magic
- - Magic number, 0xF30A.
- * - 0x2
- - \_\_le16
- - eh\_entries
- - Number of valid entries following the header.
- * - 0x4
- - \_\_le16
- - eh\_max
- - Maximum number of entries that could follow the header.
- * - 0x6
- - \_\_le16
- - eh\_depth
- - Depth of this extent node in the extent tree. 0 = this extent node
- 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
- block number can be at most ``2^32``, and the smallest ``n`` that
- satisfies ``4*(((blocksize - 12)/12)^n) >= 2^32`` is 5.
- * - 0x8
- - \_\_le32
- - eh\_generation
- - Generation of the tree. (Used by Lustre, but not standard ext4).
- Internal nodes of the extent tree, also known as index nodes, are
- recorded as ``struct ext4_extent_idx``, and are 12 bytes long:
- .. list-table::
- :widths: 1 1 1 77
- :header-rows: 1
- * - Offset
- - Size
- - Name
- - Description
- * - 0x0
- - \_\_le32
- - ei\_block
- - This index node covers file blocks from 'block' onward.
- * - 0x4
- - \_\_le32
- - ei\_leaf\_lo
- - 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
- internal node or a leaf node, described below.
- * - 0x8
- - \_\_le16
- - ei\_leaf\_hi
- - Upper 16-bits of the previous field.
- * - 0xA
- - \_\_u16
- - ei\_unused
- -
- Leaf nodes of the extent tree are recorded as ``struct ext4_extent``,
- and are also 12 bytes long:
- .. list-table::
- :widths: 1 1 1 77
- :header-rows: 1
- * - Offset
- - Size
- - Name
- - Description
- * - 0x0
- - \_\_le32
- - ee\_block
- - First file block number that this extent covers.
- * - 0x4
- - \_\_le16
- - ee\_len
- - 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,
- the extent is uninitialized and the actual extent length is ``ee_len`` -
- 32768. Therefore, the maximum length of a initialized extent is 32768
- blocks, and the maximum length of an uninitialized extent is 32767.
- * - 0x6
- - \_\_le16
- - ee\_start\_hi
- - Upper 16-bits of the block number to which this extent points.
- * - 0x8
- - \_\_le32
- - ee\_start\_lo
- - Lower 32-bits of the block number to which this extent points.
- Prior to the introduction of metadata checksums, the extent header +
- extent entries always left at least 4 bytes of unallocated space at the
- end of each extent tree data block (because (2^x % 12) >= 4). Therefore,
- the 32-bit checksum is inserted into this space. The 4 extents in the
- inode do not need checksumming, since the inode is already checksummed.
- The checksum is calculated against the FS UUID, the inode number, the
- inode generation, and the entire extent block leading up to (but not
- including) the checksum itself.
- ``struct ext4_extent_tail`` is 4 bytes long:
- .. list-table::
- :widths: 1 1 1 77
- :header-rows: 1
- * - Offset
- - Size
- - Name
- - Description
- * - 0x0
- - \_\_le32
- - eb\_checksum
- - Checksum of the extent block, crc32c(uuid+inum+igeneration+extentblock)
- Inline Data
- ~~~~~~~~~~~
- If the inline data feature is enabled for the filesystem and the flag is
- set for the inode, it is possible that the first 60 bytes of the file
- data are stored here.
|