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

checksums.rst (2934B)


      1.. SPDX-License-Identifier: GPL-2.0
      2
      3Checksums
      4---------
      5
      6Starting in early 2012, metadata checksums were added to all major ext4
      7and jbd2 data structures. The associated feature flag is metadata_csum.
      8The desired checksum algorithm is indicated in the superblock, though as
      9of October 2012 the only supported algorithm is crc32c. Some data
     10structures did not have space to fit a full 32-bit checksum, so only the
     11lower 16 bits are stored. Enabling the 64bit feature increases the data
     12structure size so that full 32-bit checksums can be stored for many data
     13structures. However, existing 32-bit filesystems cannot be extended to
     14enable 64bit mode, at least not without the experimental resize2fs
     15patches to do so.
     16
     17Existing filesystems can have checksumming added by running
     18``tune2fs -O metadata_csum`` against the underlying device. If tune2fs
     19encounters directory blocks that lack sufficient empty space to add a
     20checksum, it will request that you run ``e2fsck -D`` to have the
     21directories rebuilt with checksums. This has the added benefit of
     22removing slack space from the directory files and rebalancing the htree
     23indexes. If you _ignore_ this step, your directories will not be
     24protected by a checksum!
     25
     26The following table describes the data elements that go into each type
     27of checksum. The checksum function is whatever the superblock describes
     28(crc32c as of October 2013) unless noted otherwise.
     29
     30.. list-table::
     31   :widths: 20 8 50
     32   :header-rows: 1
     33
     34   * - Metadata
     35     - Length
     36     - Ingredients
     37   * - Superblock
     38     - __le32
     39     - The entire superblock up to the checksum field. The UUID lives inside
     40       the superblock.
     41   * - MMP
     42     - __le32
     43     - UUID + the entire MMP block up to the checksum field.
     44   * - Extended Attributes
     45     - __le32
     46     - UUID + the entire extended attribute block. The checksum field is set to
     47       zero.
     48   * - Directory Entries
     49     - __le32
     50     - UUID + inode number + inode generation + the directory block up to the
     51       fake entry enclosing the checksum field.
     52   * - HTREE Nodes
     53     - __le32
     54     - UUID + inode number + inode generation + all valid extents + HTREE tail.
     55       The checksum field is set to zero.
     56   * - Extents
     57     - __le32
     58     - UUID + inode number + inode generation + the entire extent block up to
     59       the checksum field.
     60   * - Bitmaps
     61     - __le32 or __le16
     62     - UUID + the entire bitmap. Checksums are stored in the group descriptor,
     63       and truncated if the group descriptor size is 32 bytes (i.e. ^64bit)
     64   * - Inodes
     65     - __le32
     66     - UUID + inode number + inode generation + the entire inode. The checksum
     67       field is set to zero. Each inode has its own checksum.
     68   * - Group Descriptors
     69     - __le16
     70     - If metadata_csum, then UUID + group number + the entire descriptor;
     71       else if gdt_csum, then crc16(UUID + group number + the entire
     72       descriptor). In all cases, only the lower 16 bits are stored.
     73