cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ifork.rst (6501B)


      1.. SPDX-License-Identifier: GPL-2.0
      2
      3The Contents of inode.i_block
      4------------------------------
      5
      6Depending on the type of file an inode describes, the 60 bytes of
      7storage in ``inode.i_block`` can be used in different ways. In general,
      8regular files and directories will use it for file block indexing
      9information, and special files will use it for special purposes.
     10
     11Symbolic Links
     12~~~~~~~~~~~~~~
     13
     14The target of a symbolic link will be stored in this field if the target
     15string is less than 60 bytes long. Otherwise, either extents or block
     16maps will be used to allocate data blocks to store the link target.
     17
     18Direct/Indirect Block Addressing
     19~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     20
     21In ext2/3, file block numbers were mapped to logical block numbers by
     22means of an (up to) three level 1-1 block map. To find the logical block
     23that stores a particular file block, the code would navigate through
     24this increasingly complicated structure. Notice that there is neither a
     25magic number nor a checksum to provide any level of confidence that the
     26block isn't full of garbage.
     27
     28.. ifconfig:: builder != 'latex'
     29
     30   .. include:: blockmap.rst
     31
     32.. ifconfig:: builder == 'latex'
     33
     34   [Table omitted because LaTeX doesn't support nested tables.]
     35
     36Note that with this block mapping scheme, it is necessary to fill out a
     37lot of mapping data even for a large contiguous file! This inefficiency
     38led to the creation of the extent mapping scheme, discussed below.
     39
     40Notice also that a file using this mapping scheme cannot be placed
     41higher than 2^32 blocks.
     42
     43Extent Tree
     44~~~~~~~~~~~
     45
     46In ext4, the file to logical block map has been replaced with an extent
     47tree. Under the old scheme, allocating a contiguous run of 1,000 blocks
     48requires an indirect block to map all 1,000 entries; with extents, the
     49mapping is reduced to a single ``struct ext4_extent`` with
     50``ee_len = 1000``. If flex_bg is enabled, it is possible to allocate
     51very large files with a single extent, at a considerable reduction in
     52metadata block use, and some improvement in disk efficiency. The inode
     53must have the extents flag (0x80000) flag set for this feature to be in
     54use.
     55
     56Extents are arranged as a tree. Each node of the tree begins with a
     57``struct ext4_extent_header``. If the node is an interior node
     58(``eh.eh_depth`` > 0), the header is followed by ``eh.eh_entries``
     59instances of ``struct ext4_extent_idx``; each of these index entries
     60points to a block containing more nodes in the extent tree. If the node
     61is a leaf node (``eh.eh_depth == 0``), then the header is followed by
     62``eh.eh_entries`` instances of ``struct ext4_extent``; these instances
     63point to the file's data blocks. The root node of the extent tree is
     64stored in ``inode.i_block``, which allows for the first four extents to
     65be recorded without the use of extra metadata blocks.
     66
     67The extent tree header is recorded in ``struct ext4_extent_header``,
     68which is 12 bytes long:
     69
     70.. list-table::
     71   :widths: 8 8 24 40
     72   :header-rows: 1
     73
     74   * - Offset
     75     - Size
     76     - Name
     77     - Description
     78   * - 0x0
     79     - __le16
     80     - eh_magic
     81     - Magic number, 0xF30A.
     82   * - 0x2
     83     - __le16
     84     - eh_entries
     85     - Number of valid entries following the header.
     86   * - 0x4
     87     - __le16
     88     - eh_max
     89     - Maximum number of entries that could follow the header.
     90   * - 0x6
     91     - __le16
     92     - eh_depth
     93     - Depth of this extent node in the extent tree. 0 = this extent node
     94       points to data blocks; otherwise, this extent node points to other
     95       extent nodes. The extent tree can be at most 5 levels deep: a logical
     96       block number can be at most ``2^32``, and the smallest ``n`` that
     97       satisfies ``4*(((blocksize - 12)/12)^n) >= 2^32`` is 5.
     98   * - 0x8
     99     - __le32
    100     - eh_generation
    101     - Generation of the tree. (Used by Lustre, but not standard ext4).
    102
    103Internal nodes of the extent tree, also known as index nodes, are
    104recorded as ``struct ext4_extent_idx``, and are 12 bytes long:
    105
    106.. list-table::
    107   :widths: 8 8 24 40
    108   :header-rows: 1
    109
    110   * - Offset
    111     - Size
    112     - Name
    113     - Description
    114   * - 0x0
    115     - __le32
    116     - ei_block
    117     - This index node covers file blocks from 'block' onward.
    118   * - 0x4
    119     - __le32
    120     - ei_leaf_lo
    121     - Lower 32-bits of the block number of the extent node that is the next
    122       level lower in the tree. The tree node pointed to can be either another
    123       internal node or a leaf node, described below.
    124   * - 0x8
    125     - __le16
    126     - ei_leaf_hi
    127     - Upper 16-bits of the previous field.
    128   * - 0xA
    129     - __u16
    130     - ei_unused
    131     -
    132
    133Leaf nodes of the extent tree are recorded as ``struct ext4_extent``,
    134and are also 12 bytes long:
    135
    136.. list-table::
    137   :widths: 8 8 24 40
    138   :header-rows: 1
    139
    140   * - Offset
    141     - Size
    142     - Name
    143     - Description
    144   * - 0x0
    145     - __le32
    146     - ee_block
    147     - First file block number that this extent covers.
    148   * - 0x4
    149     - __le16
    150     - ee_len
    151     - Number of blocks covered by extent. If the value of this field is <=
    152       32768, the extent is initialized. If the value of the field is > 32768,
    153       the extent is uninitialized and the actual extent length is ``ee_len`` -
    154       32768. Therefore, the maximum length of a initialized extent is 32768
    155       blocks, and the maximum length of an uninitialized extent is 32767.
    156   * - 0x6
    157     - __le16
    158     - ee_start_hi
    159     - Upper 16-bits of the block number to which this extent points.
    160   * - 0x8
    161     - __le32
    162     - ee_start_lo
    163     - Lower 32-bits of the block number to which this extent points.
    164
    165Prior to the introduction of metadata checksums, the extent header +
    166extent entries always left at least 4 bytes of unallocated space at the
    167end of each extent tree data block (because (2^x % 12) >= 4). Therefore,
    168the 32-bit checksum is inserted into this space. The 4 extents in the
    169inode do not need checksumming, since the inode is already checksummed.
    170The checksum is calculated against the FS UUID, the inode number, the
    171inode generation, and the entire extent block leading up to (but not
    172including) the checksum itself.
    173
    174``struct ext4_extent_tail`` is 4 bytes long:
    175
    176.. list-table::
    177   :widths: 8 8 24 40
    178   :header-rows: 1
    179
    180   * - Offset
    181     - Size
    182     - Name
    183     - Description
    184   * - 0x0
    185     - __le32
    186     - eb_checksum
    187     - Checksum of the extent block, crc32c(uuid+inum+igeneration+extentblock)
    188
    189Inline Data
    190~~~~~~~~~~~
    191
    192If the inline data feature is enabled for the filesystem and the flag is
    193set for the inode, it is possible that the first 60 bytes of the file
    194data are stored here.