linux/Documentation/filesystems/ext4/checksums.rst
<<
>>
Prefs
   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
  74